From 7c4773609fffd3b4589c1f3a59ab08cb239c98b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Otto=20Kek=C3=A4l=C3=A4inen?= Date: Mon, 2 Jul 2018 00:53:03 +0300 Subject: [PATCH] New upstream version 10.1.34 --- .gitattributes | 1 + .gitignore | 7 + CMakeLists.txt | 5 + CREDITS | 3 +- Docs/INFO_SRC | 10 +- VERSION | 2 +- client/mysql.cc | 26 +- client/mysql_upgrade.c | 6 +- client/mysqladmin.cc | 7 +- client/mysqlbinlog.cc | 4 +- client/mysqlcheck.c | 5 +- client/mysqldump.c | 18 +- client/mysqlimport.c | 3 +- client/mysqlshow.c | 3 +- client/mysqlslap.c | 10 +- client/mysqltest.cc | 20 +- cmake/check_compiler_flag.cmake | 14 +- cmake/ctest.cmake | 2 +- cmake/maintainer.cmake | 64 +- cmake/wsrep.cmake | 2 +- configure.cmake | 3 + extra/mariabackup/CMakeLists.txt | 7 +- extra/mariabackup/backup_copy.cc | 6 +- extra/mariabackup/backup_mysql.cc | 44 +- extra/mariabackup/common.h | 4 +- extra/mariabackup/datasink.c | 2 +- extra/mariabackup/datasink.h | 2 +- extra/mariabackup/ds_buffer.c | 6 +- extra/mariabackup/ds_compress.c | 4 +- extra/mariabackup/ds_local.c | 151 --- extra/mariabackup/ds_local.cc | 259 ++++ extra/mariabackup/ds_local.h | 8 +- extra/mariabackup/ds_stdout.c | 4 +- extra/mariabackup/ds_tmpfile.c | 4 +- extra/mariabackup/ds_xbstream.c | 4 +- extra/mariabackup/innobackupex.cc | 2 +- extra/mariabackup/xbcloud.cc | 4 +- extra/mariabackup/xtrabackup.cc | 130 +- extra/my_print_defaults.c | 6 +- extra/yassl/src/handshake.cpp | 10 + include/heap.h | 1 + include/my_default.h | 7 + include/my_global.h | 7 + .../{my_systemd.h => my_service_manager.h} | 11 +- include/my_sys.h | 1 + include/my_valgrind.h | 2 + include/mysql/psi/mysql_socket.h | 6 + include/mysql_com.h | 2 +- include/sql_common.h | 2 +- .../rpl_tests/rpl_implicit_commit_binlog.test | 426 ++---- mysql-test/include/galera_wait_ready.inc | 34 +- .../include/innodb_row_format.combinations | 8 + mysql-test/include/innodb_row_format.inc | 4 + mysql-test/include/maybe_debug.combinations | 5 + mysql-test/include/maybe_debug.inc | 3 + mysql-test/include/restart_mysqld.inc | 3 - mysql-test/include/start_mysqld.inc | 3 - mysql-test/include/wait_condition.inc | 2 +- .../include/wait_until_connected_again.inc | 8 +- mysql-test/lib/My/SafeProcess/Base.pm | 12 +- mysql-test/lib/My/SafeProcess/safe_process.cc | 14 +- mysql-test/lib/My/Tee.pm | 25 + mysql-test/mysql-test-run.pl | 95 +- mysql-test/r/alter_table.result | 83 ++ mysql-test/r/analyze_stmt_orderby.result | 2 +- mysql-test/r/assign_key_cache.result | 13 + ...5.result => assign_key_cache_debug.result} | 0 mysql-test/r/connect.result | 9 +- mysql-test/r/connect_debug.result | 5 + mysql-test/r/contributors.result | 3 +- mysql-test/r/create_or_replace.result | 20 + mysql-test/r/ctype_latin1.result | 13 + mysql-test/r/ctype_ucs.result | 31 + mysql-test/r/ctype_utf8.result | 13 + mysql-test/r/ctype_utf8mb4.result | 23 + mysql-test/r/dyncol.result | 10 + .../r/fast_prefix_index_fetch_innodb.result | 361 +++++- mysql-test/r/func_date_add.result | 51 + mysql-test/r/func_misc.result | 11 + mysql-test/r/func_str.result | 37 + mysql-test/r/func_time.result | 24 + mysql-test/r/grant.result | 5 - mysql-test/r/grant2.result | 3 +- mysql-test/r/grant_not_windows.result | 8 + mysql-test/r/having.result | 14 + mysql-test/r/implicit_commit.result | 4 +- mysql-test/r/information_schema.result | 2 +- mysql-test/r/insert_select.result | 9 + mysql-test/r/join_outer.result | 18 +- mysql-test/r/join_outer_jcl6.result | 18 +- mysql-test/r/limit.result | 16 + mysql-test/r/lock.result | 2 +- mysql-test/r/mdev375.result | 2 +- mysql-test/r/myisam.result | 15 +- mysql-test/r/myisam_recover.result | 3 +- mysql-test/r/mysqld--help,win.rdiff | 4 +- mysql-test/r/mysqld--help.result | 6 +- mysql-test/r/mysqldump.result | 15 + mysql-test/r/mysqlslap.result | 3 + mysql-test/r/olap.result | 22 + mysql-test/r/parser.result | 7 + mysql-test/r/perror.result | 2 +- mysql-test/r/ps.result | 44 +- mysql-test/r/ps_qc_innodb.result | 23 + mysql-test/r/rename.result | 66 + mysql-test/r/selectivity.result | 70 +- mysql-test/r/selectivity_innodb.result | 70 +- mysql-test/r/sp-destruct.result | 6 + mysql-test/r/sp-innodb.result | 34 + mysql-test/r/sp.result | 13 +- mysql-test/r/statistics.result | 18 + mysql-test/r/statistics_close.result | 6 + mysql-test/r/subselect4.result | 31 + mysql-test/r/subselect_mat.result | 15 + mysql-test/r/subselect_mat_cost_bugs.result | 2 +- mysql-test/r/subselect_sj.result | 26 + mysql-test/r/subselect_sj2_mat.result | 57 + mysql-test/r/subselect_sj_jcl6.result | 26 + mysql-test/r/subselect_sj_nonmerged.result | 6 +- mysql-test/r/trigger.result | 13 +- mysql-test/r/type_time.result | 31 + mysql-test/r/type_time_6065.result | 44 + mysql-test/r/variables.result | 7 +- mysql-test/r/view.result | 305 +++-- mysql-test/std_data/binlog-header.log | Bin 120 -> 0 bytes mysql-test/suite.pm | 6 + .../encryption/r/innodb-bad-key-change.result | 56 +- .../r/innodb-bad-key-change2.result | 5 +- .../r/innodb-bad-key-change4.result | 2 +- .../r/innodb-compressed-blob.result | 3 +- .../encryption/r/innodb-discard-import.result | 6 + .../r/innodb-encryption-disable.result | 3 +- .../encryption/r/innodb-force-corrupt.result | 8 +- .../encryption/r/innodb-missing-key.result | 4 +- .../encryption/r/innodb-redo-badkey.result | 17 +- .../encryption/r/innodb-redo-nokeys.result | 13 +- .../r/innodb-remove-encryption.result | 41 + .../innodb_encryption-page-compression.result | 29 +- .../r/innodb_encryption_discard_import.result | 2 + .../r/innodb_encryption_filekeys.result | 24 +- .../suite/encryption/r/tempfiles.result | 69 +- .../encryption/t/innodb-bad-key-change.test | 51 +- .../encryption/t/innodb-bad-key-change2.test | 5 +- .../encryption/t/innodb-bad-key-change4.test | 2 +- .../encryption/t/innodb-compressed-blob.test | 3 +- .../encryption/t/innodb-discard-import.test | 32 +- .../t/innodb-encryption-disable.test | 3 +- .../encryption/t/innodb-force-corrupt.test | 8 +- .../encryption/t/innodb-missing-key.test | 4 +- .../encryption/t/innodb-redo-badkey.test | 17 +- .../encryption/t/innodb-redo-nokeys.test | 13 +- .../t/innodb-remove-encryption.test | 59 + .../t/innodb_encryption-page-compression.test | 37 +- .../t/innodb_encryption_discard_import.test | 27 +- .../t/innodb_encryption_filekeys.test | 35 +- .../suite/encryption/t/tempfiles.combinations | 5 + mysql-test/suite/encryption/t/tempfiles.opt | 1 + mysql-test/suite/encryption/t/tempfiles.test | 24 +- .../suite/federated/have_federatedx.inc | 2 +- .../suite/funcs_1/r/is_engines_archive.result | 2 +- .../suite/funcs_1/r/is_engines_csv.result | 2 +- .../funcs_1/r/is_engines_federated.result | 2 +- .../suite/funcs_1/r/is_engines_myisam.result | 2 +- mysql-test/suite/galera/disabled.def | 53 +- .../galera/galera_2nodes_as_master_slave.cnf | 83 -- ...lera_2nodes_as_master_with_repl_filter.cnf | 87 -- .../galera/include/galera_load_provider.inc | 4 +- .../include/galera_sst_set_mysqldump.inc | 5 +- .../galera/include/galera_st_clean_slave.inc | 4 +- .../galera/include/galera_st_kill_slave.inc | 5 +- .../include/galera_st_kill_slave_ddl.inc | 7 +- .../include/galera_st_shutdown_slave.inc | 4 +- .../suite/galera/include/have_mariabackup.inc | 4 + .../include/have_wsrep_replicate_myisam.inc | 4 + .../suite/galera/include/have_xtrabackup.inc | 4 + .../suite/galera/include/kill_galera.inc | 1 - .../suite/galera/include/start_mysqld.inc | 9 +- mysql-test/suite/galera/r/MW-284.result | 3 + mysql-test/suite/galera/r/MW-329.result | 1 + mysql-test/suite/galera/r/MW-336.result | 9 - mysql-test/suite/galera/r/MW-416.result | 114 ++ mysql-test/suite/galera/r/MW-44.result | 17 + mysql-test/suite/galera/r/galera#500.result | 10 + .../suite/galera/r/galera_as_master.result | 1 + .../r/galera_bf_abort_for_update.result | 23 +- .../suite/galera/r/galera_defaults.result | 5 +- .../galera/r/galera_encrypt_tmp_files.result | 35 + .../suite/galera/r/galera_gra_log.result | 15 +- .../suite/galera/r/galera_gtid_slave.result | 2 +- .../galera/r/galera_ist_mysqldump.result | 5 +- .../galera/r/galera_kill_nochanges.result | 2 + .../suite/galera/r/galera_lock_table.result | 4 + .../suite/galera/r/galera_mdev_15611.result | 15 + .../galera/r/galera_parallel_simple.result | 4 + .../galera/r/galera_schema_dirty_reads.result | 13 + .../r/galera_sst_mariabackup,debug.rdiff | 103 ++ .../galera/r/galera_sst_mariabackup.result | 262 ++++ .../galera/r/galera_sst_mysqldump,debug.rdiff | 106 ++ .../galera/r/galera_sst_mysqldump.result | 98 +- .../r/galera_sst_mysqldump_with_key.result | 4 +- .../galera/r/galera_sst_rsync,debug.rdiff | 103 ++ .../suite/galera/r/galera_sst_rsync.result | 97 -- .../r/galera_sst_xtrabackup-v2,debug.rdiff | 103 ++ .../galera/r/galera_sst_xtrabackup-v2.result | 97 -- .../galera/r/galera_suspend_slave.result | 4 +- .../galera/r/galera_toi_ddl_fk_insert.result | 2 +- .../r/galera_var_auto_inc_control_on.result | 6 +- .../r/galera_var_cluster_address.result | 3 +- .../galera/r/galera_var_dirty_reads.result | 7 +- .../galera/r/galera_var_node_address.result | 1 + .../galera/r/galera_var_reject_queries.result | 21 + .../r/galera_var_retry_autocommit.result | 70 +- .../galera/r/galera_var_slave_threads.result | 16 +- .../r/galera_wsrep_desync_wsrep_on.result | 3 + .../r/have_wsrep_replicate_myisam.require | 2 + mysql-test/suite/galera/r/lp1376747-2.result | 3 + mysql-test/suite/galera/r/lp1376747.result | 3 + .../suite/galera/r/mysql-wsrep#33.result | 5 +- .../suite/galera/r/mysql-wsrep#90.result | 2 + mysql-test/suite/galera/r/pxc-421.result | 3 - mysql-test/suite/galera/suite.pm | 30 +- mysql-test/suite/galera/t/MW-284.test | 9 +- mysql-test/suite/galera/t/MW-286.test | 1 - mysql-test/suite/galera/t/MW-329.test | 2 + mysql-test/suite/galera/t/MW-336.test | 19 +- mysql-test/suite/galera/t/MW-416.test | 134 ++ mysql-test/suite/galera/t/MW-44.test | 10 + mysql-test/suite/galera/t/galera#500.test | 38 + .../suite/galera/t/galera_as_master.test | 6 +- .../t/galera_autoinc_sst_xtrabackup.test | 1 + .../galera/t/galera_bf_abort_for_update.test | 45 +- .../galera/t/galera_concurrent_ctas.test | 6 +- .../suite/galera/t/galera_defaults.test | 1 + .../galera/t/galera_encrypt_tmp_files.cnf | 8 + .../galera/t/galera_encrypt_tmp_files.test | 57 + .../suite/galera/t/galera_flush_local.opt | 4 +- .../suite/galera/t/galera_flush_local.test | 1 + .../t/galera_gcache_recover_manytrx.test | 13 +- .../suite/galera/t/galera_gcs_fragment.test | 8 + mysql-test/suite/galera/t/galera_gra_log.test | 16 +- .../suite/galera/t/galera_gtid_slave.test | 19 +- .../suite/galera/t/galera_ist_mysqldump.test | 5 + .../galera/t/galera_ist_xtrabackup-v2.test | 1 + .../suite/galera/t/galera_kill_nochanges.test | 8 + .../suite/galera/t/galera_lock_table.test | 7 + .../suite/galera/t/galera_many_tables_pk.test | 4 +- .../suite/galera/t/galera_mdev_15611.cnf | 5 + .../suite/galera/t/galera_mdev_15611.test | 30 + .../galera/t/galera_parallel_simple.test | 7 + .../suite/galera/t/galera_pc_ignore_sb.test | 5 +- .../galera/t/galera_schema_dirty_reads.test | 13 + .../suite/galera/t/galera_sst_mariabackup.cnf | 16 + .../galera/t/galera_sst_mariabackup.test | 20 + .../suite/galera/t/galera_sst_mysqldump.test | 6 +- .../t/galera_sst_mysqldump_with_key.cnf | 4 - .../t/galera_sst_mysqldump_with_key.test | 14 +- .../suite/galera/t/galera_sst_rsync.test | 6 +- .../t/galera_sst_xtrabackup-v2-options.cnf | 3 +- .../t/galera_sst_xtrabackup-v2-options.test | 2 +- .../galera/t/galera_sst_xtrabackup-v2.cnf | 2 + .../galera/t/galera_sst_xtrabackup-v2.test | 1 + ...era_sst_xtrabackup-v2_encrypt_with_key.cnf | 1 + ...ra_sst_xtrabackup-v2_encrypt_with_key.test | 1 + .../suite/galera/t/galera_suspend_slave.test | 9 +- .../galera/t/galera_toi_ddl_fk_insert.test | 2 +- .../t/galera_toi_ddl_nonconflicting.test | 11 + .../t/galera_var_auto_inc_control_on.opt | 1 + .../t/galera_var_auto_inc_control_on.test | 20 +- .../galera/t/galera_var_cluster_address.test | 1 - .../galera/t/galera_var_dirty_reads.test | 9 +- .../galera/t/galera_var_node_address.test | 1 + .../galera/t/galera_var_reject_queries.test | 44 + .../galera/t/galera_var_retry_autocommit.test | 133 +- .../galera/t/galera_var_slave_threads.test | 35 +- .../t/galera_wsrep_desync_wsrep_on.test | 2 + mysql-test/suite/galera/t/lp1376747-2.test | 7 + mysql-test/suite/galera/t/lp1376747.test | 7 + mysql-test/suite/galera/t/mysql-wsrep#33.test | 10 +- mysql-test/suite/galera/t/mysql-wsrep#90.test | 2 + mysql-test/suite/galera/t/pxc-421.test | 12 +- .../r/galera_evs_suspect_timeout.result | 1 + .../t/galera_evs_suspect_timeout.test | 1 + .../galera_3nodes/t/galera_pc_weight.test | 5 - mysql-test/suite/handler/handler.inc | 2 + mysql-test/suite/handler/interface.result | 2 +- mysql-test/suite/handler/interface.test | 2 +- mysql-test/suite/handler/ps.result | 9 + mysql-test/suite/handler/ps.test | 11 + .../innodb/r/alter_partitioned_xa.result | 15 + .../suite/innodb/r/create-index-debug.result | 3 - .../innodb/r/default_row_format_alter.result | 85 ++ .../r/default_row_format_compatibility.result | 103 ++ .../r/default_row_format_create,dynamic.rdiff | 11 + .../default_row_format_create,redundant.rdiff | 11 + .../innodb/r/default_row_format_create.result | 31 + .../innodb/r/file_format_defaults.result | 56 + .../innodb/r/innodb-alter-nullable.result | 4 + mysql-test/suite/innodb/r/innodb-alter.result | 29 + mysql-test/suite/innodb/r/innodb-blob.result | 1 + .../r/innodb-page_compression_default.result | 1 - .../r/innodb-page_compression_snappy.result | 1 - .../suite/innodb/r/innodb_bug27216817.result | 24 + .../suite/innodb/r/innodb_bug54044.result | 6 - .../innodb/r/innodb_defragment_small.result | 21 +- mysql-test/suite/innodb/r/lock_deleted.result | 40 + mysql-test/suite/innodb/r/mvcc.result | 26 + .../r/read_only_recover_committed.result | 43 + .../suite/innodb/r/recovery_shutdown.result | 2 +- mysql-test/suite/innodb/r/rename_table.result | 5 + mysql-test/suite/innodb/r/restart.result | 26 + .../suite/innodb/t/alter_partitioned_xa.test | 31 + .../innodb/t/default_row_format_alter.test | 98 ++ .../t/default_row_format_compatibility.test | 174 +++ .../innodb/t/default_row_format_create.test | 28 + .../innodb/t/file_format_defaults-master.opt | 1 + .../suite/innodb/t/file_format_defaults.test | 73 ++ .../suite/innodb/t/innodb-alter-nullable.test | 5 + mysql-test/suite/innodb/t/innodb-alter.test | 21 + mysql-test/suite/innodb/t/innodb-blob.test | 4 +- .../suite/innodb/t/innodb-mdev7046.test | 7 +- .../t/innodb-page_compression_default.test | 2 - .../t/innodb-page_compression_snappy.test | 2 - .../suite/innodb/t/innodb_bug54044.test | 10 - .../innodb/t/innodb_defragment_small.test | 23 +- mysql-test/suite/innodb/t/lock_deleted.test | 72 ++ mysql-test/suite/innodb/t/log_file_size.test | 3 +- mysql-test/suite/innodb/t/mvcc.test | 52 + .../innodb/t/read_only_recover_committed.test | 68 + .../suite/innodb/t/recovery_shutdown.test | 6 +- mysql-test/suite/innodb/t/rename_table.test | 11 + mysql-test/suite/innodb/t/restart.test | 78 ++ .../{innodb-fts-basic.result => basic.result} | 34 + .../t/{innodb-fts-basic.test => basic.test} | 39 +- .../innodb_zip/r/innodb-create-options.result | 34 +- .../suite/innodb_zip/r/innodb-zip.result | 19 +- .../innodb_zip/t/innodb-create-options.test | 14 +- mysql-test/suite/innodb_zip/t/innodb-zip.test | 9 +- mysql-test/suite/maria/alter.result | 16 + mysql-test/suite/maria/alter.test | 17 + mysql-test/suite/maria/dynamic.result | 4 + mysql-test/suite/maria/dynamic.test | 7 + mysql-test/suite/maria/lock.result | 10 + mysql-test/suite/maria/lock.test | 12 + mysql-test/suite/maria/maria.result | 8 + mysql-test/suite/maria/maria.test | 13 + .../mariabackup/absolute_ibdata_paths.opt | 1 + .../mariabackup/absolute_ibdata_paths.result | 10 + .../mariabackup/absolute_ibdata_paths.test | 31 + .../suite/mariabackup/backup_ssl.result | 9 + mysql-test/suite/mariabackup/backup_ssl.test | 16 + .../suite/mariabackup/undo_space_id.opt | 2 + .../suite/mariabackup/undo_space_id.result | 13 + .../suite/mariabackup/undo_space_id.test | 25 + .../suite/parts/inc/part_alter_values.inc | 10 + mysql-test/suite/parts/r/longname.result | 9 - .../parts/r/partition_alter_innodb.result | 6 + .../parts/r/partition_alter_maria.result | 15 + .../parts/r/partition_alter_myisam.result | 6 + .../r/partition_basic_symlink_innodb.result | 193 +++ .../suite/parts/t/partition_alter_maria.test | 7 + .../suite/parts/t/partition_alter_myisam.test | 1 + .../t/partition_basic_symlink_innodb.test | 143 ++- .../r/hostcache_ipv4_max_con.result | 2 +- .../r/hostcache_ipv6_max_con.result | 2 +- .../suite/perfschema/r/partition.result | 10 + .../perfschema/t/hostcache_ipv4_max_con.test | 17 +- .../perfschema/t/hostcache_ipv6_max_con.test | 17 +- mysql-test/suite/perfschema/t/partition.test | 15 + mysql-test/suite/plugins/r/processlist.result | 8 + .../suite/plugins/r/server_audit.result | 12 + mysql-test/suite/plugins/t/processlist.test | 18 + mysql-test/suite/plugins/t/server_audit.test | 9 + mysql-test/suite/rpl/r/rename.result | 34 + .../r/rpl_mixed_implicit_commit_binlog.result | 528 ++------ .../rpl/r/rpl_parallel_optimistic.result | 23 + .../r/rpl_row_implicit_commit_binlog.result | 523 ++------ .../rpl/r/rpl_semi_sync_skip_repl.result | 23 + .../r/rpl_stm_implicit_commit_binlog.result | 515 ++------ mysql-test/suite/rpl/t/rename.test | 33 + .../suite/rpl/t/rpl_parallel_optimistic.test | 64 +- .../suite/rpl/t/rpl_semi_sync_skip_repl.test | 62 + .../r/innodb_default_row_format_basic.result | 48 + .../sys_vars/r/max_connections_basic.result | 20 +- .../r/max_prepared_stmt_count_basic.result | 20 +- .../r/sysvars_innodb,32bit,xtradb.rdiff | 217 ++-- .../sys_vars/r/sysvars_innodb,xtradb.rdiff | 49 +- .../suite/sys_vars/r/sysvars_innodb.result | 16 +- .../sys_vars/r/sysvars_server_embedded.result | 12 +- .../r/sysvars_server_notembedded.result | 12 +- .../suite/sys_vars/r/sysvars_wsrep.result | 14 + .../sys_vars/r/table_open_cache_basic.result | 24 +- .../r/wsrep_sst_receive_address_basic.result | 4 - .../t/innodb_default_row_format_basic.test | 41 + .../t/max_prepared_stmt_count_basic.test | 4 +- .../suite/sys_vars/t/sysvars_innodb.opt | 1 + .../sys_vars/t/sysvars_server_embedded.opt | 1 + .../sys_vars/t/sysvars_server_notembedded.opt | 1 + .../t/wsrep_sst_receive_address_basic.test | 4 - mysql-test/suite/unit/suite.pm | 2 +- mysql-test/suite/wsrep/r/variables.result | 7 + mysql-test/suite/wsrep/t/variables.test | 14 + mysql-test/t/alter_table.test | 46 + mysql-test/t/assign_key_cache.test | 13 + ...-5405.test => assign_key_cache_debug.test} | 0 mysql-test/t/connect.test | 18 +- mysql-test/t/connect_debug.test | 12 + mysql-test/t/create_or_replace.test | 25 + mysql-test/t/ctype_latin1.test | 9 + mysql-test/t/ctype_ucs.test | 22 + mysql-test/t/ctype_utf8.test | 10 + mysql-test/t/ctype_utf8mb4.test | 19 + mysql-test/t/dyncol.test | 9 + .../t/fast_prefix_index_fetch_innodb.test | 664 ++++++++-- mysql-test/t/func_date_add.test | 37 + mysql-test/t/func_misc.test | 11 + mysql-test/t/func_str.test | 35 + mysql-test/t/func_time.test | 16 + mysql-test/t/grant.test | 8 - mysql-test/t/grant2.test | 3 +- mysql-test/t/grant_not_windows.test | 14 + mysql-test/t/having.test | 18 + mysql-test/t/insert_select.test | 10 + mysql-test/t/join_outer.test | 18 +- mysql-test/t/limit.test | 14 + mysql-test/t/lock.test | 2 +- mysql-test/t/mdev375.test | 11 +- mysql-test/t/myisam.test | 20 +- mysql-test/t/myisam_recover.test | 3 +- mysql-test/t/mysql.test | 16 +- mysql-test/t/mysql_cp932.test | 42 +- mysql-test/t/mysqldump.test | 22 + mysql-test/t/mysqlslap.test | 8 + mysql-test/t/mysqltest.test | 2 +- mysql-test/t/olap.test | 23 + mysql-test/t/parser.test | 9 + mysql-test/t/ps.test | 55 + mysql-test/t/ps_qc_innodb.test | 35 + mysql-test/t/rename.test | 46 + mysql-test/t/selectivity.test | 18 + mysql-test/t/sp-destruct.test | 10 + mysql-test/t/sp-innodb.test | 42 + mysql-test/t/sp.test | 17 +- mysql-test/t/statistics.test | 19 + mysql-test/t/statistics_close.test | 18 + mysql-test/t/subselect4.test | 31 + mysql-test/t/subselect_mat.test | 13 + mysql-test/t/subselect_sj.test | 30 + mysql-test/t/subselect_sj2_mat.test | 42 + mysql-test/t/trigger.test | 14 +- mysql-test/t/type_time.test | 23 + mysql-test/t/type_time_6065.test | 23 + mysql-test/t/variables.test | 3 +- mysql-test/t/view.test | 308 +++-- mysql-test/unstable-tests | 262 ++-- mysys/lf_hash.c | 8 +- mysys/ma_dyncol.c | 2 +- mysys/mf_iocache.c | 2 +- mysys/my_addr_resolve.c | 2 +- mysys/my_default.c | 14 +- mysys/my_symlink.c | 2 +- pcre/AUTHORS | 6 +- pcre/ChangeLog | 53 + pcre/INSTALL | 320 +++-- pcre/LICENCE | 6 +- pcre/NEWS | 6 + pcre/NON-AUTOTOOLS-BUILD | 15 +- pcre/configure.ac | 26 +- pcre/doc/html/NON-AUTOTOOLS-BUILD.txt | 15 +- pcre/pcre.h.in | 8 +- pcre/pcre_compile.c | 2 +- pcre/pcre_dfa_exec.c | 4 +- pcre/pcre_exec.c | 8 +- pcre/pcre_jit_compile.c | 407 ++++-- pcre/pcregrep.c | 55 +- pcre/pcreposix.c | 6 +- pcre/testdata/testinput2 | 8 + pcre/testdata/testinput5 | 6 + pcre/testdata/testoutput2 | 16 + pcre/testdata/testoutput5 | 8 + plugin/auth_pam/mapper/pam_user_map.c | 84 +- plugin/disks/CMakeLists.txt | 5 + plugin/disks/README.txt | 86 ++ plugin/disks/information_schema_disks.cc | 155 +++ plugin/disks/mysql-test/disks/disks.result | 12 + plugin/disks/mysql-test/disks/disks.test | 2 + plugin/disks/mysql-test/disks/suite.opt | 1 + plugin/disks/mysql-test/disks/suite.pm | 10 + plugin/server_audit/server_audit.c | 29 +- scripts/CMakeLists.txt | 17 +- scripts/wsrep_sst_common.sh | 39 +- scripts/wsrep_sst_mariabackup.sh | 18 +- scripts/wsrep_sst_mysqldump.sh | 17 +- scripts/wsrep_sst_xtrabackup-v2.sh | 21 +- scripts/wsrep_sst_xtrabackup.sh | 19 +- sql-common/client.c | 41 +- sql/contributors.h | 3 +- sql/events.cc | 8 +- sql/field.cc | 7 + sql/handler.cc | 64 +- sql/handler.h | 2 +- sql/item.cc | 60 +- sql/item.h | 8 + sql/item_cmpfunc.cc | 42 +- sql/item_cmpfunc.h | 17 + sql/item_func.cc | 3 + sql/item_func.h | 12 +- sql/item_row.cc | 1 + sql/item_strfunc.cc | 2 +- sql/item_strfunc.h | 7 +- sql/item_subselect.cc | 2 +- sql/item_sum.cc | 3 + sql/item_timefunc.cc | 14 +- sql/log.cc | 8 +- sql/log_event.cc | 104 +- sql/log_event_old.cc | 10 +- sql/mdl.cc | 2 +- sql/mf_iocache_encr.cc | 9 +- sql/mysql_install_db.cc | 2 +- sql/mysql_upgrade_service.cc | 20 +- sql/mysqld.cc | 117 +- sql/mysqld.h | 2 +- sql/opt_subselect.cc | 35 +- sql/partition_info.cc | 33 +- sql/set_var.h | 11 + sql/share/errmsg-utf8.txt | 4 +- sql/slave.cc | 8 +- sql/sp.cc | 6 +- sql/sp_head.cc | 10 +- sql/sql_acl.cc | 3 +- sql/sql_admin.cc | 22 +- sql/sql_alter.cc | 4 +- sql/sql_analyze_stmt.cc | 2 +- sql/sql_base.cc | 72 +- sql/sql_base.h | 8 +- sql/sql_class.cc | 114 +- sql/sql_class.h | 25 +- sql/sql_connect.cc | 4 +- sql/sql_const.h | 2 +- sql/sql_delete.cc | 2 +- sql/sql_explain.cc | 2 +- sql/sql_handler.cc | 5 +- sql/sql_insert.cc | 41 +- sql/sql_lex.cc | 5 +- sql/sql_lex.h | 17 +- sql/sql_parse.cc | 231 +++- sql/sql_parse.h | 1 + sql/sql_partition.cc | 6 +- sql/sql_partition_admin.cc | 2 +- sql/sql_plugin.cc | 17 +- sql/sql_prepare.cc | 49 +- sql/sql_priv.h | 4 +- sql/sql_rename.cc | 2 +- sql/sql_repl.cc | 7 +- sql/sql_select.cc | 69 +- sql/sql_show.cc | 110 +- sql/sql_statistics.cc | 32 +- sql/sql_string.cc | 11 +- sql/sql_table.cc | 80 +- sql/sql_time.cc | 2 + sql/sql_trigger.cc | 17 +- sql/sql_truncate.cc | 5 +- sql/sql_view.cc | 15 +- sql/sql_yacc.cc | 1139 +++++++++-------- sql/sql_yacc.yy | 5 + sql/sys_vars.cc | 20 +- sql/table.cc | 29 +- sql/table.h | 10 +- sql/tztime.cc | 4 +- sql/wsrep_applier.cc | 8 +- sql/wsrep_check_opts.cc | 3 +- sql/wsrep_hton.cc | 88 +- sql/wsrep_mysqld.cc | 108 +- sql/wsrep_mysqld.h | 23 +- sql/wsrep_priv.h | 2 +- sql/wsrep_sst.cc | 61 +- sql/wsrep_thd.cc | 38 +- sql/wsrep_var.cc | 25 + sql/wsrep_var.h | 1 + storage/archive/archive_reader.c | 3 +- storage/archive/ha_archive.cc | 2 +- storage/connect/CMakeLists.txt | 9 +- storage/connect/Client.java | 27 +- storage/connect/JavaWrappers.jar | Bin 44053 -> 19192 bytes storage/connect/JdbcInterface.java | 54 +- storage/connect/PostgresqlInterface.java | 5 +- storage/connect/array.cpp | 22 +- storage/connect/blkfil.cpp | 8 +- storage/connect/block.h | 4 +- storage/connect/checklvl.h | 3 +- storage/connect/cmgoconn.cpp | 18 +- storage/connect/colblk.cpp | 9 +- storage/connect/connect.cc | 43 +- storage/connect/csort.cpp | 16 +- storage/connect/domdoc.cpp | 3 +- storage/connect/filamap.cpp | 32 +- storage/connect/filamdbf.cpp | 12 +- storage/connect/filamfix.cpp | 68 +- storage/connect/filamgz.cpp | 20 +- storage/connect/filamtxt.cpp | 71 +- storage/connect/filamvct.cpp | 162 +-- storage/connect/filamzip.cpp | 8 +- storage/connect/filter.cpp | 36 +- storage/connect/fmdlex.c | 8 +- storage/connect/global.h | 11 +- storage/connect/ha_connect.cc | 348 ++--- storage/connect/inihandl.cpp | 54 +- storage/connect/javaconn.cpp | 6 +- storage/connect/jdbconn.cpp | 365 ++++-- storage/connect/jdbconn.h | 11 +- storage/connect/jmgfam.cpp | 2 +- storage/connect/jmgoconn.cpp | 14 +- storage/connect/json.cpp | 41 +- storage/connect/json.h | 8 +- storage/connect/jsonudf.cpp | 862 ++++++++----- storage/connect/jsonudf.h | 4 + storage/connect/libdoc.cpp | 98 +- storage/connect/macutil.cpp | 4 +- storage/connect/mongo.cpp | 4 +- storage/connect/mycat.cc | 34 +- storage/connect/myconn.cpp | 10 +- .../connect/r/jdbc_postgresql.result | 35 +- .../mysql-test/connect/r/json_java_2.result | 7 +- .../mysql-test/connect/r/json_java_3.result | 4 +- .../mysql-test/connect/r/json_mongo_c.result | 2 + .../mysql-test/connect/r/json_udf.result | 10 +- .../mysql-test/connect/r/json_udf_bin.result | 3 +- .../mysql-test/connect/r/mongo_c.result | 2 + .../mysql-test/connect/r/mongo_java_2.result | 4 +- .../mysql-test/connect/r/mongo_java_3.result | 4 +- .../mysql-test/connect/r/tbl_thread.result | 6 +- .../connect/mysql-test/connect/r/vcol.result | 29 + .../connect/std_data/JavaWrappers.jar | Bin 0 -> 19192 bytes .../mysql-test/connect/std_data/Mongo2.jar | Bin 3461358 -> 623907 bytes .../mysql-test/connect/std_data/Mongo3.jar | Bin 1705776 -> 1705776 bytes .../mysql-test/connect/t/jdbc_postgresql.test | 33 +- .../connect/mysql-test/connect/t/jdbconn.inc | 7 +- .../mysql-test/connect/t/json_udf.test | 6 +- .../connect/mysql-test/connect/t/mongo.inc | 4 +- .../mysql-test/connect/t/mongo_test.inc | 8 +- .../mysql-test/connect/t/tbl_thread.test | 6 +- .../connect/mysql-test/connect/t/vcol.test | 31 + storage/connect/odbconn.cpp | 103 +- storage/connect/plgdbsem.h | 3 +- storage/connect/plgdbutl.cpp | 143 +-- storage/connect/plugutil.cpp | 28 +- storage/connect/preparse.h | 2 +- storage/connect/reldef.cpp | 2 +- storage/connect/tabcol.cpp | 8 +- storage/connect/tabdos.cpp | 59 +- storage/connect/tabdos.h | 1 + storage/connect/tabext.cpp | 6 +- storage/connect/tabfix.cpp | 8 +- storage/connect/tabfmt.cpp | 36 +- storage/connect/tabjdbc.cpp | 35 +- storage/connect/tabjdbc.h | 2 + storage/connect/tabjson.cpp | 607 +++++---- storage/connect/tabjson.h | 44 +- storage/connect/table.cpp | 16 +- storage/connect/tabmac.cpp | 4 +- storage/connect/tabmul.cpp | 22 +- storage/connect/tabmysql.cpp | 28 +- storage/connect/tabodbc.cpp | 20 +- storage/connect/tabpivot.cpp | 2 +- storage/connect/tabsys.cpp | 12 +- storage/connect/tabtbl.cpp | 41 +- storage/connect/tabutil.cpp | 8 +- storage/connect/tabvct.cpp | 8 +- storage/connect/tabwmi.cpp | 4 +- storage/connect/tabxml.cpp | 26 +- storage/connect/user_connect.cc | 2 +- storage/connect/valblk.cpp | 2 +- storage/connect/value.cpp | 50 +- storage/connect/xindex.cpp | 88 +- storage/connect/xobject.cpp | 5 +- storage/csv/ha_tina.cc | 2 +- storage/federated/ha_federated.cc | 2 +- storage/federatedx/ha_federatedx.cc | 2 +- storage/heap/_check.c | 2 +- storage/heap/ha_heap.cc | 11 +- storage/heap/hp_create.c | 8 +- storage/heap/hp_delete.c | 2 +- storage/heap/hp_rrnd.c | 2 +- storage/heap/hp_rsame.c | 2 +- storage/heap/hp_scan.c | 2 +- storage/heap/hp_write.c | 4 +- storage/innobase/CMakeLists.txt | 4 +- storage/innobase/btr/btr0defragment.cc | 51 - storage/innobase/btr/btr0sea.cc | 15 +- storage/innobase/buf/buf0buf.cc | 391 +++--- storage/innobase/buf/buf0dblwr.cc | 37 +- storage/innobase/buf/buf0dump.cc | 24 +- storage/innobase/buf/buf0flu.cc | 13 + storage/innobase/buf/buf0lru.cc | 54 +- storage/innobase/dict/dict0crea.cc | 7 +- storage/innobase/dict/dict0dict.cc | 35 +- storage/innobase/dict/dict0load.cc | 6 +- storage/innobase/fil/fil0crypt.cc | 140 +- storage/innobase/fil/fil0fil.cc | 627 +-------- storage/innobase/fil/fil0pagecompress.cc | 694 +++------- storage/innobase/fsp/fsp0fsp.cc | 6 +- storage/innobase/fts/fts0fts.cc | 23 +- storage/innobase/handler/ha_innodb.cc | 285 +++-- storage/innobase/handler/ha_innodb.h | 5 +- storage/innobase/handler/handler0alter.cc | 115 +- storage/innobase/handler/i_s.cc | 28 +- storage/innobase/ibuf/ibuf0ibuf.cc | 5 + storage/innobase/include/btr0sea.h | 13 +- storage/innobase/include/buf0buf.h | 53 +- storage/innobase/include/buf0lru.h | 14 +- storage/innobase/include/data0type.ic | 2 + storage/innobase/include/fil0fil.h | 111 +- storage/innobase/include/fil0fil.ic | 8 +- storage/innobase/include/fil0pagecompress.h | 95 +- storage/innobase/include/fsp0fsp.h | 2 +- storage/innobase/include/fsp0pagecompress.ic | 70 +- storage/innobase/include/row0upd.h | 4 +- storage/innobase/include/row0upd.ic | 4 +- storage/innobase/include/trx0trx.h | 12 +- storage/innobase/include/univ.i | 6 +- storage/innobase/include/ut0timer.h | 39 +- storage/innobase/include/ut0timer.ic | 61 +- storage/innobase/lock/lock0lock.cc | 79 +- storage/innobase/log/log0log.cc | 66 +- storage/innobase/log/log0recv.cc | 9 +- storage/innobase/mem/mem0mem.cc | 5 + storage/innobase/os/os0file.cc | 63 +- storage/innobase/page/page0page.cc | 17 +- storage/innobase/row/row0import.cc | 852 ++++++++---- storage/innobase/row/row0log.cc | 138 +- storage/innobase/row/row0merge.cc | 3 +- storage/innobase/row/row0mysql.cc | 26 +- storage/innobase/row/row0sel.cc | 222 ++-- storage/innobase/row/row0upd.cc | 141 +- storage/innobase/srv/srv0srv.cc | 20 +- storage/innobase/trx/trx0roll.cc | 12 +- storage/innobase/trx/trx0trx.cc | 4 +- storage/innobase/trx/trx0undo.cc | 6 +- storage/maria/ha_maria.cc | 141 +- storage/maria/ha_maria.h | 1 + storage/maria/ma_bitmap.c | 241 +++- storage/maria/ma_blockrec.c | 3 +- storage/maria/ma_close.c | 2 + storage/maria/ma_commit.c | 17 +- storage/maria/ma_control_file.c | 2 +- storage/maria/ma_dynrec.c | 7 +- storage/maria/ma_extra.c | 4 +- storage/maria/ma_loghandler.c | 6 +- storage/maria/ma_open.c | 12 +- storage/maria/ma_recovery.c | 11 + storage/maria/ma_state.c | 48 +- storage/maria/ma_state.h | 2 +- storage/maria/ma_trnman.h | 65 + storage/maria/maria_chk.c | 2 +- storage/maria/maria_def.h | 17 +- storage/maria/maria_dump_log.c | 2 +- storage/maria/maria_pack.c | 2 +- storage/maria/maria_read_log.c | 2 +- storage/maria/trnman.c | 1 + storage/maria/trnman.h | 3 +- .../ma_test_loghandler_multigroup-t.c | 2 +- storage/mroonga/CMakeLists.txt | 3 + storage/mroonga/vendor/groonga/CMakeLists.txt | 14 +- .../mroonga/vendor/groonga/lib/CMakeLists.txt | 6 + storage/myisam/ha_myisam.cc | 2 +- storage/myisam/mi_open.c | 8 +- storage/myisam/myisamchk.c | 4 +- storage/myisam/myisampack.c | 4 +- storage/oqgraph/graphcore-config.h | 2 + storage/oqgraph/graphcore-graph.cc | 1 - storage/oqgraph/graphcore.cc | 1 - storage/oqgraph/oqgraph_shim.h | 5 +- storage/perfschema/ha_perfschema.cc | 2 +- storage/sphinx/ha_sphinx.cc | 87 +- storage/sphinx/snippets_udf.cc | 8 +- storage/spider/ha_spider.cc | 2 +- storage/spider/spd_conn.cc | 29 +- storage/spider/spd_db_oracle.cc | 6 +- storage/spider/spd_direct_sql.cc | 16 + storage/spider/spd_malloc.h | 2 +- storage/spider/spd_ping_table.cc | 22 - storage/spider/spd_table.cc | 103 +- storage/spider/spd_trx.cc | 42 +- storage/tokudb/CMakeLists.txt | 6 +- storage/tokudb/PerconaFT/.clang-format | 36 + storage/tokudb/PerconaFT/CMakeLists.txt | 6 + storage/tokudb/PerconaFT/README.md | 29 +- .../cmake_modules/TokuSetupCompiler.cmake | 2 +- storage/tokudb/PerconaFT/ft/ft-ops.cc | 99 +- .../PerconaFT/ft/serialize/ft-serialize.cc | 16 +- .../ft/serialize/ft_node-serialize.cc | 116 +- .../PerconaFT/ft/tests/ft-clock-test.cc | 4 +- .../tokudb/PerconaFT/ft/tests/log-test4.cc | 2 +- storage/tokudb/PerconaFT/portability/memory.h | 2 +- .../portability/tests/test-max-data.cc | 2 +- .../PerconaFT/portability/toku_debug_sync.h | 3 - .../portability/toku_instrumentation.h | 2 + .../PerconaFT/portability/toku_portability.h | 2 +- .../PerconaFT/portability/toku_pthread.h | 16 +- .../PerconaFT/portability/toku_race_tools.h | 7 +- .../tokudb/PerconaFT/portability/toku_time.h | 5 + storage/tokudb/PerconaFT/src/CMakeLists.txt | 2 +- .../PerconaFT/src/tests/checkpoint_stress.cc | 2 +- .../PerconaFT/src/tests/directory_lock.cc | 2 +- .../src/tests/loader-cleanup-test.cc | 18 +- .../src/tests/recover-del-multiple-abort.cc | 6 +- .../recover-del-multiple-srcdb-fdelete-all.cc | 6 +- .../src/tests/recover-del-multiple.cc | 6 +- .../src/tests/recover-put-multiple-abort.cc | 6 +- .../src/tests/recovery_fileops_unit.cc | 4 +- .../PerconaFT/src/tests/test-prepare3.cc | 1 + .../third_party/xz-4.999.9beta/autogen.sh | 0 .../xz-4.999.9beta/build-aux/compile | 0 .../xz-4.999.9beta/build-aux/config.guess | 0 .../xz-4.999.9beta/build-aux/config.rpath | 0 .../xz-4.999.9beta/build-aux/config.sub | 0 .../xz-4.999.9beta/build-aux/depcomp | 0 .../xz-4.999.9beta/build-aux/install-sh | 0 .../xz-4.999.9beta/build-aux/ltmain.sh | 0 .../xz-4.999.9beta/build-aux/missing | 0 .../xz-4.999.9beta/extra/7z2lzma/7z2lzma.bash | 0 .../xz-4.999.9beta/tests/test_compress.sh | 0 .../xz-4.999.9beta/tests/test_files.sh | 0 storage/tokudb/PerconaFT/util/dmt.cc | 4 +- storage/tokudb/PerconaFT/util/omt.h | 8 +- storage/tokudb/hatoku_hton.cc | 20 +- .../mysql-test/tokudb_bugs/r/db917.result | 4 +- .../mysql-test/tokudb_bugs/t/db917.test | 4 +- .../tokudb_mariadb/r/mdev6657.result | 6 +- .../mysql-test/tokudb_mariadb/t/mdev6657.test | 4 +- storage/tokudb/tokudb_thread.h | 49 - storage/xtradb/CMakeLists.txt | 10 +- storage/xtradb/btr/btr0defragment.cc | 50 - storage/xtradb/btr/btr0sea.cc | 15 +- storage/xtradb/buf/buf0buf.cc | 401 +++--- storage/xtradb/buf/buf0dblwr.cc | 40 +- storage/xtradb/buf/buf0dump.cc | 24 +- storage/xtradb/buf/buf0flu.cc | 13 + storage/xtradb/buf/buf0lru.cc | 54 +- storage/xtradb/dict/dict0crea.cc | 8 +- storage/xtradb/dict/dict0dict.cc | 84 +- storage/xtradb/dict/dict0load.cc | 6 +- storage/xtradb/dict/dict0mem.cc | 2 +- storage/xtradb/fil/fil0crypt.cc | 140 +- storage/xtradb/fil/fil0fil.cc | 625 +-------- storage/xtradb/fil/fil0pagecompress.cc | 694 +++------- storage/xtradb/fsp/fsp0fsp.cc | 6 +- storage/xtradb/fts/fts0fts.cc | 37 +- storage/xtradb/fts/fts0que.cc | 17 +- storage/xtradb/handler/ha_innodb.cc | 252 ++-- storage/xtradb/handler/ha_innodb.h | 5 +- storage/xtradb/handler/handler0alter.cc | 64 +- storage/xtradb/handler/i_s.cc | 28 +- storage/xtradb/ibuf/ibuf0ibuf.cc | 4 + storage/xtradb/include/btr0sea.h | 13 +- storage/xtradb/include/buf0buf.h | 53 +- storage/xtradb/include/buf0lru.h | 14 +- storage/xtradb/include/data0type.ic | 2 + storage/xtradb/include/fil0fil.h | 111 +- storage/xtradb/include/fil0fil.ic | 8 +- storage/xtradb/include/fil0pagecompress.h | 95 +- storage/xtradb/include/fsp0fsp.h | 2 +- storage/xtradb/include/fsp0pagecompress.ic | 70 +- storage/xtradb/include/row0upd.h | 4 +- storage/xtradb/include/row0upd.ic | 4 +- storage/xtradb/include/trx0trx.h | 12 +- storage/xtradb/include/univ.i | 8 +- storage/xtradb/include/ut0timer.h | 39 +- storage/xtradb/include/ut0timer.ic | 61 +- storage/xtradb/include/ut0ut.h | 11 +- storage/xtradb/lock/lock0lock.cc | 79 +- storage/xtradb/log/log0log.cc | 66 +- storage/xtradb/log/log0recv.cc | 9 +- storage/xtradb/mem/mem0mem.cc | 5 + storage/xtradb/os/os0file.cc | 85 +- storage/xtradb/page/page0page.cc | 17 +- storage/xtradb/row/row0import.cc | 854 ++++++++---- storage/xtradb/row/row0log.cc | 126 +- storage/xtradb/row/row0merge.cc | 3 +- storage/xtradb/row/row0mysql.cc | 26 +- storage/xtradb/row/row0sel.cc | 219 ++-- storage/xtradb/row/row0upd.cc | 141 +- storage/xtradb/srv/srv0srv.cc | 20 +- storage/xtradb/srv/srv0start.cc | 6 +- storage/xtradb/trx/trx0roll.cc | 12 +- storage/xtradb/trx/trx0trx.cc | 4 +- storage/xtradb/trx/trx0undo.cc | 6 +- storage/xtradb/ut/ut0ut.cc | 30 +- support-files/CMakeLists.txt | 11 +- support-files/mysql.server.sh | 1 - .../policy/selinux/mariadb-server.fc | 2 +- .../policy/selinux/mariadb-server.te | 2 +- support-files/wsrep.cnf.sh | 3 + tests/mysql_client_fw.c | 3 +- tests/mysql_client_test.c | 13 +- tests/thread_test.c | 4 +- unittest/sql/mf_iocache-t.cc | 72 +- 896 files changed, 19898 insertions(+), 13382 deletions(-) delete mode 100644 extra/mariabackup/ds_local.c create mode 100644 extra/mariabackup/ds_local.cc rename include/{my_systemd.h => my_service_manager.h} (72%) create mode 100644 mysql-test/include/innodb_row_format.combinations create mode 100644 mysql-test/include/innodb_row_format.inc create mode 100644 mysql-test/include/maybe_debug.combinations create mode 100644 mysql-test/include/maybe_debug.inc create mode 100644 mysql-test/lib/My/Tee.pm create mode 100644 mysql-test/r/assign_key_cache.result rename mysql-test/r/{assign_key_cache-5405.result => assign_key_cache_debug.result} (100%) create mode 100644 mysql-test/r/connect_debug.result create mode 100644 mysql-test/r/grant_not_windows.result create mode 100644 mysql-test/r/ps_qc_innodb.result create mode 100644 mysql-test/r/statistics_close.result delete mode 100644 mysql-test/std_data/binlog-header.log create mode 100644 mysql-test/suite/encryption/r/innodb-remove-encryption.result create mode 100644 mysql-test/suite/encryption/t/innodb-remove-encryption.test create mode 100644 mysql-test/suite/encryption/t/tempfiles.combinations create mode 100644 mysql-test/suite/encryption/t/tempfiles.opt delete mode 100644 mysql-test/suite/galera/galera_2nodes_as_master_slave.cnf delete mode 100644 mysql-test/suite/galera/galera_2nodes_as_master_with_repl_filter.cnf create mode 100644 mysql-test/suite/galera/include/have_mariabackup.inc create mode 100644 mysql-test/suite/galera/include/have_wsrep_replicate_myisam.inc create mode 100644 mysql-test/suite/galera/include/have_xtrabackup.inc create mode 100644 mysql-test/suite/galera/r/MW-416.result create mode 100644 mysql-test/suite/galera/r/galera#500.result create mode 100644 mysql-test/suite/galera/r/galera_encrypt_tmp_files.result create mode 100644 mysql-test/suite/galera/r/galera_mdev_15611.result create mode 100644 mysql-test/suite/galera/r/galera_schema_dirty_reads.result create mode 100644 mysql-test/suite/galera/r/galera_sst_mariabackup,debug.rdiff create mode 100644 mysql-test/suite/galera/r/galera_sst_mariabackup.result create mode 100644 mysql-test/suite/galera/r/galera_sst_mysqldump,debug.rdiff create mode 100644 mysql-test/suite/galera/r/galera_sst_rsync,debug.rdiff create mode 100644 mysql-test/suite/galera/r/galera_sst_xtrabackup-v2,debug.rdiff create mode 100644 mysql-test/suite/galera/r/galera_var_reject_queries.result create mode 100644 mysql-test/suite/galera/r/have_wsrep_replicate_myisam.require create mode 100644 mysql-test/suite/galera/t/MW-416.test create mode 100644 mysql-test/suite/galera/t/galera#500.test create mode 100644 mysql-test/suite/galera/t/galera_encrypt_tmp_files.cnf create mode 100644 mysql-test/suite/galera/t/galera_encrypt_tmp_files.test create mode 100644 mysql-test/suite/galera/t/galera_mdev_15611.cnf create mode 100644 mysql-test/suite/galera/t/galera_mdev_15611.test create mode 100644 mysql-test/suite/galera/t/galera_schema_dirty_reads.test create mode 100644 mysql-test/suite/galera/t/galera_sst_mariabackup.cnf create mode 100644 mysql-test/suite/galera/t/galera_sst_mariabackup.test create mode 100644 mysql-test/suite/galera/t/galera_var_auto_inc_control_on.opt create mode 100644 mysql-test/suite/galera/t/galera_var_reject_queries.test create mode 100644 mysql-test/suite/handler/ps.result create mode 100644 mysql-test/suite/handler/ps.test create mode 100644 mysql-test/suite/innodb/r/alter_partitioned_xa.result create mode 100644 mysql-test/suite/innodb/r/default_row_format_alter.result create mode 100644 mysql-test/suite/innodb/r/default_row_format_compatibility.result create mode 100644 mysql-test/suite/innodb/r/default_row_format_create,dynamic.rdiff create mode 100644 mysql-test/suite/innodb/r/default_row_format_create,redundant.rdiff create mode 100644 mysql-test/suite/innodb/r/default_row_format_create.result create mode 100644 mysql-test/suite/innodb/r/file_format_defaults.result create mode 100644 mysql-test/suite/innodb/r/innodb_bug27216817.result create mode 100644 mysql-test/suite/innodb/r/lock_deleted.result create mode 100644 mysql-test/suite/innodb/r/mvcc.result create mode 100644 mysql-test/suite/innodb/r/read_only_recover_committed.result create mode 100644 mysql-test/suite/innodb/r/rename_table.result create mode 100644 mysql-test/suite/innodb/r/restart.result create mode 100644 mysql-test/suite/innodb/t/alter_partitioned_xa.test create mode 100644 mysql-test/suite/innodb/t/default_row_format_alter.test create mode 100644 mysql-test/suite/innodb/t/default_row_format_compatibility.test create mode 100644 mysql-test/suite/innodb/t/default_row_format_create.test create mode 100644 mysql-test/suite/innodb/t/file_format_defaults-master.opt create mode 100644 mysql-test/suite/innodb/t/file_format_defaults.test create mode 100644 mysql-test/suite/innodb/t/lock_deleted.test create mode 100644 mysql-test/suite/innodb/t/mvcc.test create mode 100644 mysql-test/suite/innodb/t/read_only_recover_committed.test create mode 100644 mysql-test/suite/innodb/t/rename_table.test create mode 100644 mysql-test/suite/innodb/t/restart.test rename mysql-test/suite/innodb_fts/r/{innodb-fts-basic.result => basic.result} (89%) rename mysql-test/suite/innodb_fts/t/{innodb-fts-basic.test => basic.test} (85%) create mode 100644 mysql-test/suite/maria/dynamic.result create mode 100644 mysql-test/suite/maria/dynamic.test create mode 100644 mysql-test/suite/mariabackup/absolute_ibdata_paths.opt create mode 100644 mysql-test/suite/mariabackup/absolute_ibdata_paths.result create mode 100644 mysql-test/suite/mariabackup/absolute_ibdata_paths.test create mode 100644 mysql-test/suite/mariabackup/backup_ssl.result create mode 100644 mysql-test/suite/mariabackup/backup_ssl.test create mode 100644 mysql-test/suite/mariabackup/undo_space_id.opt create mode 100644 mysql-test/suite/mariabackup/undo_space_id.result create mode 100644 mysql-test/suite/mariabackup/undo_space_id.test create mode 100644 mysql-test/suite/perfschema/r/partition.result create mode 100644 mysql-test/suite/perfschema/t/partition.test create mode 100644 mysql-test/suite/plugins/r/processlist.result create mode 100644 mysql-test/suite/plugins/t/processlist.test create mode 100644 mysql-test/suite/rpl/r/rename.result create mode 100644 mysql-test/suite/rpl/r/rpl_semi_sync_skip_repl.result create mode 100644 mysql-test/suite/rpl/t/rename.test create mode 100644 mysql-test/suite/rpl/t/rpl_semi_sync_skip_repl.test create mode 100644 mysql-test/suite/sys_vars/r/innodb_default_row_format_basic.result create mode 100644 mysql-test/suite/sys_vars/t/innodb_default_row_format_basic.test create mode 100644 mysql-test/suite/sys_vars/t/sysvars_server_embedded.opt create mode 100644 mysql-test/suite/sys_vars/t/sysvars_server_notembedded.opt create mode 100644 mysql-test/t/assign_key_cache.test rename mysql-test/t/{assign_key_cache-5405.test => assign_key_cache_debug.test} (100%) create mode 100644 mysql-test/t/connect_debug.test create mode 100644 mysql-test/t/grant_not_windows.test create mode 100644 mysql-test/t/ps_qc_innodb.test create mode 100644 mysql-test/t/statistics_close.test create mode 100644 plugin/disks/CMakeLists.txt create mode 100644 plugin/disks/README.txt create mode 100644 plugin/disks/information_schema_disks.cc create mode 100644 plugin/disks/mysql-test/disks/disks.result create mode 100644 plugin/disks/mysql-test/disks/disks.test create mode 100644 plugin/disks/mysql-test/disks/suite.opt create mode 100644 plugin/disks/mysql-test/disks/suite.pm create mode 100644 storage/connect/mysql-test/connect/r/vcol.result create mode 100644 storage/connect/mysql-test/connect/std_data/JavaWrappers.jar create mode 100644 storage/connect/mysql-test/connect/t/vcol.test create mode 100644 storage/maria/ma_trnman.h create mode 100644 storage/tokudb/PerconaFT/.clang-format mode change 100644 => 100755 storage/tokudb/PerconaFT/third_party/xz-4.999.9beta/autogen.sh mode change 100644 => 100755 storage/tokudb/PerconaFT/third_party/xz-4.999.9beta/build-aux/compile mode change 100644 => 100755 storage/tokudb/PerconaFT/third_party/xz-4.999.9beta/build-aux/config.guess mode change 100644 => 100755 storage/tokudb/PerconaFT/third_party/xz-4.999.9beta/build-aux/config.rpath mode change 100644 => 100755 storage/tokudb/PerconaFT/third_party/xz-4.999.9beta/build-aux/config.sub mode change 100644 => 100755 storage/tokudb/PerconaFT/third_party/xz-4.999.9beta/build-aux/depcomp mode change 100644 => 100755 storage/tokudb/PerconaFT/third_party/xz-4.999.9beta/build-aux/install-sh mode change 100644 => 100755 storage/tokudb/PerconaFT/third_party/xz-4.999.9beta/build-aux/ltmain.sh mode change 100644 => 100755 storage/tokudb/PerconaFT/third_party/xz-4.999.9beta/build-aux/missing mode change 100644 => 100755 storage/tokudb/PerconaFT/third_party/xz-4.999.9beta/extra/7z2lzma/7z2lzma.bash mode change 100644 => 100755 storage/tokudb/PerconaFT/third_party/xz-4.999.9beta/tests/test_compress.sh mode change 100644 => 100755 storage/tokudb/PerconaFT/third_party/xz-4.999.9beta/tests/test_files.sh diff --git a/.gitattributes b/.gitattributes index 852eec4d6..9d638481a 100644 --- a/.gitattributes +++ b/.gitattributes @@ -25,6 +25,7 @@ pcre/testdata/greppatN4 -text *.MYD binary *.MYI binary *.class binary +*.jar binary *.c diff=cpp *.h diff=cpp diff --git a/.gitignore b/.gitignore index c3c140bb9..acbb8d213 100644 --- a/.gitignore +++ b/.gitignore @@ -120,6 +120,7 @@ scripts/mytop scripts/wsrep_sst_common scripts/wsrep_sst_mysqldump scripts/wsrep_sst_rsync +scripts/wsrep_sst_rsync_wan scripts/wsrep_sst_mariabackup scripts/wsrep_sst_xtrabackup scripts/wsrep_sst_xtrabackup-v2 @@ -477,3 +478,9 @@ UpgradeLog*.htm # Microsoft Fakes FakesAssemblies/ + +# macOS garbage +.DS_Store + +# QtCreator && CodeBlocks +*.cbp diff --git a/CMakeLists.txt b/CMakeLists.txt index b4de70a28..fa1ed701a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -162,6 +162,7 @@ INCLUDE(plugin) INCLUDE(install_macros) INCLUDE(systemd) INCLUDE(mysql_add_executable) +INCLUDE(compile_flags) # Handle options OPTION(DISABLE_SHARED @@ -361,6 +362,10 @@ INCLUDE(maintainer) IF(WITH_UNIT_TESTS) ENABLE_TESTING() + # This is the only instance where ADD_TEST should be used, + # to make sure that make test will run MTR, + # use MY_ADD_TEST macro to add other tests + ADD_TEST(NAME MTR COMMAND ./mysql-test-run WORKING_DIRECTORY "mysql-test") ADD_SUBDIRECTORY(unittest/mytap) ADD_SUBDIRECTORY(unittest/strings) ADD_SUBDIRECTORY(unittest/examples) diff --git a/CREDITS b/CREDITS index 7572f6f5d..1788b6304 100644 --- a/CREDITS +++ b/CREDITS @@ -5,15 +5,14 @@ The current main sponsors of the MariaDB Foundation are: Alibaba Cloud https://www.alibabacloud.com/ (2017) Booking.com https://www.booking.com (2013) +MariaDB Corporation https://www.mariadb.com (2013) Microsoft https://microsoft.com/ (2017) Tencent Cloud https://cloud.tencent.com (2017) Development Bank of Singapore https://dbs.com (2016) IBM https://www.ibm.com (2017) -MariaDB Corporation https://www.mariadb.com (2013) Visma https://visma.com (2015) Acronis http://acronis.com (2016) Nexedi https://www.nexedi.com (2016) -Automattic https://automattic.com (2014) Tencent Game DBA http://tencentdba.com/about (2016) Tencent TDSQL http://tdsql.org (2016) Verkkokauppa.com https://www.verkkokauppa.com (2015) diff --git a/Docs/INFO_SRC b/Docs/INFO_SRC index bd70a3ac3..707e56e9e 100644 --- a/Docs/INFO_SRC +++ b/Docs/INFO_SRC @@ -1,8 +1,8 @@ -commit: aba15b864af664276261dcbbdaef35268d407af1 -date: 2018-02-04 04:28:14 +0200 -build-date: 2018-02-04 02:30:32 +0000 -short: aba15b8 +commit: 9f848da640dd6c3f44d56eae18204370ae7f835c +date: 2018-06-16 01:20:44 +0200 +build-date: 2018-06-16 00:19:48 +0000 +short: 9f848da branch: HEAD -MariaDB source 10.1.31 +MariaDB source 10.1.34 diff --git a/VERSION b/VERSION index 244d28b6b..f9ccf7c61 100644 --- a/VERSION +++ b/VERSION @@ -1,3 +1,3 @@ MYSQL_VERSION_MAJOR=10 MYSQL_VERSION_MINOR=1 -MYSQL_VERSION_PATCH=31 +MYSQL_VERSION_PATCH=34 diff --git a/client/mysql.cc b/client/mysql.cc index 7973c3c7f..2cbb6ae25 100644 --- a/client/mysql.cc +++ b/client/mysql.cc @@ -1175,11 +1175,7 @@ int main(int argc,char *argv[]) close(stdout_fileno_copy); /* Clean up dup(). */ } - if (load_defaults("my",load_default_groups,&argc,&argv)) - { - my_end(0); - exit(1); - } + load_defaults_or_exit("my", load_default_groups, &argc, &argv); defaults_argv=argv; if ((status.exit_status= get_options(argc, (char **) argv))) mysql_end(-1); @@ -1229,15 +1225,17 @@ int main(int argc,char *argv[]) window_resize(0); #endif - put_info("Welcome to the MariaDB monitor. Commands end with ; or \\g.", - INFO_INFO); - my_snprintf((char*) glob_buffer.ptr(), glob_buffer.alloced_length(), - "Your %s connection id is %lu\nServer version: %s\n", - mysql_get_server_name(&mysql), - mysql_thread_id(&mysql), server_version_string(&mysql)); - put_info((char*) glob_buffer.ptr(),INFO_INFO); - - put_info(ORACLE_WELCOME_COPYRIGHT_NOTICE("2000"), INFO_INFO); + if (!status.batch) + { + put_info("Welcome to the MariaDB monitor. Commands end with ; or \\g.", + INFO_INFO); + my_snprintf((char*) glob_buffer.ptr(), glob_buffer.alloced_length(), + "Your %s connection id is %lu\nServer version: %s\n", + mysql_get_server_name(&mysql), + mysql_thread_id(&mysql), server_version_string(&mysql)); + put_info((char*) glob_buffer.ptr(),INFO_INFO); + put_info(ORACLE_WELCOME_COPYRIGHT_NOTICE("2000"), INFO_INFO); + } #ifdef HAVE_READLINE initialize_readline((char*) my_progname); diff --git a/client/mysql_upgrade.c b/client/mysql_upgrade.c index cbdd398c1..5eb495774 100644 --- a/client/mysql_upgrade.c +++ b/client/mysql_upgrade.c @@ -1133,6 +1133,8 @@ int main(int argc, char **argv) char self_name[FN_REFLEN + 1]; MY_INIT(argv[0]); + load_defaults_or_exit("my", load_default_groups, &argc, &argv); + defaults_argv= argv; /* Must be freed by 'free_defaults' */ #if __WIN__ if (GetModuleFileName(NULL, self_name, FN_REFLEN) == 0) @@ -1145,10 +1147,6 @@ int main(int argc, char **argv) init_dynamic_string(&conn_args, "", 512, 256)) die("Out of memory"); - if (load_defaults("my", load_default_groups, &argc, &argv)) - die(NULL); - defaults_argv= argv; /* Must be freed by 'free_defaults' */ - if (handle_options(&argc, &argv, my_long_options, get_one_option)) die(NULL); if (debug_info_flag) diff --git a/client/mysqladmin.cc b/client/mysqladmin.cc index 897c2eb41..d4d40b0a0 100644 --- a/client/mysqladmin.cc +++ b/client/mysqladmin.cc @@ -319,8 +319,7 @@ int main(int argc,char *argv[]) MY_INIT(argv[0]); mysql_init(&mysql); sf_leaking_memory=1; /* don't report memory leaks on early exits */ - if ((error= load_defaults("my",load_default_groups,&argc,&argv))) - goto err1; + load_defaults_or_exit("my", load_default_groups, &argc, &argv); save_argv = argv; /* Save for free_defaults */ if ((error=handle_options(&argc, &argv, my_long_options, get_one_option))) @@ -500,10 +499,8 @@ int main(int argc,char *argv[]) my_free(shared_memory_base_name); #endif free_defaults(save_argv); -err1: my_end(my_end_arg); - exit(error); - return 0; + return error; } diff --git a/client/mysqlbinlog.cc b/client/mysqlbinlog.cc index b871a70ef..9753125dd 100644 --- a/client/mysqlbinlog.cc +++ b/client/mysqlbinlog.cc @@ -2666,9 +2666,7 @@ int main(int argc, char** argv) tzset(); // set tzname init_alloc_root(&s_mem_root, 16384, 0, MYF(0)); - if (load_defaults("my", load_groups, &argc, &argv)) - exit(1); - + load_defaults_or_exit("my", load_groups, &argc, &argv); defaults_argv= argv; if (!(binlog_filter= new Rpl_filter)) diff --git a/client/mysqlcheck.c b/client/mysqlcheck.c index 47cb38751..a4410eba8 100644 --- a/client/mysqlcheck.c +++ b/client/mysqlcheck.c @@ -1165,9 +1165,7 @@ int main(int argc, char **argv) /* ** Check out the args */ - if (load_defaults("my", load_default_groups, &argc, &argv)) - goto end2; - + load_defaults_or_exit("my", load_default_groups, &argc, &argv); defaults_argv= argv; if (get_options(&argc, &argv)) goto end1; @@ -1243,7 +1241,6 @@ int main(int argc, char **argv) my_free(shared_memory_base_name); mysql_library_end(); free_defaults(defaults_argv); - end2: my_end(my_end_arg); return ret; } /* main */ diff --git a/client/mysqldump.c b/client/mysqldump.c index 5c0ec2a55..f67e52c1b 100644 --- a/client/mysqldump.c +++ b/client/mysqldump.c @@ -976,8 +976,7 @@ static int get_options(int *argc, char ***argv) opt_net_buffer_length= *mysql_params->p_net_buffer_length; md_result_file= stdout; - if (load_defaults("my",load_default_groups,argc,argv)) - return 1; + load_defaults_or_exit("my", load_default_groups, argc, argv); defaults_argv= *argv; if (my_hash_init(&ignore_table, charset_info, 16, 0, 0, @@ -4995,6 +4994,14 @@ static int dump_selected_tables(char *db, char **table_names, int tables) if (opt_xml) print_xml_tag(md_result_file, "", "\n", "database", "name=", db, NullS); + + /* obtain dump of routines (procs/functions) */ + if (opt_routines && mysql_get_server_version(mysql) >= 50009) + { + DBUG_PRINT("info", ("Dumping routines for database %s", db)); + dump_routines_for_db(db); + } + if (opt_single_transaction && mysql_get_server_version(mysql) >= 50500) { verbose_msg("-- Setting savepoint...\n"); @@ -5004,7 +5011,6 @@ static int dump_selected_tables(char *db, char **table_names, int tables) DBUG_RETURN(1); } } - /* Dump each selected table */ for (pos= dump_tables; pos < end; pos++) { @@ -5066,12 +5072,6 @@ static int dump_selected_tables(char *db, char **table_names, int tables) DBUG_PRINT("info", ("Dumping events for database %s", db)); dump_events_for_db(db); } - /* obtain dump of routines (procs/functions) */ - if (opt_routines && mysql_get_server_version(mysql) >= 50009) - { - DBUG_PRINT("info", ("Dumping routines for database %s", db)); - dump_routines_for_db(db); - } free_root(&glob_root, MYF(0)); if (opt_xml) { diff --git a/client/mysqlimport.c b/client/mysqlimport.c index 9c84d4a62..a9c24e20b 100644 --- a/client/mysqlimport.c +++ b/client/mysqlimport.c @@ -641,8 +641,7 @@ int main(int argc, char **argv) MY_INIT(argv[0]); sf_leaking_memory=1; /* don't report memory leaks on early exits */ - if (load_defaults("my",load_default_groups,&argc,&argv)) - return 1; + load_defaults_or_exit("my", load_default_groups, &argc, &argv); /* argv is changed in the program */ argv_to_free= argv; if (get_options(&argc, &argv)) diff --git a/client/mysqlshow.c b/client/mysqlshow.c index f851c1510..95ee8d697 100644 --- a/client/mysqlshow.c +++ b/client/mysqlshow.c @@ -71,8 +71,7 @@ int main(int argc, char **argv) static char **defaults_argv; MY_INIT(argv[0]); sf_leaking_memory=1; /* don't report memory leaks on early exits */ - if (load_defaults("my",load_default_groups,&argc,&argv)) - exit(1); + load_defaults_or_exit("my", load_default_groups, &argc, &argv); defaults_argv=argv; get_options(&argc,&argv); diff --git a/client/mysqlslap.c b/client/mysqlslap.c index 6a0b21430..fd3077644 100644 --- a/client/mysqlslap.c +++ b/client/mysqlslap.c @@ -325,11 +325,7 @@ int main(int argc, char **argv) MY_INIT(argv[0]); sf_leaking_memory=1; /* don't report memory leaks on early exits */ - if (load_defaults("my",load_default_groups,&argc,&argv)) - { - my_end(0); - exit(1); - } + load_defaults_or_exit("my", load_default_groups, &argc, &argv); defaults_argv=argv; if (get_options(&argc,&argv)) { @@ -857,7 +853,7 @@ build_table_string(void) if (auto_generate_sql_guid_primary) { - dynstr_append(&table_string, "id varchar(32) primary key"); + dynstr_append(&table_string, "id varchar(36) primary key"); if (num_int_cols || num_char_cols || auto_generate_sql_guid_primary) dynstr_append(&table_string, ","); @@ -872,7 +868,7 @@ build_table_string(void) if (count) /* Except for the first pass we add a comma */ dynstr_append(&table_string, ","); - if (snprintf(buf, HUGE_STRING_LENGTH, "id%d varchar(32) unique key", count) + if (snprintf(buf, HUGE_STRING_LENGTH, "id%d varchar(36) unique key", count) > HUGE_STRING_LENGTH) { fprintf(stderr, "Memory Allocation error in create table\n"); diff --git a/client/mysqltest.cc b/client/mysqltest.cc index 844a2d7bb..a58b83bd3 100644 --- a/client/mysqltest.cc +++ b/client/mysqltest.cc @@ -520,7 +520,7 @@ struct st_match_err struct st_expected_errors { - struct st_match_err err[10]; + struct st_match_err err[12]; uint count; }; static struct st_expected_errors saved_expected_errors; @@ -903,6 +903,8 @@ pthread_handler_t connection_thread(void *arg) end_thread: cn->query_done= 1; + mysql_close(cn->mysql); + cn->mysql= 0; mysql_thread_end(); pthread_exit(0); return 0; @@ -1418,7 +1420,7 @@ void close_statements() for (con= connections; con < next_con; con++) { if (con->stmt) - mysql_stmt_close(con->stmt); + do_stmt_close(con); con->stmt= 0; } DBUG_VOID_RETURN; @@ -2678,7 +2680,7 @@ void var_query_set(VAR *var, const char *query, const char** query_end) init_dynamic_string(&ds_query, 0, (end - query) + 32, 256); do_eval(&ds_query, query, end, FALSE); - if (mysql_real_query(mysql, ds_query.str, ds_query.length)) + if (mysql_real_query(mysql, ds_query.str, ds_query.length) || !(res= mysql_store_result(mysql))) { handle_error(curr_command, mysql_errno(mysql), mysql_error(mysql), mysql_sqlstate(mysql), &ds_res); @@ -2688,13 +2690,6 @@ void var_query_set(VAR *var, const char *query, const char** query_end) DBUG_VOID_RETURN; } - if (!(res= mysql_store_result(mysql))) - { - report_or_die("Query '%s' didn't return a result set", ds_query.str); - dynstr_free(&ds_query); - eval_expr(var, "", 0); - DBUG_VOID_RETURN; - } dynstr_free(&ds_query); if ((row= mysql_fetch_row(res)) && row[0]) @@ -7306,9 +7301,7 @@ get_one_option(int optid, const struct my_option *opt, char *argument) int parse_args(int argc, char **argv) { - if (load_defaults("my",load_default_groups,&argc,&argv)) - exit(1); - + load_defaults_or_exit("my", load_default_groups, &argc, &argv); default_argv= argv; if ((handle_options(&argc, &argv, my_long_options, get_one_option))) @@ -8746,6 +8739,7 @@ void init_re(void) "[[:space:]]*SELECT[[:space:]]|" "[[:space:]]*CREATE[[:space:]]+TABLE[[:space:]]|" "[[:space:]]*DO[[:space:]]|" + "[[:space:]]*HANDLER[[:space:]]+.*[[:space:]]+READ[[:space:]]|" "[[:space:]]*SET[[:space:]]+OPTION[[:space:]]|" "[[:space:]]*DELETE[[:space:]]+MULTI[[:space:]]|" "[[:space:]]*UPDATE[[:space:]]+MULTI[[:space:]]|" diff --git a/cmake/check_compiler_flag.cmake b/cmake/check_compiler_flag.cmake index ef6759590..673361ab8 100644 --- a/cmake/check_compiler_flag.cmake +++ b/cmake/check_compiler_flag.cmake @@ -32,25 +32,25 @@ MACRO (MY_CHECK_CXX_COMPILER_FLAG flag) SET(CMAKE_REQUIRED_FLAGS "${SAVE_CMAKE_REQUIRED_FLAGS}") ENDMACRO() -FUNCTION(MY_CHECK_AND_SET_COMPILER_FLAG flag) +FUNCTION(MY_CHECK_AND_SET_COMPILER_FLAG flag_to_set) # At the moment this is gcc-only. # Let's avoid expensive compiler tests on Windows: IF(WIN32) RETURN() ENDIF() - MY_CHECK_C_COMPILER_FLAG(${flag}) - MY_CHECK_CXX_COMPILER_FLAG(${flag}) - STRING(REGEX REPLACE "[-,= +]" "_" result "${flag}") + STRING(REGEX REPLACE "^-Wno-" "-W" flag_to_check ${flag_to_set}) + MY_CHECK_C_COMPILER_FLAG(${flag_to_check}) + MY_CHECK_CXX_COMPILER_FLAG(${flag_to_check}) + STRING(REGEX REPLACE "[-,= +]" "_" result "${flag_to_check}") FOREACH(lang C CXX) IF (HAVE_${lang}_${result}) IF(ARGN) FOREACH(type ${ARGN}) - SET(CMAKE_${lang}_FLAGS_${type} "${CMAKE_${lang}_FLAGS_${type}} ${flag}" PARENT_SCOPE) + SET(CMAKE_${lang}_FLAGS_${type} "${CMAKE_${lang}_FLAGS_${type}} ${flag_to_set}" PARENT_SCOPE) ENDFOREACH() ELSE() - SET(CMAKE_${lang}_FLAGS "${CMAKE_${lang}_FLAGS} ${flag}" PARENT_SCOPE) + SET(CMAKE_${lang}_FLAGS "${CMAKE_${lang}_FLAGS} ${flag_to_set}" PARENT_SCOPE) ENDIF() ENDIF() ENDFOREACH() ENDFUNCTION() - diff --git a/cmake/ctest.cmake b/cmake/ctest.cmake index 08852a366..fde7e1632 100644 --- a/cmake/ctest.cmake +++ b/cmake/ctest.cmake @@ -2,7 +2,7 @@ INCLUDE(${MYSQL_CMAKE_SCRIPT_DIR}/cmake_parse_arguments.cmake) MACRO(MY_ADD_TEST name) - ADD_TEST(${name} ${name}-t) + ADD_TEST(NAME ${name} COMMAND ${name}-t CONFIGURATIONS default_ignore) ENDMACRO() MACRO (MY_ADD_TESTS) diff --git a/cmake/maintainer.cmake b/cmake/maintainer.cmake index 0541cca86..4e902d7fe 100644 --- a/cmake/maintainer.cmake +++ b/cmake/maintainer.cmake @@ -14,54 +14,32 @@ # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # Common warning flags for GCC, G++, Clang and Clang++ -SET(MY_WARNING_FLAGS "-Wall -Wextra -Wformat-security -Wno-init-self") -MY_CHECK_C_COMPILER_FLAG("-Wvla") # Requires GCC 4.3+ or Clang -IF(HAVE_C__Wvla) - SET(MY_WARNING_FLAGS "${MY_WARNING_FLAGS} -Wvla") -ENDIF() - -MY_CHECK_C_COMPILER_FLAG("-Wno-format-truncation") -IF(HAVE_C__Wno_format_truncation) - SET(MY_WARNING_FLAGS "${MY_WARNING_FLAGS} -Wno-format-truncation") -ENDIF() - -# Common warning flags for GCC and Clang -SET(MY_C_WARNING_FLAGS - "${MY_WARNING_FLAGS} -Wwrite-strings -Wdeclaration-after-statement") - -# Common warning flags for G++ and Clang++ -SET(MY_CXX_WARNING_FLAGS - "${MY_WARNING_FLAGS} -Woverloaded-virtual -Wno-unused-parameter") - -# Extra warning flags for Clang++ -IF(CMAKE_CXX_COMPILER_ID MATCHES "Clang") - SET(MY_CXX_WARNING_FLAGS - "${MY_CXX_WARNING_FLAGS} -Wno-null-conversion -Wno-unused-private-field") -ENDIF() - -# Turn on Werror (warning => error) when using maintainer mode. -IF(MYSQL_MAINTAINER_MODE MATCHES "ERR") - SET(MY_C_WARNING_FLAGS "${MY_C_WARNING_FLAGS} -DFORCE_INIT_OF_VARS -Werror") - SET(MY_CXX_WARNING_FLAGS "${MY_CXX_WARNING_FLAGS} -DFORCE_INIT_OF_VARS -Werror") -ENDIF() - -# Set warning flags for GCC/Clang -IF(CMAKE_C_COMPILER_ID MATCHES "GNU|Clang") - SET(MY_MAINTAINER_C_WARNINGS "${MY_C_WARNING_FLAGS}") -ENDIF() -# Set warning flags for G++/Clang++ -IF(CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang") - SET(MY_MAINTAINER_CXX_WARNINGS "${MY_CXX_WARNING_FLAGS}") -ENDIF() +SET(MY_WARNING_FLAGS + -Wall + -Wdeclaration-after-statement + -Wextra + -Wformat-security + -Wno-format-truncation + -Wno-init-self + -Wno-nonnull-compare + -Wno-null-conversion + -Wno-unused-parameter + -Wno-unused-private-field + -Woverloaded-virtual + -Wvla + -Wwrite-strings + ) IF(MYSQL_MAINTAINER_MODE MATCHES "ON") - SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${MY_MAINTAINER_C_WARNINGS}") - SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${MY_MAINTAINER_CXX_WARNINGS}") + SET(WHERE) ELSEIF(MYSQL_MAINTAINER_MODE MATCHES "AUTO") - SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} ${MY_MAINTAINER_C_WARNINGS}") - SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} ${MY_MAINTAINER_CXX_WARNINGS}") + SET(WHERE DEBUG) ENDIF() +FOREACH(F ${MY_WARNING_FLAGS}) + MY_CHECK_AND_SET_COMPILER_FLAG(${F} ${WHERE}) +ENDFOREACH() + IF(CMAKE_C_COMPILER_ID MATCHES "GNU") STRING(REPLACE " -E " " -E -dDI " CMAKE_C_CREATE_PREPROCESSED_SOURCE ${CMAKE_C_CREATE_PREPROCESSED_SOURCE}) ENDIF() diff --git a/cmake/wsrep.cmake b/cmake/wsrep.cmake index b5dc8b9f1..9fa127380 100644 --- a/cmake/wsrep.cmake +++ b/cmake/wsrep.cmake @@ -26,7 +26,7 @@ ENDIF() OPTION(WITH_WSREP "WSREP replication API (to use, e.g. Galera Replication library)" ${with_wsrep_default}) # Set the patch version -SET(WSREP_PATCH_VERSION "21") +SET(WSREP_PATCH_VERSION "23") # Obtain wsrep API version FILE(STRINGS "${MySQL_SOURCE_DIR}/wsrep/wsrep_api.h" WSREP_API_VERSION diff --git a/configure.cmake b/configure.cmake index a1cddbb37..df180e729 100644 --- a/configure.cmake +++ b/configure.cmake @@ -1111,6 +1111,9 @@ CHECK_INCLUDE_FILE(ucontext.h HAVE_UCONTEXT_H) IF(NOT HAVE_UCONTEXT_H) CHECK_INCLUDE_FILE(sys/ucontext.h HAVE_UCONTEXT_H) ENDIF() +IF(HAVE_UCONTEXT_H) + CHECK_FUNCTION_EXISTS(makecontext HAVE_UCONTEXT_H) +ENDIF() CHECK_STRUCT_HAS_MEMBER("struct timespec" tv_sec "time.h" STRUCT_TIMESPEC_HAS_TV_SEC) CHECK_STRUCT_HAS_MEMBER("struct timespec" tv_nsec "time.h" STRUCT_TIMESPEC_HAS_TV_NSEC) diff --git a/extra/mariabackup/CMakeLists.txt b/extra/mariabackup/CMakeLists.txt index ac1546066..aa05b3615 100644 --- a/extra/mariabackup/CMakeLists.txt +++ b/extra/mariabackup/CMakeLists.txt @@ -52,7 +52,7 @@ ELSE() SET(NT_SERVICE_SOURCE) ENDIF() -ADD_DEFINITIONS(-DPCRE_STATIC=1) +ADD_DEFINITIONS(-DPCRE_STATIC=1 -DHAVE_OPENSSL=1) MYSQL_ADD_EXECUTABLE(mariabackup xtrabackup.cc @@ -61,7 +61,7 @@ MYSQL_ADD_EXECUTABLE(mariabackup datasink.c ds_buffer.c ds_compress.c - ds_local.c + ds_local.cc ds_stdout.c ds_tmpfile.c ds_xbstream.c @@ -98,7 +98,7 @@ ENDIF() ######################################################################## MYSQL_ADD_EXECUTABLE(mbstream ds_buffer.c - ds_local.c + ds_local.cc ds_stdout.c datasink.c xbstream.c @@ -112,6 +112,7 @@ TARGET_LINK_LIBRARIES(mbstream mysys crc ) +ADD_DEPENDENCIES(mbstream GenError) IF(MSVC) SET_TARGET_PROPERTIES(mbstream PROPERTIES LINK_FLAGS setargv.obj) diff --git a/extra/mariabackup/backup_copy.cc b/extra/mariabackup/backup_copy.cc index c019209fa..d3253348d 100644 --- a/extra/mariabackup/backup_copy.cc +++ b/extra/mariabackup/backup_copy.cc @@ -975,6 +975,9 @@ copy_file(ds_ctxt_t *datasink, datafile_cur_t cursor; xb_fil_cur_result_t res; const char *action; + const char *dst_path = + (xtrabackup_copy_back || xtrabackup_move_back)? + dst_file_path : trim_dotslash(dst_file_path); if (!datafile_open(src_file_path, &cursor, thread_n)) { goto error_close; @@ -982,8 +985,7 @@ copy_file(ds_ctxt_t *datasink, strncpy(dst_name, cursor.rel_path, sizeof(dst_name)); - dstfile = ds_open(datasink, trim_dotslash(dst_file_path), - &cursor.statinfo); + dstfile = ds_open(datasink, dst_path, &cursor.statinfo); if (dstfile == NULL) { msg("[%02u] error: " "cannot open the destination stream for %s\n", diff --git a/extra/mariabackup/backup_mysql.cc b/extra/mariabackup/backup_mysql.cc index 6f425e941..7f0ad8a83 100644 --- a/extra/mariabackup/backup_mysql.cc +++ b/extra/mariabackup/backup_mysql.cc @@ -91,7 +91,7 @@ time_t history_lock_time; MYSQL *mysql_connection; -my_bool opt_ssl_verify_server_cert; +extern my_bool opt_ssl_verify_server_cert, opt_use_ssl; MYSQL * xb_mysql_connect() @@ -477,7 +477,7 @@ get_mysql_vars(MYSQL *connection) innodb_data_file_path_var, MYF(MY_FAE)); } - if (innodb_data_home_dir_var && *innodb_data_home_dir_var) { + if (innodb_data_home_dir_var) { innobase_data_home_dir = my_strdup( innodb_data_home_dir_var, MYF(MY_FAE)); } @@ -1521,6 +1521,44 @@ write_xtrabackup_info(MYSQL *connection) extern const char *innodb_checksum_algorithm_names[]; +#ifdef _WIN32 +#include +#endif + +static std::string make_local_paths(const char *data_file_path) +{ + if (strchr(data_file_path, '/') == 0 +#ifdef _WIN32 + && strchr(data_file_path, '\\') == 0 +#endif + ){ + return std::string(data_file_path); + } + + std::ostringstream buf; + + char *dup = strdup(innobase_data_file_path); + ut_a(dup); + char *p; + char * token = strtok_r(dup, ";", &p); + while (token) { + if (buf.tellp()) + buf << ";"; + + char *fname = strrchr(token, '/'); +#ifdef _WIN32 + fname = std::max(fname,strrchr(token, '\\')); +#endif + if (fname) + buf << fname + 1; + else + buf << token; + token = strtok_r(NULL, ";", &p); + } + free(dup); + return buf.str(); +} + bool write_backup_config_file() { int rc= backup_file_printf("backup-my.cnf", @@ -1541,7 +1579,7 @@ bool write_backup_config_file() "%s\n", innodb_checksum_algorithm_names[srv_checksum_algorithm], innodb_checksum_algorithm_names[srv_log_checksum_algorithm], - innobase_data_file_path, + make_local_paths(innobase_data_file_path).c_str(), srv_n_log_files, innobase_log_file_size, srv_page_size, diff --git a/extra/mariabackup/common.h b/extra/mariabackup/common.h index 7b1dfd7a0..340ad66e2 100644 --- a/extra/mariabackup/common.h +++ b/extra/mariabackup/common.h @@ -27,7 +27,9 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA #include -# define fil_is_user_tablespace_id(i) ((i) > srv_undo_tablespaces_open) +/** Determine if (i) is a user tablespace id or not. */ +# define fil_is_user_tablespace_id(i) (i != 0 \ + && !srv_is_undo_tablespace(i)) #ifdef _MSC_VER #define stat _stati64 diff --git a/extra/mariabackup/datasink.c b/extra/mariabackup/datasink.c index 460e0e8ca..1459da2fb 100644 --- a/extra/mariabackup/datasink.c +++ b/extra/mariabackup/datasink.c @@ -108,7 +108,7 @@ Write to a datasink file. int ds_write(ds_file_t *file, const void *buf, size_t len) { - return file->datasink->write(file, buf, len); + return file->datasink->write(file, (const uchar *)buf, len); } /************************************************************************ diff --git a/extra/mariabackup/datasink.h b/extra/mariabackup/datasink.h index 8bf1321aa..5962e9ba4 100644 --- a/extra/mariabackup/datasink.h +++ b/extra/mariabackup/datasink.h @@ -48,7 +48,7 @@ typedef struct { struct datasink_struct { ds_ctxt_t *(*init)(const char *root); ds_file_t *(*open)(ds_ctxt_t *ctxt, const char *path, MY_STAT *stat); - int (*write)(ds_file_t *file, const void *buf, size_t len); + int (*write)(ds_file_t *file, const unsigned char *buf, size_t len); int (*close)(ds_file_t *file); void (*deinit)(ds_ctxt_t *ctxt); }; diff --git a/extra/mariabackup/ds_buffer.c b/extra/mariabackup/ds_buffer.c index 4bb314c0f..8e13e8789 100644 --- a/extra/mariabackup/ds_buffer.c +++ b/extra/mariabackup/ds_buffer.c @@ -45,7 +45,7 @@ typedef struct { static ds_ctxt_t *buffer_init(const char *root); static ds_file_t *buffer_open(ds_ctxt_t *ctxt, const char *path, MY_STAT *mystat); -static int buffer_write(ds_file_t *file, const void *buf, size_t len); +static int buffer_write(ds_file_t *file, const uchar *buf, size_t len); static int buffer_close(ds_file_t *file); static void buffer_deinit(ds_ctxt_t *ctxt); @@ -119,7 +119,7 @@ buffer_open(ds_ctxt_t *ctxt, const char *path, MY_STAT *mystat) } static int -buffer_write(ds_file_t *file, const void *buf, size_t len) +buffer_write(ds_file_t *file, const uchar *buf, size_t len) { ds_buffer_file_t *buffer_file; @@ -142,7 +142,7 @@ buffer_write(ds_file_t *file, const void *buf, size_t len) buffer_file->pos = 0; - buf = (const char *) buf + bytes; + buf += bytes; len -= bytes; } else { /* We don't have any buffered bytes, just write diff --git a/extra/mariabackup/ds_compress.c b/extra/mariabackup/ds_compress.c index 15801c8ab..88f508573 100644 --- a/extra/mariabackup/ds_compress.c +++ b/extra/mariabackup/ds_compress.c @@ -65,7 +65,7 @@ extern ulonglong xtrabackup_compress_chunk_size; static ds_ctxt_t *compress_init(const char *root); static ds_file_t *compress_open(ds_ctxt_t *ctxt, const char *path, MY_STAT *mystat); -static int compress_write(ds_file_t *file, const void *buf, size_t len); +static int compress_write(ds_file_t *file, const uchar *buf, size_t len); static int compress_close(ds_file_t *file); static void compress_deinit(ds_ctxt_t *ctxt); @@ -178,7 +178,7 @@ compress_open(ds_ctxt_t *ctxt, const char *path, MY_STAT *mystat) static int -compress_write(ds_file_t *file, const void *buf, size_t len) +compress_write(ds_file_t *file, const uchar *buf, size_t len) { ds_compress_file_t *comp_file; ds_compress_ctxt_t *comp_ctxt; diff --git a/extra/mariabackup/ds_local.c b/extra/mariabackup/ds_local.c deleted file mode 100644 index 3e2b1e012..000000000 --- a/extra/mariabackup/ds_local.c +++ /dev/null @@ -1,151 +0,0 @@ -/****************************************************** -Copyright (c) 2011-2013 Percona LLC and/or its affiliates. - -Local datasink implementation for XtraBackup. - -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 Street, Fifth Floor, Boston, MA 02110-1301, USA - -*******************************************************/ - -#include -#include -#include -#include "common.h" -#include "datasink.h" - -typedef struct { - File fd; -} ds_local_file_t; - -static ds_ctxt_t *local_init(const char *root); -static ds_file_t *local_open(ds_ctxt_t *ctxt, const char *path, - MY_STAT *mystat); -static int local_write(ds_file_t *file, const void *buf, size_t len); -static int local_close(ds_file_t *file); -static void local_deinit(ds_ctxt_t *ctxt); - -datasink_t datasink_local = { - &local_init, - &local_open, - &local_write, - &local_close, - &local_deinit -}; - -static -ds_ctxt_t * -local_init(const char *root) -{ - ds_ctxt_t *ctxt; - - if (my_mkdir(root, 0777, MYF(0)) < 0 - && my_errno != EEXIST && my_errno != EISDIR) - { - char errbuf[MYSYS_STRERROR_SIZE]; - my_strerror(errbuf, sizeof(errbuf),my_errno); - my_error(EE_CANT_MKDIR, MYF(ME_BELL | ME_WAITTANG), - root, my_errno,errbuf, my_errno); - return NULL; - } - - ctxt = my_malloc(sizeof(ds_ctxt_t), MYF(MY_FAE)); - - ctxt->root = my_strdup(root, MYF(MY_FAE)); - - return ctxt; -} - -static -ds_file_t * -local_open(ds_ctxt_t *ctxt, const char *path, - MY_STAT *mystat __attribute__((unused))) -{ - char fullpath[FN_REFLEN]; - char dirpath[FN_REFLEN]; - size_t dirpath_len; - size_t path_len; - ds_local_file_t *local_file; - ds_file_t *file; - File fd; - - fn_format(fullpath, path, ctxt->root, "", MYF(MY_RELATIVE_PATH)); - - /* Create the directory if needed */ - dirname_part(dirpath, fullpath, &dirpath_len); - if (my_mkdir(dirpath, 0777, MYF(0)) < 0 && my_errno != EEXIST) { - char errbuf[MYSYS_STRERROR_SIZE]; - my_strerror(errbuf, sizeof(errbuf), my_errno); - my_error(EE_CANT_MKDIR, MYF(ME_BELL | ME_WAITTANG), - dirpath, my_errno, errbuf); - return NULL; - } - - fd = my_create(fullpath, 0, O_WRONLY | O_BINARY | O_EXCL | O_NOFOLLOW, - MYF(MY_WME)); - if (fd < 0) { - return NULL; - } - - path_len = strlen(fullpath) + 1; /* terminating '\0' */ - - file = (ds_file_t *) my_malloc(sizeof(ds_file_t) + - sizeof(ds_local_file_t) + - path_len, - MYF(MY_FAE)); - local_file = (ds_local_file_t *) (file + 1); - - local_file->fd = fd; - - file->path = (char *) local_file + sizeof(ds_local_file_t); - memcpy(file->path, fullpath, path_len); - - file->ptr = local_file; - - return file; -} - -static -int -local_write(ds_file_t *file, const void *buf, size_t len) -{ - File fd = ((ds_local_file_t *) file->ptr)->fd; - - if (!my_write(fd, buf, len, MYF(MY_WME | MY_NABP))) { - posix_fadvise(fd, 0, 0, POSIX_FADV_DONTNEED); - return 0; - } - - return 1; -} - -static -int -local_close(ds_file_t *file) -{ - File fd = ((ds_local_file_t *) file->ptr)->fd; - - my_free(file); - - my_sync(fd, MYF(MY_WME)); - - return my_close(fd, MYF(MY_WME)); -} - -static -void -local_deinit(ds_ctxt_t *ctxt) -{ - my_free(ctxt->root); - my_free(ctxt); -} diff --git a/extra/mariabackup/ds_local.cc b/extra/mariabackup/ds_local.cc new file mode 100644 index 000000000..f1068d251 --- /dev/null +++ b/extra/mariabackup/ds_local.cc @@ -0,0 +1,259 @@ +/****************************************************** +Copyright (c) 2011-2013 Percona LLC and/or its affiliates. + +Local datasink implementation for XtraBackup. + +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 Street, Fifth Floor, Boston, MA 02110-1301, USA + +*******************************************************/ + +#include +#include +#include +#include +#include "common.h" +#include "datasink.h" +#include "univ.i" +#include "fsp0fsp.h" +#ifdef _WIN32 +#include +#endif + +typedef struct { + File fd; + my_bool init_ibd_done; + my_bool is_ibd; + my_bool compressed; + size_t pagesize; +} ds_local_file_t; + +static ds_ctxt_t *local_init(const char *root); +static ds_file_t *local_open(ds_ctxt_t *ctxt, const char *path, + MY_STAT *mystat); +static int local_write(ds_file_t *file, const uchar *buf, size_t len); +static int local_close(ds_file_t *file); +static void local_deinit(ds_ctxt_t *ctxt); + +extern "C" { +datasink_t datasink_local = { + &local_init, + &local_open, + &local_write, + &local_close, + &local_deinit +}; +} + +static +ds_ctxt_t * +local_init(const char *root) +{ + ds_ctxt_t *ctxt; + + if (my_mkdir(root, 0777, MYF(0)) < 0 + && my_errno != EEXIST && my_errno != EISDIR) + { + char errbuf[MYSYS_STRERROR_SIZE]; + my_strerror(errbuf, sizeof(errbuf),my_errno); + my_error(EE_CANT_MKDIR, MYF(ME_BELL | ME_WAITTANG), + root, my_errno,errbuf, my_errno); + return NULL; + } + + ctxt = (ds_ctxt_t *)my_malloc(sizeof(ds_ctxt_t), MYF(MY_FAE)); + + ctxt->root = my_strdup(root, MYF(MY_FAE)); + + return ctxt; +} + +static +ds_file_t * +local_open(ds_ctxt_t *ctxt, const char *path, + MY_STAT *mystat __attribute__((unused))) +{ + char fullpath[FN_REFLEN]; + char dirpath[FN_REFLEN]; + size_t dirpath_len; + size_t path_len; + ds_local_file_t *local_file; + ds_file_t *file; + File fd; + + fn_format(fullpath, path, ctxt->root, "", MYF(MY_RELATIVE_PATH)); + + /* Create the directory if needed */ + dirname_part(dirpath, fullpath, &dirpath_len); + if (my_mkdir(dirpath, 0777, MYF(0)) < 0 && my_errno != EEXIST) { + char errbuf[MYSYS_STRERROR_SIZE]; + my_strerror(errbuf, sizeof(errbuf), my_errno); + my_error(EE_CANT_MKDIR, MYF(ME_BELL | ME_WAITTANG), + dirpath, my_errno, errbuf); + return NULL; + } + + fd = my_create(fullpath, 0, O_WRONLY | O_BINARY | O_EXCL | O_NOFOLLOW, + MYF(MY_WME)); + if (fd < 0) { + return NULL; + } + + path_len = strlen(fullpath) + 1; /* terminating '\0' */ + + file = (ds_file_t *) my_malloc(sizeof(ds_file_t) + + sizeof(ds_local_file_t) + + path_len, + MYF(MY_FAE)); + local_file = (ds_local_file_t *) (file + 1); + + local_file->fd = fd; + local_file->init_ibd_done = 0; + local_file->is_ibd = (path_len > 5) && !strcmp(fullpath + path_len - 5, ".ibd"); + local_file->compressed = 0; + local_file->pagesize = 0; + file->path = (char *) local_file + sizeof(ds_local_file_t); + memcpy(file->path, fullpath, path_len); + + file->ptr = local_file; + + return file; +} + +/* Calculate size of data without trailing zero bytes. */ +static size_t trim_binary_zeros(uchar *buf, size_t pagesize) +{ + size_t i; + for (i = pagesize; (i > 0) && (buf[i - 1] == 0); i--) {}; + return i; +} + + +/* Write data to the output file, and punch "holes" if needed. */ +static int write_compressed(File fd, uchar *data, size_t len, size_t pagesize) +{ + uchar *ptr = data; + for (size_t written= 0; written < len;) + { + size_t n_bytes = MY_MIN(pagesize, len - written); + size_t datasize= trim_binary_zeros(ptr,n_bytes); + if (datasize > 0) { + if (!my_write(fd, ptr, datasize, MYF(MY_WME | MY_NABP))) + posix_fadvise(fd, 0, 0, POSIX_FADV_DONTNEED); + else + return 1; + } + if (datasize < n_bytes) { + /* This punches a "hole" in the file. */ + size_t hole_bytes = n_bytes - datasize; + if (my_seek(fd, hole_bytes, MY_SEEK_CUR, MYF(MY_WME | MY_NABP)) + == MY_FILEPOS_ERROR) + return 1; + } + written += n_bytes; + ptr += n_bytes; + } + return 0; +} + + +/* Calculate Innodb tablespace specific data, when first page is written. + We're interested in page compression and page size. +*/ +static void init_ibd_data(ds_local_file_t *local_file, const uchar *buf, size_t len) +{ + if (len < FIL_PAGE_DATA + FSP_SPACE_FLAGS) { + /* Weird, bail out.*/ + return; + } + + ulint flags = mach_read_from_4(&buf[FIL_PAGE_DATA + FSP_SPACE_FLAGS]); + ulint ssize = FSP_FLAGS_GET_PAGE_SSIZE(flags); + local_file->pagesize= ssize == 0 ? UNIV_PAGE_SIZE_ORIG : ((UNIV_ZIP_SIZE_MIN >> 1) << ssize); + local_file->compressed = (my_bool)FSP_FLAGS_HAS_PAGE_COMPRESSION(flags); + +#if defined(_WIN32) && (MYSQL_VERSION_ID > 100200) + /* Make compressed file sparse, on Windows. + In 10.1, we do not use sparse files. */ + if (local_file->compressed) { + HANDLE handle= my_get_osfhandle(local_file->fd); + if (!DeviceIoControl(handle, FSCTL_SET_SPARSE, NULL, 0, NULL, 0, NULL, 0)) { + fprintf(stderr, "Warning: cannot make file sparse"); + local_file->compressed = 0; + } + } +#endif +} + + +static +int +local_write(ds_file_t *file, const uchar *buf, size_t len) +{ + uchar *b = (uchar*)buf; + ds_local_file_t *local_file= (ds_local_file_t *)file->ptr; + File fd = local_file->fd; + + if (local_file->is_ibd && !local_file->init_ibd_done) { + init_ibd_data(local_file, b , len); + local_file->init_ibd_done= 1; + } + + if (local_file->compressed) { + return write_compressed(fd, b, len, local_file->pagesize); + } + + if (!my_write(fd, b , len, MYF(MY_WME | MY_NABP))) { + posix_fadvise(fd, 0, 0, POSIX_FADV_DONTNEED); + return 0; + } + return 1; +} + +/* Set EOF at file's current position.*/ +static int set_eof(File fd) +{ +#ifdef _WIN32 + return !SetEndOfFile(my_get_osfhandle(fd)); +#elif defined(HAVE_FTRUNCATE) + return ftruncate(fd, my_tell(fd, MYF(MY_WME))); +#else +#error no ftruncate +#endif +} + + +static +int +local_close(ds_file_t *file) +{ + ds_local_file_t *local_file= (ds_local_file_t *)file->ptr; + File fd = local_file->fd; + int ret= 0; + + if (local_file->compressed) { + ret = set_eof(fd); + } + + my_close(fd, MYF(MY_WME)); + my_free(file); + return ret; +} + +static +void +local_deinit(ds_ctxt_t *ctxt) +{ + my_free(ctxt->root); + my_free(ctxt); +} diff --git a/extra/mariabackup/ds_local.h b/extra/mariabackup/ds_local.h index b0f0f0403..e30906b57 100644 --- a/extra/mariabackup/ds_local.h +++ b/extra/mariabackup/ds_local.h @@ -23,6 +23,12 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA #include "datasink.h" -extern datasink_t datasink_local; +#ifdef __cplusplus +extern "C" +#else +extern +#endif + +datasink_t datasink_local; #endif diff --git a/extra/mariabackup/ds_stdout.c b/extra/mariabackup/ds_stdout.c index 91a514ddf..391a34551 100644 --- a/extra/mariabackup/ds_stdout.c +++ b/extra/mariabackup/ds_stdout.c @@ -30,7 +30,7 @@ typedef struct { static ds_ctxt_t *stdout_init(const char *root); static ds_file_t *stdout_open(ds_ctxt_t *ctxt, const char *path, MY_STAT *mystat); -static int stdout_write(ds_file_t *file, const void *buf, size_t len); +static int stdout_write(ds_file_t *file, const uchar *buf, size_t len); static int stdout_close(ds_file_t *file); static void stdout_deinit(ds_ctxt_t *ctxt); @@ -91,7 +91,7 @@ stdout_open(ds_ctxt_t *ctxt __attribute__((unused)), static int -stdout_write(ds_file_t *file, const void *buf, size_t len) +stdout_write(ds_file_t *file, const uchar *buf, size_t len) { File fd = ((ds_stdout_file_t *) file->ptr)->fd; diff --git a/extra/mariabackup/ds_tmpfile.c b/extra/mariabackup/ds_tmpfile.c index b039d83ba..27a8d9688 100644 --- a/extra/mariabackup/ds_tmpfile.c +++ b/extra/mariabackup/ds_tmpfile.c @@ -41,7 +41,7 @@ typedef struct { static ds_ctxt_t *tmpfile_init(const char *root); static ds_file_t *tmpfile_open(ds_ctxt_t *ctxt, const char *path, MY_STAT *mystat); -static int tmpfile_write(ds_file_t *file, const void *buf, size_t len); +static int tmpfile_write(ds_file_t *file, const uchar *buf, size_t len); static int tmpfile_close(ds_file_t *file); static void tmpfile_deinit(ds_ctxt_t *ctxt); @@ -143,7 +143,7 @@ tmpfile_open(ds_ctxt_t *ctxt, const char *path, } static int -tmpfile_write(ds_file_t *file, const void *buf, size_t len) +tmpfile_write(ds_file_t *file, const uchar *buf, size_t len) { File fd = ((ds_tmp_file_t *) file->ptr)->fd; diff --git a/extra/mariabackup/ds_xbstream.c b/extra/mariabackup/ds_xbstream.c index 42924a72d..544929fb2 100644 --- a/extra/mariabackup/ds_xbstream.c +++ b/extra/mariabackup/ds_xbstream.c @@ -41,7 +41,7 @@ General streaming interface */ static ds_ctxt_t *xbstream_init(const char *root); static ds_file_t *xbstream_open(ds_ctxt_t *ctxt, const char *path, MY_STAT *mystat); -static int xbstream_write(ds_file_t *file, const void *buf, size_t len); +static int xbstream_write(ds_file_t *file, const uchar *buf, size_t len); static int xbstream_close(ds_file_t *file); static void xbstream_deinit(ds_ctxt_t *ctxt); @@ -166,7 +166,7 @@ xbstream_open(ds_ctxt_t *ctxt, const char *path, MY_STAT *mystat) static int -xbstream_write(ds_file_t *file, const void *buf, size_t len) +xbstream_write(ds_file_t *file, const uchar *buf, size_t len) { ds_stream_file_t *stream_file; xb_wstream_file_t *xbstream_file; diff --git a/extra/mariabackup/innobackupex.cc b/extra/mariabackup/innobackupex.cc index 7e97b2584..a134abb31 100644 --- a/extra/mariabackup/innobackupex.cc +++ b/extra/mariabackup/innobackupex.cc @@ -255,7 +255,7 @@ static struct my_option ibx_long_options[] = {"galera-info", OPT_GALERA_INFO, "This options creates the " "xtrabackup_galera_info file which contains the local node state at " "the time of the backup. Option should be used when performing the " - "backup of Percona-XtraDB-Cluster. Has no effect when backup locks " + "backup of MariaDB Galera Cluster. Has no effect when backup locks " "are used to create the backup.", (uchar *) &opt_ibx_galera_info, (uchar *) &opt_ibx_galera_info, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, diff --git a/extra/mariabackup/xbcloud.cc b/extra/mariabackup/xbcloud.cc index 56661b03d..878b4c810 100644 --- a/extra/mariabackup/xbcloud.cc +++ b/extra/mariabackup/xbcloud.cc @@ -443,9 +443,7 @@ int parse_args(int argc, char **argv) exit(EXIT_FAILURE); } - if (load_defaults("my", load_default_groups, &argc, &argv)) { - exit(EXIT_FAILURE); - } + load_defaults_or_exit("my", load_default_groups, &argc, &argv); if (handle_options(&argc, &argv, my_long_options, get_one_option)) { exit(EXIT_FAILURE); diff --git a/extra/mariabackup/xtrabackup.cc b/extra/mariabackup/xtrabackup.cc index 2228e542d..84f57bde6 100644 --- a/extra/mariabackup/xtrabackup.cc +++ b/extra/mariabackup/xtrabackup.cc @@ -203,6 +203,10 @@ static ulong max_buf_pool_modified_pct; /* Ignored option (--log) for MySQL option compatibility */ char* log_ignored_opt = NULL; + +extern my_bool opt_use_ssl; +my_bool opt_ssl_verify_server_cert; + /* === metadata of backup === */ #define XTRABACKUP_METADATA_FILENAME "xtrabackup_checkpoints" char metadata_type[30] = ""; /*[full-backuped|log-applied| @@ -360,9 +364,6 @@ uint opt_safe_slave_backup_timeout = 0; const char *opt_history = NULL; -#if defined(HAVE_OPENSSL) -my_bool opt_ssl_verify_server_cert = FALSE; -#endif /* Whether xtrabackup_binlog_info should be created on recovery */ static bool recover_binlog_info; @@ -453,6 +454,7 @@ typedef struct { } data_thread_ctxt_t; /* ======== for option and variables ======== */ +#include <../../client/client_priv.h> enum options_xtrabackup { @@ -528,8 +530,6 @@ enum options_xtrabackup OPT_INNODB_LOG_CHECKSUM_ALGORITHM, OPT_XTRA_INCREMENTAL_FORCE_SCAN, OPT_DEFAULTS_GROUP, - OPT_OPEN_FILES_LIMIT, - OPT_PLUGIN_DIR, OPT_PLUGIN_LOAD, OPT_INNODB_ENCRYPT_LOG, OPT_CLOSE_FILES, @@ -694,7 +694,7 @@ struct my_option xb_client_options[] = {"galera-info", OPT_GALERA_INFO, "This options creates the " "xtrabackup_galera_info file which contains the local node state at " "the time of the backup. Option should be used when performing the " - "backup of Percona-XtraDB-Cluster. Has no effect when backup locks " + "backup of MariaDB Galera Cluster. Has no effect when backup locks " "are used to create the backup.", (uchar *) &opt_galera_info, (uchar *) &opt_galera_info, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, @@ -915,9 +915,9 @@ struct my_option xb_client_options[] = {"secure-auth", OPT_XB_SECURE_AUTH, "Refuse client connecting to server if it" " uses old (pre-4.1.1) protocol.", &opt_secure_auth, &opt_secure_auth, 0, GET_BOOL, NO_ARG, 1, 0, 0, 0, 0, 0}, - +#define MYSQL_CLIENT #include "sslopt-longopts.h" - +#undef MYSQL_CLIENT { 0, 0, 0, 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0} }; @@ -1388,7 +1388,9 @@ xb_get_one_option(int optid, } } break; +#define MYSQL_CLIENT #include "sslopt-case.h" +#undef MYSQL_CLIENT case '?': usage(); @@ -3079,6 +3081,85 @@ xb_fil_io_init(void) fsp_init(); } +/** Assign srv_undo_space_id_start variable if there are undo tablespace present. +Read the TRX_SYS page from ibdata1 file and get the minimum space id from +the first slot rollback segments of TRX_SYS_PAGE_NO. +@retval DB_ERROR if file open or page read failed. +@retval DB_SUCCESS if srv_undo_space_id assigned successfully. */ +static dberr_t xb_assign_undo_space_start() +{ + ulint dirnamelen; + char name[1000]; + pfs_os_file_t file; + byte* buf; + byte* page; + ibool ret; + dberr_t error = DB_SUCCESS; + ulint space, page_no; + + if (srv_undo_tablespaces == 0) { + return error; + } + + srv_normalize_path_for_win(srv_data_home); + dirnamelen = strlen(srv_data_home); + memcpy(name, srv_data_home, dirnamelen); + + if (dirnamelen && name[dirnamelen - 1] != SRV_PATH_SEPARATOR) { + name[dirnamelen++] = SRV_PATH_SEPARATOR; + } + + ut_snprintf(name + dirnamelen, (sizeof name) - dirnamelen, + "%s", "ibdata1"); + + file = os_file_create(innodb_file_data_key, name, OS_FILE_OPEN, + OS_FILE_NORMAL, OS_DATA_FILE, &ret, 0); + + if (ret == FALSE) { + fprintf(stderr, "InnoDB: Error in opening %s\n", name); + return DB_ERROR; + } + + buf = static_cast(ut_malloc(2 * UNIV_PAGE_SIZE)); + page = static_cast(ut_align(buf, UNIV_PAGE_SIZE)); + +retry: + ret = os_file_read(file, page, TRX_SYS_PAGE_NO * UNIV_PAGE_SIZE, + UNIV_PAGE_SIZE); + + if (!ret) { + fprintf(stderr, "InnoDB: Reading TRX_SYS page failed."); + error = DB_ERROR; + goto func_exit; + } + + /* TRX_SYS page can't be compressed or encrypted. */ + if (buf_page_is_corrupted(false, page, 0, NULL)) { + goto retry; + } + + /* 0th slot always points to system tablespace. + 1st slot should point to first undotablespace which is minimum. */ + + page_no = mach_read_ulint(TRX_SYS + TRX_SYS_RSEGS + + TRX_SYS_RSEG_SLOT_SIZE + + TRX_SYS_RSEG_PAGE_NO + page, MLOG_4BYTES); + ut_ad(page_no != FIL_NULL); + + space = mach_read_ulint(TRX_SYS + TRX_SYS_RSEGS + + TRX_SYS_RSEG_SLOT_SIZE + + TRX_SYS_RSEG_SPACE + page, MLOG_4BYTES); + + srv_undo_space_id_start = space; + +func_exit: + ut_free(buf); + ret = os_file_close(file); + ut_a(ret); + + return error; +} + /**************************************************************************** Populates the tablespace memory cache by scanning for and opening data files. @returns DB_SUCCESS or error code.*/ @@ -3132,6 +3213,12 @@ xb_load_tablespaces(void) /* Add separate undo tablespaces to fil_system */ + err = xb_assign_undo_space_start(); + + if (err != DB_SUCCESS) { + return err; + } + err = srv_undo_tablespaces_init(FALSE, TRUE, srv_undo_tablespaces, @@ -4881,8 +4968,6 @@ xtrabackup_apply_delta( posix_fadvise(src_file, 0, 0, POSIX_FADV_SEQUENTIAL); - os_file_set_nocache(src_file, src_path, "OPEN"); - dst_file = xb_delta_open_matching_space( dbname, space_name, info.space_id, info.zip_size, dst_path, sizeof(dst_path), &success); @@ -4893,8 +4978,6 @@ xtrabackup_apply_delta( posix_fadvise(dst_file, 0, 0, POSIX_FADV_DONTNEED); - os_file_set_nocache(dst_file, dst_path, "OPEN"); - /* allocate buffer for incremental backup (4096 pages) */ incremental_buffer_base = static_cast (ut_malloc((page_size / 4 + 1) * @@ -4994,6 +5077,13 @@ xtrabackup_apply_delta( } } + /* Free file system buffer cache after the batch was written. */ +#ifdef __linux__ + os_file_flush_func(dst_file); +#endif + posix_fadvise(dst_file, 0, 0, POSIX_FADV_DONTNEED); + + incremental_buffers++; } @@ -6350,10 +6440,8 @@ handle_options(int argc, char **argv, char ***argv_client, char ***argv_server) *argv_client = argv; *argv_server = argv; - if (load_defaults(conf_file, xb_server_default_groups, - &argc_server, argv_server)) { - exit(EXIT_FAILURE); - } + load_defaults_or_exit(conf_file, xb_server_default_groups, + &argc_server, argv_server); int n; for (n = 0; (*argv_server)[n]; n++) {}; @@ -6403,10 +6491,8 @@ handle_options(int argc, char **argv, char ***argv_client, char ***argv_server) xb_server_options, xb_get_one_option))) exit(ho_error); - if (load_defaults(conf_file, xb_client_default_groups, - &argc_client, argv_client)) { - exit(EXIT_FAILURE); - } + load_defaults_or_exit(conf_file, xb_client_default_groups, + &argc_client, argv_client); for (n = 0; (*argv_client)[n]; n++) {}; argc_client = n; @@ -6618,6 +6704,10 @@ int main(int argc, char **argv) xtrabackup_incremental = NULL; } + if (xtrabackup_stream && !xtrabackup_backup) { + msg("Warning: --stream parameter is ignored, it only works together with --backup.\n"); + } + if (!xb_init()) { exit(EXIT_FAILURE); } diff --git a/extra/my_print_defaults.c b/extra/my_print_defaults.c index 78940e02c..07c95a79d 100644 --- a/extra/my_print_defaults.c +++ b/extra/my_print_defaults.c @@ -206,6 +206,9 @@ int main(int argc, char **argv) if ((error= load_defaults(config_file, (const char **) load_default_groups, &count, &arguments))) { + my_end(0); + if (error == 4) + return 0; if (verbose && opt_defaults_file_used) { if (error == 1) @@ -216,8 +219,7 @@ int main(int argc, char **argv) fprintf(stderr, "WARNING: Defaults file '%s' is not a regular file!\n", config_file); } - error= 2; - exit(error); + return 2; } for (argument= arguments+1 ; *argument ; argument++) diff --git a/extra/yassl/src/handshake.cpp b/extra/yassl/src/handshake.cpp index 407e4092c..6e181a997 100644 --- a/extra/yassl/src/handshake.cpp +++ b/extra/yassl/src/handshake.cpp @@ -788,6 +788,16 @@ int DoProcessReply(SSL& ssl) needHdr = true; else { buffer >> hdr; + /* + According to RFC 4346 (see "7.4.1.3. Server Hello"), the Server Hello + packet needs to specify the highest supported TLS version, but not + higher than what client requests. YaSSL highest supported version is + TLSv1.1 (=3.2) - if the client requests a higher version, downgrade it + here to 3.2. + See also Appendix E of RFC 5246 (TLS 1.2) + */ + if (hdr.version_.major_ == 3 && hdr.version_.minor_ > 2) + hdr.version_.minor_ = 2; ssl.verifyState(hdr); } diff --git a/include/heap.h b/include/heap.h index 724cf6c5f..e92f649b8 100644 --- a/include/heap.h +++ b/include/heap.h @@ -144,6 +144,7 @@ typedef struct st_heap_share uint key_version; /* Updated on key change */ uint file_version; /* Update on clear */ uint reclength; /* Length of one record */ + uint visible; /* Offset to the visible/deleted mark */ uint changed; uint keys,max_key_length; uint currently_disabled_keys; /* saved value from "keys" when disabled */ diff --git a/include/my_default.h b/include/my_default.h index 0ed94b094..bd3a21f03 100644 --- a/include/my_default.h +++ b/include/my_default.h @@ -45,6 +45,13 @@ 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); + +/** Simplify load_defaults() common use */ +#define load_defaults_or_exit(A, B, C, D) switch (load_defaults(A, B, C, D)) { \ + case 0: break; \ + case 4: my_end(0); exit(0); \ + default: my_end(0); exit(1); } + C_MODE_END #endif /* MY_DEFAULT_INCLUDED */ diff --git a/include/my_global.h b/include/my_global.h index acc54398c..dcfd607b4 100644 --- a/include/my_global.h +++ b/include/my_global.h @@ -593,8 +593,15 @@ typedef SOCKET_SIZE_TYPE size_socket; #ifndef O_CLOEXEC #define O_CLOEXEC 0 #endif +#ifdef __GLIBC__ +#define STR_O_CLOEXEC "e" +#else +#define STR_O_CLOEXEC "" +#endif #ifndef SOCK_CLOEXEC #define SOCK_CLOEXEC 0 +#else +#define HAVE_SOCK_CLOEXEC #endif /* additional file share flags for win32 */ diff --git a/include/my_systemd.h b/include/my_service_manager.h similarity index 72% rename from include/my_systemd.h rename to include/my_service_manager.h index bef755764..4d88e992b 100644 --- a/include/my_systemd.h +++ b/include/my_service_manager.h @@ -16,8 +16,8 @@ */ -#ifndef MY_SYSTEMD_INCLUDED -#define MY_SYSTEMD_INCLUDED +#ifndef MY_SERVICE_MANAGER_INCLUDED +#define MY_SERVICE_MANAGER_INCLUDED #if defined(HAVE_SYSTEMD) && !defined(EMBEDDED_LIBRARY) /* @@ -26,9 +26,14 @@ */ #define __STDC_FORMAT_MACROS #include +/** INTERVAL in seconds followed by printf style status */ +#define service_manager_extend_timeout(INTERVAL, FMTSTR, ...) \ + sd_notifyf(0, "STATUS=" FMTSTR "\nEXTEND_TIMEOUT_USEC=%u\n", ##__VA_ARGS__, INTERVAL * 1000000) + #else #define sd_notify(X, Y) #define sd_notifyf(E, F, ...) +#define service_manager_extend_timeout(I, FMTSTR, ...) #endif -#endif /* MY_SYSTEMD_INCLUDED */ +#endif /* MY_SERVICE_MANAGER_INCLUDED */ diff --git a/include/my_sys.h b/include/my_sys.h index 110a2ee9a..1c5649812 100644 --- a/include/my_sys.h +++ b/include/my_sys.h @@ -112,6 +112,7 @@ typedef struct my_aio_result { #define ME_JUST_INFO 1024 /**< not error but just info */ #define ME_JUST_WARNING 2048 /**< not error but just warning */ #define ME_FATALERROR 4096 /* Fatal statement error */ +#define ME_LOG_AS_WARN 8192 /* is error but error-logged as warning */ /* Bits in last argument to fn_format */ #define MY_REPLACE_DIR 1 /* replace dir in name with 'dir' */ diff --git a/include/my_valgrind.h b/include/my_valgrind.h index e3aa11ee3..c488aaf10 100644 --- a/include/my_valgrind.h +++ b/include/my_valgrind.h @@ -35,6 +35,8 @@ # define MEM_CHECK_DEFINED(a,len) VALGRIND_CHECK_MEM_IS_DEFINED(a,len) #elif defined(__SANITIZE_ADDRESS__) # include +/* How to do manual poisoning: +https://github.com/google/sanitizers/wiki/AddressSanitizerManualPoisoning */ # define MEM_UNDEFINED(a,len) ASAN_UNPOISON_MEMORY_REGION(a,len) # define MEM_NOACCESS(a,len) ASAN_POISON_MEMORY_REGION(a,len) # define MEM_CHECK_ADDRESSABLE(a,len) ((void) 0) diff --git a/include/mysql/psi/mysql_socket.h b/include/mysql/psi/mysql_socket.h index 1dbe8c7eb..fc0a3ce2e 100644 --- a/include/mysql/psi/mysql_socket.h +++ b/include/mysql/psi/mysql_socket.h @@ -562,6 +562,12 @@ inline_mysql_socket_socket (key, (const my_socket*)&mysql_socket.fd, NULL, 0); } #endif + + /* SOCK_CLOEXEC isn't always a number - can't preprocessor compare */ +#if defined(HAVE_FCNTL) && defined(FD_CLOEXEC) && !defined(HAVE_SOCK_CLOEXEC) + (void) fcntl(mysql_socket.fd, F_SETFD, FD_CLOEXEC); +#endif + return mysql_socket; } diff --git a/include/mysql_com.h b/include/mysql_com.h index 678ff0b71..dd55daf77 100644 --- a/include/mysql_com.h +++ b/include/mysql_com.h @@ -1,5 +1,5 @@ /* Copyright (c) 2000, 2011, Oracle and/or its affiliates. - Copyright (c) 2010, 2013, Monty Program Ab + Copyright (c) 2010, 2018, MariaDB 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 diff --git a/include/sql_common.h b/include/sql_common.h index 39b8ce185..9c67034d7 100644 --- a/include/sql_common.h +++ b/include/sql_common.h @@ -1,7 +1,7 @@ #ifndef SQL_COMMON_INCLUDED #define SQL_COMMON_INCLUDED /* Copyright (c) 2003, 2012, Oracle and/or its affiliates. - Copyright (c) 2010, 2012, Monty Program Ab + Copyright (c) 2010, 2018, MariaDB 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 diff --git a/mysql-test/extra/rpl_tests/rpl_implicit_commit_binlog.test b/mysql-test/extra/rpl_tests/rpl_implicit_commit_binlog.test index ed7583137..20c79ed4b 100644 --- a/mysql-test/extra/rpl_tests/rpl_implicit_commit_binlog.test +++ b/mysql-test/extra/rpl_tests/rpl_implicit_commit_binlog.test @@ -32,345 +32,97 @@ INSERT INTO tt_2(ddl_case) VALUES(0); --echo # CHECK IMPLICT COMMIT --echo ######################################################################### SET AUTOCOMMIT= 0; -let $ddl_cases= 43; -while ($ddl_cases >= 1) -{ - --echo -b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- - let $in_temporary= no; - let $ok= yes; - # - # In SBR and MIXED modes, the commit event is usually the third event in the - # binary log: - # - # 1: BEGIN - # 2: INSERT - # 3: COMMIT - # 4: DDL EVENT which triggered the previous commmit. - # - if (`select @@binlog_format = 'STATEMENT' || @@binlog_format = 'MIXED'`) - { - let $commit_event_row_number= 3; - } - # - # In RBR mode, the commit event is usually the fourth event in the binary log: - # - # 1: BEGIN - # 2: TABLE MAP EVENT - # 3: ROW EVENT - # 4: COMMIT - # 5: DDL EVENT which triggered the previous commmit. - # - if (`select @@binlog_format = 'ROW'`) - { - let $commit_event_row_number= 4; - } - - let $first_binlog_position= query_get_value("SHOW MASTER STATUS", Position, 1); - --enable_query_log - eval INSERT INTO tt_1(ddl_case) VALUES ($ddl_cases); - if ($ddl_cases == 43) - { - let $cmd= CREATE FUNCTION myfunc_int RETURNS INTEGER SONAME "$UDF_EXAMPLE_SO"; - } - if ($ddl_cases == 42) - { - let $cmd= DROP FUNCTION myfunc_int; - } - if ($ddl_cases == 41) - { - let $cmd= LOAD INDEX INTO CACHE nt_1 IGNORE LEAVES; - } - if ($ddl_cases == 40) - { - let $cmd= LOAD INDEX INTO CACHE tt_1, tt_2 IGNORE LEAVES; - } - if ($ddl_cases == 39) - { - let $cmd= ANALYZE TABLE nt_1; - } - if ($ddl_cases == 38) - { - let $cmd= CHECK TABLE nt_1; - } - if ($ddl_cases == 37) - { - let $cmd= OPTIMIZE TABLE nt_1; - } - if ($ddl_cases == 36) - { - let $cmd= REPAIR TABLE nt_1; - } - if ($ddl_cases == 35) - { - let $cmd= LOCK TABLES tt_1 WRITE; - } - if ($ddl_cases == 34) - { - let $cmd= UNLOCK TABLES; - } - if ($ddl_cases == 33) - { - let $cmd= CREATE USER 'user'@'localhost'; - } - if ($ddl_cases == 32) - { - let $cmd= GRANT ALL ON *.* TO 'user'@'localhost'; - } - if ($ddl_cases == 31) - { - let $cmd= SET PASSWORD FOR 'user'@'localhost' = PASSWORD('newpass'); - } - if ($ddl_cases == 30) - { - let $cmd= REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'user'@'localhost'; - } - if ($ddl_cases == 29) - { - let $cmd= RENAME USER 'user'@'localhost' TO 'user_new'@'localhost'; - } - if ($ddl_cases == 28) - { - let $cmd= DROP USER 'user_new'@'localhost'; - } - if ($ddl_cases == 27) - { - let $cmd= CREATE EVENT evt ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 HOUR DO SELECT * FROM tt_1; - } - if ($ddl_cases == 26) - { - let $cmd= ALTER EVENT evt COMMENT 'evt'; - } - if ($ddl_cases == 25) - { - let $cmd= DROP EVENT evt; - } - if ($ddl_cases == 24) - { - let $cmd= CREATE TRIGGER tr AFTER INSERT ON tt_1 FOR EACH ROW UPDATE tt_2 SET ddl_case = ddl_case WHERE ddl_case= NEW.ddl_case; - } - if ($ddl_cases == 23) - { - let $cmd= DROP TRIGGER tr; - # - # In RBR mode, due to the trigger the tt_2 is also updated: - # - # 1: BEGIN - # 2: TABLE MAP EVENT - # 3: TABLE MAP EVENT - # 4: ROW EVENT - # 5: COMMIT - # 6: DDL EVENT which triggered the previous commmit. - # - if (`select @@binlog_format = 'ROW'`) - { - let $commit_event_row_number= 5; - } - } - if ($ddl_cases == 22) - { - let $cmd= CREATE FUNCTION fc () RETURNS VARCHAR(64) RETURN "fc"; - } - if ($ddl_cases == 21) - { - let $cmd= ALTER FUNCTION fc COMMENT 'fc'; - } - if ($ddl_cases == 20) - { - let $cmd= DROP FUNCTION fc; - } - if ($ddl_cases == 19) - { - let $cmd= CREATE PROCEDURE pc () UPDATE tt_2 SET ddl_case = ddl_case WHERE ddl_case= NEW.ddl_case; - } - if ($ddl_cases == 18) - { - let $cmd= ALTER PROCEDURE pc COMMENT 'pc'; - } - if ($ddl_cases == 17) - { - let $cmd= DROP PROCEDURE pc; - } - if ($ddl_cases == 16) - { - let $cmd= CREATE VIEW v AS SELECT * FROM tt_1; - } - if ($ddl_cases == 15) - { - let $cmd= ALTER VIEW v AS SELECT * FROM tt_1; - } - if ($ddl_cases == 14) - { - let $cmd= DROP VIEW v; - } - if ($ddl_cases == 13) - { - let $cmd= CREATE INDEX ix ON tt_1(ddl_case); - } - if ($ddl_cases == 12) - { - let $cmd= DROP INDEX ix ON tt_1; - } - if ($ddl_cases == 11) - { - let $cmd= CREATE TEMPORARY TABLE tt_xx (a int); - let $in_temporary= yes; - # In SBR and MIXED modes, the DDL statement is written to the binary log but - # does not commit the current transaction. - # - # 1: BEGIN - # 2: CREATE TEMPORARY - # 3: INSERT - # 4: COMMIT - # - # In RBR the transaction is not committed either and the statement is not - # written to the binary log: - # - # 1: BEGIN - # 2: TABLE MAP EVENT - # 3: ROW EVENT - # 4: COMMIT - # - if (`select @@binlog_format = 'STATEMENT' || @@binlog_format = 'MIXED'` ) - { - let $commit_event_row_number= 4; - } - } - if ($ddl_cases == 10) - { - let $cmd= ALTER TABLE tt_xx ADD COLUMN (b int); - # - # In MIXED mode, the changes are logged as rows and we have what follows: - # - # 1: BEGIN - # 2: TABLE MAP EVENT - # 3: ROW EVENT - # 4: COMMIT - # 5: DDL EVENT which triggered the previous commmit. - # - if (`select @@binlog_format = 'MIXED'`) - { - let $commit_event_row_number= 4; - } - } - if ($ddl_cases == 9) - { - let $cmd= ALTER TABLE tt_xx RENAME new_tt_xx; - # - # In MIXED mode, the changes are logged as rows and we have what follows: - # - # 1: BEGIN - # 2: TABLE MAP EVENT - # 3: ROW EVENT - # 4: COMMIT - # 5: DDL EVENT which triggered the previous commmit. - # - if (`select @@binlog_format = 'MIXED'`) - { - let $commit_event_row_number= 4; - } - } - if ($ddl_cases == 8) - { - let $cmd= DROP TEMPORARY TABLE IF EXISTS new_tt_xx; - let $in_temporary= yes; - # - # In SBR and MIXED modes, the DDL statement is written to the binary log - # but does not commit the current transaction: - # - # In SBR, we have what follows: - # - # 1: BEGIN - # 2: INSERT - # 3: DROP TEMPORARY - # 4: COMMIT - # - # In RBR the transaction is not committed either and the statement is not - # written to the binary log: - # - # 1: BEGIN - # 2: TABLE MAP EVENT - # 3: ROW EVENT - # 4: COMMIT - # - if (`select @@binlog_format = 'STATEMENT' || @@binlog_format = 'ROW'`) - { - let $commit_event_row_number= 4; - } - # In MIXED mode, the changes are logged as rows and we have what follows: - # - # 1: BEGIN - # 2: TABLE MAP EVENT - # 3: ROW EVENT - # 4: DROP TEMPORARY - # 5: COMMIT - # - if (`select @@binlog_format = 'MIXED'`) - { - let $commit_event_row_number= 5; - } - } - if ($ddl_cases == 7) - { - let $cmd= CREATE TABLE tt_xx (a int); - } - if ($ddl_cases == 6) - { - let $cmd= ALTER TABLE tt_xx ADD COLUMN (b int); - } - if ($ddl_cases == 5) - { - let $cmd= RENAME TABLE tt_xx TO new_tt_xx; - } - if ($ddl_cases == 4) - { - let $cmd= TRUNCATE TABLE new_tt_xx; - } - if ($ddl_cases == 3) - { - let $cmd= DROP TABLE IF EXISTS tt_xx, new_tt_xx; - } - if ($ddl_cases == 2) - { - let $cmd= CREATE DATABASE db; - } - if ($ddl_cases == 1) - { - let $cmd= DROP DATABASE IF EXISTS db; - } - --replace_result $UDF_EXAMPLE_SO UDF_EXAMPLE_LIB - --eval $cmd - --disable_query_log - # - # When a temporary table is either created or dropped, there is no implicit - # commit. The flag in_temporary is used to avoid aborting the test in such - # cases. Thus we force the commit. - # - if ($in_temporary == yes) - { - --eval COMMIT - } - let $event_commit= query_get_value("SHOW BINLOG EVENTS FROM $first_binlog_position", Info, $commit_event_row_number); - if (`SELECT SUBSTRING("$event_commit",1,6) != "COMMIT"`) - { - if ($ok == yes) - { - --echo it *does not* commit the current transaction. - --echo $cmd - --echo $event_commit - SHOW BINLOG EVENTS; - exit; - } - } +INSERT INTO tt_1(ddl_case) VALUES (43); +replace_result $UDF_EXAMPLE_SO UDF_EXAMPLE_LIB; +eval CREATE FUNCTION myfunc_int RETURNS INTEGER SONAME "$UDF_EXAMPLE_SO"; +INSERT INTO tt_1(ddl_case) VALUES (42); +DROP FUNCTION myfunc_int; +INSERT INTO tt_1(ddl_case) VALUES (41); +LOAD INDEX INTO CACHE nt_1 IGNORE LEAVES; +INSERT INTO tt_1(ddl_case) VALUES (40); +LOAD INDEX INTO CACHE tt_1, tt_2 IGNORE LEAVES; +INSERT INTO tt_1(ddl_case) VALUES (39); +ANALYZE TABLE nt_1; +INSERT INTO tt_1(ddl_case) VALUES (38); +CHECK TABLE nt_1; +INSERT INTO tt_1(ddl_case) VALUES (37); +OPTIMIZE TABLE nt_1; +INSERT INTO tt_1(ddl_case) VALUES (36); +REPAIR TABLE nt_1; +INSERT INTO tt_1(ddl_case) VALUES (35); +LOCK TABLES tt_1 WRITE; +INSERT INTO tt_1(ddl_case) VALUES (34); +UNLOCK TABLES; +INSERT INTO tt_1(ddl_case) VALUES (33); +CREATE USER 'user'@'localhost'; +INSERT INTO tt_1(ddl_case) VALUES (32); +GRANT ALL ON *.* TO 'user'@'localhost'; +INSERT INTO tt_1(ddl_case) VALUES (31); +SET PASSWORD FOR 'user'@'localhost' = PASSWORD('newpass'); +INSERT INTO tt_1(ddl_case) VALUES (30); +REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'user'@'localhost'; +INSERT INTO tt_1(ddl_case) VALUES (29); +RENAME USER 'user'@'localhost' TO 'user_new'@'localhost'; +INSERT INTO tt_1(ddl_case) VALUES (28); +DROP USER 'user_new'@'localhost'; +INSERT INTO tt_1(ddl_case) VALUES (27); +CREATE EVENT evt ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 HOUR DO SELECT * FROM tt_1; +INSERT INTO tt_1(ddl_case) VALUES (26); +ALTER EVENT evt COMMENT 'evt'; +INSERT INTO tt_1(ddl_case) VALUES (25); +DROP EVENT evt; +INSERT INTO tt_1(ddl_case) VALUES (24); +CREATE TRIGGER tr AFTER INSERT ON tt_1 FOR EACH ROW UPDATE tt_2 SET ddl_case = ddl_case WHERE ddl_case= NEW.ddl_case; +INSERT INTO tt_1(ddl_case) VALUES (23); +DROP TRIGGER tr; +INSERT INTO tt_1(ddl_case) VALUES (22); +CREATE FUNCTION fc () RETURNS VARCHAR(64) RETURN "fc"; +INSERT INTO tt_1(ddl_case) VALUES (21); +ALTER FUNCTION fc COMMENT 'fc'; +INSERT INTO tt_1(ddl_case) VALUES (20); +DROP FUNCTION fc; +INSERT INTO tt_1(ddl_case) VALUES (19); +CREATE PROCEDURE pc () UPDATE tt_2 SET ddl_case = ddl_case WHERE ddl_case= NEW.ddl_case; +INSERT INTO tt_1(ddl_case) VALUES (18); +ALTER PROCEDURE pc COMMENT 'pc'; +INSERT INTO tt_1(ddl_case) VALUES (17); +DROP PROCEDURE pc; +INSERT INTO tt_1(ddl_case) VALUES (16); +CREATE VIEW v AS SELECT * FROM tt_1; +INSERT INTO tt_1(ddl_case) VALUES (15); +ALTER VIEW v AS SELECT * FROM tt_1; +INSERT INTO tt_1(ddl_case) VALUES (14); +DROP VIEW v; +INSERT INTO tt_1(ddl_case) VALUES (13); +CREATE INDEX ix ON tt_1(ddl_case); +INSERT INTO tt_1(ddl_case) VALUES (12); +DROP INDEX ix ON tt_1; +INSERT INTO tt_1(ddl_case) VALUES (11); +CREATE TEMPORARY TABLE tt_xx (a int); +INSERT INTO tt_1(ddl_case) VALUES (10); +ALTER TABLE tt_xx ADD COLUMN (b int); +INSERT INTO tt_1(ddl_case) VALUES (9); +ALTER TABLE tt_xx RENAME new_tt_xx; +INSERT INTO tt_1(ddl_case) VALUES (8); +DROP TEMPORARY TABLE IF EXISTS new_tt_xx; +INSERT INTO tt_1(ddl_case) VALUES (7); +CREATE TABLE tt_xx (a int); +INSERT INTO tt_1(ddl_case) VALUES (6); +ALTER TABLE tt_xx ADD COLUMN (b int); +INSERT INTO tt_1(ddl_case) VALUES (5); +RENAME TABLE tt_xx TO new_tt_xx; +INSERT INTO tt_1(ddl_case) VALUES (4); +TRUNCATE TABLE new_tt_xx; +INSERT INTO tt_1(ddl_case) VALUES (3); +DROP TABLE IF EXISTS tt_xx, new_tt_xx; +INSERT INTO tt_1(ddl_case) VALUES (2); +CREATE DATABASE db; +INSERT INTO tt_1(ddl_case) VALUES (1); +DROP DATABASE IF EXISTS db; + +source include/show_binlog_events.inc; - --echo -e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - let $binlog_start= $first_binlog_position; - --echo -b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- - --source include/show_binlog_events.inc - --echo -e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --echo - dec $ddl_cases; -} SET AUTOCOMMIT= 1; --echo ################################################################################### diff --git a/mysql-test/include/galera_wait_ready.inc b/mysql-test/include/galera_wait_ready.inc index e20f01fad..a726116f0 100644 --- a/mysql-test/include/galera_wait_ready.inc +++ b/mysql-test/include/galera_wait_ready.inc @@ -1,2 +1,32 @@ -let $wait_condition = SELECT 1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_ready' AND VARIABLE_VALUE = 'ON'; ---source include/wait_condition.inc +# include/galera_wait_ready.inc +# +# Waits for galera node to transition to READY state. +# + +--enable_reconnect +--disable_query_log +--disable_result_log +let $wait_counter = 600; +while ($wait_counter) +{ + --disable_abort_on_error + let $success = `SELECT VARIABLE_VALUE = 'ON' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_ready'`; + --enable_abort_on_error + if ($success) + { + let $wait_counter = 0; + } + if (!$success) + { + real_sleep 0.1; + dec $wait_counter; + } +} + +if (!$success) +{ + die "Server did not transition to READY state"; +} +--disable_reconnect +--enable_query_log +--enable_result_log diff --git a/mysql-test/include/innodb_row_format.combinations b/mysql-test/include/innodb_row_format.combinations new file mode 100644 index 000000000..fb94d61dd --- /dev/null +++ b/mysql-test/include/innodb_row_format.combinations @@ -0,0 +1,8 @@ +[redundant] +innodb_default_row_format=redundant + +[compact] +innodb_default_row_format=compact + +[dynamic] +innodb_default_row_format=dynamic diff --git a/mysql-test/include/innodb_row_format.inc b/mysql-test/include/innodb_row_format.inc new file mode 100644 index 000000000..8c6357e57 --- /dev/null +++ b/mysql-test/include/innodb_row_format.inc @@ -0,0 +1,4 @@ +# The goal of including this file is to enable innodb_default_row_format +# combinations (see include/innodb_row_format.combinations) + +--source include/have_innodb.inc diff --git a/mysql-test/include/maybe_debug.combinations b/mysql-test/include/maybe_debug.combinations new file mode 100644 index 000000000..5ee57c0bf --- /dev/null +++ b/mysql-test/include/maybe_debug.combinations @@ -0,0 +1,5 @@ +[debug] +--enable-gdb + +[release] +--disable-gdb diff --git a/mysql-test/include/maybe_debug.inc b/mysql-test/include/maybe_debug.inc new file mode 100644 index 000000000..2f6c2848f --- /dev/null +++ b/mysql-test/include/maybe_debug.inc @@ -0,0 +1,3 @@ +# include file for test files that can be run with and without debug +# having debug and non-debug tests. +let $have_debug=`select version() like '%debug%'`; diff --git a/mysql-test/include/restart_mysqld.inc b/mysql-test/include/restart_mysqld.inc index a0447280f..940e081c4 100644 --- a/mysql-test/include/restart_mysqld.inc +++ b/mysql-test/include/restart_mysqld.inc @@ -50,9 +50,6 @@ if (!$restart_parameters) # Call script that will poll the server waiting for it to be back online again --source include/wait_until_connected_again.inc -# Wait for wsrep ---source include/wait_wsrep_ready.inc - # Turn off reconnect again --disable_reconnect diff --git a/mysql-test/include/start_mysqld.inc b/mysql-test/include/start_mysqld.inc index 04dff714d..e31f26aad 100644 --- a/mysql-test/include/start_mysqld.inc +++ b/mysql-test/include/start_mysqld.inc @@ -16,9 +16,6 @@ if (!$restart_parameters) # Call script that will poll the server waiting for it to be back online again --source include/wait_until_connected_again.inc -# Wait for wsrep ---source include/wait_wsrep_ready.inc - # Turn off reconnect again --disable_reconnect diff --git a/mysql-test/include/wait_condition.inc b/mysql-test/include/wait_condition.inc index 5fbde6950..d40b0e4d4 100644 --- a/mysql-test/include/wait_condition.inc +++ b/mysql-test/include/wait_condition.inc @@ -39,7 +39,7 @@ let $wait_timeout= 0; let $wait_condition_reps= 0; while ($wait_counter) { - --error 0,ER_NO_SUCH_TABLE,ER_LOCK_WAIT_TIMEOUT,ER_UNKNOWN_COM_ERROR + --error 0,ER_NO_SUCH_TABLE,ER_LOCK_WAIT_TIMEOUT,ER_UNKNOWN_COM_ERROR,ER_LOCK_DEADLOCK let $success= `$wait_condition`; inc $wait_condition_reps; if ($success) diff --git a/mysql-test/include/wait_until_connected_again.inc b/mysql-test/include/wait_until_connected_again.inc index 6f64ef454..b13d07e94 100644 --- a/mysql-test/include/wait_until_connected_again.inc +++ b/mysql-test/include/wait_until_connected_again.inc @@ -14,7 +14,7 @@ while ($mysql_errno) # Strangely enough, the server might return "Too many connections" # while being shutdown, thus 1040 is an "allowed" error # See BUG#36228 - --error 0,1040,1053,2002,2003,2005,2006,2013,1927 + --error 0,ER_CON_COUNT_ERROR,ER_SERVER_SHUTDOWN,ER_LOCK_WAIT_TIMEOUT,ER_CONNECTION_KILLED,2002,2003,2005,2006,2013 show status; dec $counter; @@ -26,3 +26,9 @@ while ($mysql_errno) } --enable_query_log --enable_result_log + +# WSREP: SHOW STATUS queries are allowed even if wsrep +# is not ready. Make sure wsrep is ready before +# returning from this script + +--source include/wait_wsrep_ready.inc diff --git a/mysql-test/lib/My/SafeProcess/Base.pm b/mysql-test/lib/My/SafeProcess/Base.pm index 1ac0120a7..c5ac2ab51 100644 --- a/mysql-test/lib/My/SafeProcess/Base.pm +++ b/mysql-test/lib/My/SafeProcess/Base.pm @@ -186,8 +186,10 @@ sub create_process { # it and any childs(that hasn't changed group themself) setpgrp(0,0) if $opts{setpgrp}; - if ( $output and !open(STDOUT, $open_mode, $output) ) { - croak("can't redirect STDOUT to '$output': $!"); + if ( $output ) { + close STDOUT; + open(STDOUT, $open_mode, $output) + or croak "can't redirect STDOUT to '$output': $!"; } if ( $error ) { @@ -196,8 +198,10 @@ sub create_process { croak("can't dup STDOUT: $!"); } } - elsif ( ! open(STDERR, $open_mode, $error) ) { - croak("can't redirect STDERR to '$error': $!"); + else { + close STDERR; + open(STDERR, $open_mode, $error) + or croak "can't redirect STDERR to '$error': $!"; } } diff --git a/mysql-test/lib/My/SafeProcess/safe_process.cc b/mysql-test/lib/My/SafeProcess/safe_process.cc index 8f18b137b..f8bed8001 100644 --- a/mysql-test/lib/My/SafeProcess/safe_process.cc +++ b/mysql-test/lib/My/SafeProcess/safe_process.cc @@ -89,7 +89,7 @@ static void die(const char* fmt, ...) } -static void kill_child(bool was_killed) +static int kill_child(bool was_killed) { int status= 0; @@ -108,15 +108,15 @@ static void kill_child(bool was_killed) exit_code= WEXITSTATUS(status); message("Child exit: %d", exit_code); // Exit with exit status of the child - exit(exit_code); + return exit_code; } if (WIFSIGNALED(status)) message("Child killed by signal: %d", WTERMSIG(status)); - exit(exit_code); + return exit_code; } - exit(5); + return 5; } @@ -136,7 +136,7 @@ extern "C" void handle_signal(int sig) terminated= 1; if (child_pid > 0) - kill_child(sig == SIGCHLD); + _exit(kill_child(sig == SIGCHLD)); // Ignore further signals signal(SIGTERM, SIG_IGN); @@ -300,8 +300,6 @@ int main(int argc, char* const argv[] ) /* Wait for parent or child to die */ sleep(1); } - kill_child(0); - - return 4; + return kill_child(0); } diff --git a/mysql-test/lib/My/Tee.pm b/mysql-test/lib/My/Tee.pm new file mode 100644 index 000000000..5985fe337 --- /dev/null +++ b/mysql-test/lib/My/Tee.pm @@ -0,0 +1,25 @@ +package My::Tee; +use IO::Handle; + +# see PerlIO::via + +our $copyfh; + +sub PUSHED +{ + open($copyfh, '>', "$::opt_vardir/log/stdout.log") + or die "open(>$::opt_vardir/log/stdout.log): $!" + unless $copyfh; + bless { }, shift; +} + +sub WRITE +{ + my ($obj, $buf, $fh) = @_; + print $fh $buf; + $fh->flush; + print $copyfh $buf; + return length($buf); +} + +1; diff --git a/mysql-test/mysql-test-run.pl b/mysql-test/mysql-test-run.pl index eaec51b82..9df96f636 100755 --- a/mysql-test/mysql-test-run.pl +++ b/mysql-test/mysql-test-run.pl @@ -2,7 +2,7 @@ # -*- cperl -*- # Copyright (c) 2004, 2014, Oracle and/or its affiliates. -# Copyright (c) 2009, 2017, MariaDB Corporation +# Copyright (c) 2009, 2018, MariaDB Corporation # # 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 @@ -91,6 +91,7 @@ use My::Platform; use My::SafeProcess; use My::ConfigFactory; use My::Options; +use My::Tee; use My::Find; use My::SysInfo; use My::CoreDump; @@ -392,6 +393,11 @@ sub main { initialize_servers(); init_timers(); + unless (IS_WINDOWS) { + binmode(STDOUT,":via(My::Tee)") or die "binmode(STDOUT, :via(My::Tee)):$!"; + binmode(STDERR,":via(My::Tee)") or die "binmode(STDERR, :via(My::Tee)):$!"; + } + mtr_report("Checking supported features..."); executable_setup(); @@ -641,50 +647,59 @@ sub run_test_server ($$$) { my $worker_savename= basename($worker_savedir); my $savedir= "$opt_vardir/log/$worker_savename"; + # Move any core files from e.g. mysqltest + foreach my $coref (glob("core*"), glob("*.dmp")) + { + mtr_report(" - found '$coref', moving it to '$worker_savedir'"); + move($coref, $worker_savedir); + } + + find( + { + no_chdir => 1, + wanted => sub + { + my $core_file= $File::Find::name; + my $core_name= basename($core_file); + + # Name beginning with core, not ending in .gz + if (($core_name =~ /^core/ and $core_name !~ /\.gz$/) + or (IS_WINDOWS and $core_name =~ /\.dmp$/)) + { + # Ending with .dmp + mtr_report(" - found '$core_name'", + "($num_saved_cores/$opt_max_save_core)"); + + My::CoreDump->show($core_file, $exe_mysqld, $opt_parallel); + + # Limit number of core files saved + if ($opt_max_save_core > 0 && + $num_saved_cores >= $opt_max_save_core) + { + mtr_report(" - deleting it, already saved", + "$opt_max_save_core"); + unlink("$core_file"); + } + else + { + mtr_compress_file($core_file) unless @opt_cases; + ++$num_saved_cores; + } + } + } + }, + $worker_savedir); + if ($opt_max_save_datadir > 0 && $num_saved_datadir >= $opt_max_save_datadir) { mtr_report(" - skipping '$worker_savedir/'"); rmtree($worker_savedir); } - else { + else + { mtr_report(" - saving '$worker_savedir/' to '$savedir/'"); rename($worker_savedir, $savedir); - # Move any core files from e.g. mysqltest - foreach my $coref (glob("core*"), glob("*.dmp")) - { - mtr_report(" - found '$coref', moving it to '$savedir'"); - move($coref, $savedir); - } - if ($opt_max_save_core > 0) { - # Limit number of core files saved - find({ no_chdir => 1, - wanted => sub { - my $core_file= $File::Find::name; - my $core_name= basename($core_file); - - # Name beginning with core, not ending in .gz - if (($core_name =~ /^core/ and $core_name !~ /\.gz$/) - or (IS_WINDOWS and $core_name =~ /\.dmp$/)){ - # Ending with .dmp - mtr_report(" - found '$core_name'", - "($num_saved_cores/$opt_max_save_core)"); - - My::CoreDump->show($core_file, $exe_mysqld, $opt_parallel); - - if ($num_saved_cores >= $opt_max_save_core) { - mtr_report(" - deleting it, already saved", - "$opt_max_save_core"); - unlink("$core_file"); - } else { - mtr_compress_file($core_file) unless @opt_cases; - } - ++$num_saved_cores; - } - } - }, - $savedir); - } } resfile_print_test(); $num_saved_datadir++; @@ -4452,6 +4467,7 @@ sub extract_warning_lines ($$) { qr|SSL error: Failed to set ciphers to use|, qr/Plugin 'InnoDB' will be forced to shutdown/, qr|Could not increase number of max_open_files to more than|, + qr|Changed limits: max_open_files|, qr/InnoDB: Error table encrypted but encryption service not available.*/, qr/InnoDB: Could not find a valid tablespace file for*/, qr/InnoDB: Tablespace open failed for*/, @@ -5706,7 +5722,7 @@ sub lldb_arguments { $input = $input ? "< $input" : ""; # write init file for mysqld or client - mtr_tofile($lldb_init_file, "set args $str $input\n"); + mtr_tofile($lldb_init_file, "process launch --stop-at-entry -- $str $input\n"); print "\nTo start lldb for $type, type in another window:\n"; print "cd $glob_mysql_test_dir && lldb -s $lldb_init_file $$exe\n"; @@ -6280,7 +6296,8 @@ sub xterm_stat { my $done = $num_tests - $left; my $spent = time - $^T; - printf "\e];mtr: spent %s on %d tests. %s (%d tests) left\a", + syswrite STDOUT, sprintf + "\e];mtr: spent %s on %d tests. %s (%d tests) left\a", time_format($spent), $done, time_format($spent/$done * $left), $left; } diff --git a/mysql-test/r/alter_table.result b/mysql-test/r/alter_table.result index 17e2dc9b0..513bb2eda 100644 --- a/mysql-test/r/alter_table.result +++ b/mysql-test/r/alter_table.result @@ -2174,6 +2174,89 @@ t1 CREATE TABLE `t1` ( ) ENGINE=InnoDB DEFAULT CHARSET=utf8 DROP TABLE t1; # +# MDEV-15308 +# Assertion `ha_alter_info->alter_info->drop_list.elements > 0' failed +# in ha_innodb::prepare_inplace_alter_table +# +CREATE TABLE t1 (a INT, b INT) ENGINE=InnoDB; +ALTER TABLE t1 DROP FOREIGN KEY IF EXISTS fk, DROP COLUMN b; +Warnings: +Note 1091 Can't DROP 'fk'; check that column/key exists +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` int(11) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +DROP TABLE t1; +CREATE TABLE t1 (a INT, b INT) ENGINE=InnoDB; +ALTER TABLE t1 DROP INDEX IF EXISTS fk, DROP COLUMN b; +Warnings: +Note 1091 Can't DROP 'fk'; check that column/key exists +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` int(11) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +DROP TABLE t1; +CREATE TABLE t1 (a INT, b INT, c INT, KEY(c)) ENGINE=InnoDB; +ALTER TABLE t1 DROP FOREIGN KEY IF EXISTS fk, DROP COLUMN c; +Warnings: +Note 1091 Can't DROP 'fk'; check that column/key exists +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` int(11) DEFAULT NULL, + `b` int(11) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +DROP TABLE t1; +CREATE TABLE t1 (a INT, b INT, c INT, KEY c1(c)) ENGINE=InnoDB; +ALTER TABLE t1 DROP FOREIGN KEY IF EXISTS fk, DROP INDEX c1; +Warnings: +Note 1091 Can't DROP 'fk'; check that column/key exists +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` int(11) DEFAULT NULL, + `b` int(11) DEFAULT NULL, + `c` int(11) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +DROP TABLE t1; +CREATE TABLE t1 (a INT, b INT) ENGINE=InnoDB; +ALTER TABLE t1 DROP INDEX IF EXISTS fk, DROP COLUMN IF EXISTS c; +Warnings: +Note 1091 Can't DROP 'fk'; check that column/key exists +Note 1091 Can't DROP 'c'; check that column/key exists +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` int(11) DEFAULT NULL, + `b` int(11) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +DROP TABLE t1; +# +# MDEV-14668 ADD PRIMARY KEY IF NOT EXISTS on composite key +# +CREATE TABLE t1 ( +`ID` BIGINT(20) NOT NULL, +`RANK` MEDIUMINT(4) NOT NULL, +`CHECK_POINT` BIGINT(20) NOT NULL, +UNIQUE INDEX `HORIZON_UIDX01` (`ID`, `RANK`) +) ENGINE=InnoDB; +ALTER TABLE t1 ADD PRIMARY KEY IF NOT EXISTS (`ID`, `CHECK_POINT`); +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `ID` bigint(20) NOT NULL, + `RANK` mediumint(4) NOT NULL, + `CHECK_POINT` bigint(20) NOT NULL, + PRIMARY KEY (`ID`,`CHECK_POINT`), + UNIQUE KEY `HORIZON_UIDX01` (`ID`,`RANK`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +ALTER TABLE t1 ADD PRIMARY KEY IF NOT EXISTS (`ID`, `CHECK_POINT`); +Warnings: +Note 1061 Multiple primary key defined +DROP TABLE t1; +# # End of 10.0 tests # # diff --git a/mysql-test/r/analyze_stmt_orderby.result b/mysql-test/r/analyze_stmt_orderby.result index be1f01a2a..238baff50 100644 --- a/mysql-test/r/analyze_stmt_orderby.result +++ b/mysql-test/r/analyze_stmt_orderby.result @@ -303,7 +303,7 @@ ANALYZE "r_rows": 10, "r_total_time_ms": "REPLACED", "filtered": 100, - "r_filtered": 1, + "r_filtered": 100, "attached_condition": "(t0.a is not null)" } } diff --git a/mysql-test/r/assign_key_cache.result b/mysql-test/r/assign_key_cache.result new file mode 100644 index 000000000..4ed617013 --- /dev/null +++ b/mysql-test/r/assign_key_cache.result @@ -0,0 +1,13 @@ +set global my_cache.key_buffer_size = 1024*1024; +create table t1 (i int) engine=myisam partition by hash (i) partitions 2; +xa start 'xid'; +cache index t1 partition (non_existing_partition) in my_cache; +Table Op Msg_type Msg_text +test.t1 assign_to_keycache error Error in list of partitions to test.t1 +cache index t1 partition (p1) in my_cache; +Table Op Msg_type Msg_text +test.t1 assign_to_keycache status OK +xa end 'xid'; +xa rollback 'xid'; +drop table t1; +set global my_cache.key_buffer_size = 0; diff --git a/mysql-test/r/assign_key_cache-5405.result b/mysql-test/r/assign_key_cache_debug.result similarity index 100% rename from mysql-test/r/assign_key_cache-5405.result rename to mysql-test/r/assign_key_cache_debug.result diff --git a/mysql-test/r/connect.result b/mysql-test/r/connect.result index 315aea0ef..cb66ff483 100644 --- a/mysql-test/r/connect.result +++ b/mysql-test/r/connect.result @@ -147,7 +147,7 @@ drop table t1; CREATE USER mysqltest_u1@localhost; GRANT USAGE ON *.* TO mysqltest_u1@localhost; -SET GLOBAL max_connections = 3; +SET GLOBAL max_connections = 10; SET GLOBAL event_scheduler = ON; # -- Waiting for Event Scheduler to start... @@ -191,6 +191,13 @@ event_scheduler mysqltest_u1 mysqltest_u1 mysqltest_u1 +mysqltest_u1 +mysqltest_u1 +mysqltest_u1 +mysqltest_u1 +mysqltest_u1 +mysqltest_u1 +mysqltest_u1 root # -- Resetting variables... diff --git a/mysql-test/r/connect_debug.result b/mysql-test/r/connect_debug.result new file mode 100644 index 000000000..0452b238d --- /dev/null +++ b/mysql-test/r/connect_debug.result @@ -0,0 +1,5 @@ +set @old_dbug=@@global.debug_dbug; +set global debug_dbug='+d,auth_disconnect'; +create user 'bad' identified by 'worse'; +set global debug_dbug=@old_dbug; +drop user bad; diff --git a/mysql-test/r/contributors.result b/mysql-test/r/contributors.result index 927c0bccc..36d033f4c 100644 --- a/mysql-test/r/contributors.result +++ b/mysql-test/r/contributors.result @@ -4,13 +4,12 @@ Booking.com https://www.booking.com Founding member, Platinum Sponsor of the Mar Alibaba Cloud https://www.alibabacloud.com/ Platinum Sponsor of the MariaDB Foundation Tencent Cloud https://cloud.tencent.com Platinum Sponsor of the MariaDB Foundation Microsoft https://microsoft.com/ Platinum Sponsor of the MariaDB Foundation -MariaDB Corporation https://mariadb.com Founding member, Gold Sponsor of the MariaDB Foundation +MariaDB Corporation https://mariadb.com Founding member, Platinum Sponsor of the MariaDB Foundation Visma https://visma.com Gold Sponsor of the MariaDB Foundation DBS https://dbs.com Gold Sponsor of the MariaDB Foundation IBM https://www.ibm.com Gold Sponsor of the MariaDB Foundation Nexedi https://www.nexedi.com Silver Sponsor of the MariaDB Foundation Acronis http://www.acronis.com Silver Sponsor of the MariaDB Foundation -Auttomattic https://automattic.com Bronze Sponsor of the MariaDB Foundation Verkkokauppa.com https://www.verkkokauppa.com Bronze Sponsor of the MariaDB Foundation Virtuozzo https://virtuozzo.com Bronze Sponsor of the MariaDB Foundation Tencent Game DBA http://tencentdba.com/about Bronze Sponsor of the MariaDB Foundation diff --git a/mysql-test/r/create_or_replace.result b/mysql-test/r/create_or_replace.result index 70b4b98b8..27aafa976 100644 --- a/mysql-test/r/create_or_replace.result +++ b/mysql-test/r/create_or_replace.result @@ -451,3 +451,23 @@ CREATE OR REPLACE TABLE t1 AS SELECT f1(); UNLOCK TABLES; DROP FUNCTION f1; DROP TABLE t1; +# +# MDEV-11129 +# CREATE OR REPLACE TABLE t1 AS SELECT spfunc() crashes if spfunc() +# references t1 +# +CREATE OR REPLACE TABLE t1(a INT); +CREATE FUNCTION f1() RETURNS VARCHAR(16383) +BEGIN +INSERT INTO t1 VALUES(1); +RETURN 'test'; +END; +$$ +CREATE OR REPLACE TABLE t1 AS SELECT f1(); +ERROR HY000: Table 't1' is specified twice, both as a target for 'CREATE' and as a separate source for data +LOCK TABLE t1 WRITE; +CREATE OR REPLACE TABLE t1 AS SELECT f1(); +ERROR HY000: Table 't1' was not locked with LOCK TABLES +UNLOCK TABLES; +DROP FUNCTION f1; +DROP TABLE t1; diff --git a/mysql-test/r/ctype_latin1.result b/mysql-test/r/ctype_latin1.result index 85035982c..66c5a3775 100644 --- a/mysql-test/r/ctype_latin1.result +++ b/mysql-test/r/ctype_latin1.result @@ -8208,5 +8208,18 @@ Warnings: Note 1003 select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t1`.`d` AS `d` from `test`.`t1` where ((coalesce(`test`.`t1`.`c`,0) = '3 ') and (coalesce(`test`.`t1`.`d`,0) = '3 ')) DROP TABLE t1; # +# MDEV-15005 ASAN: stack-buffer-overflow in my_strnncollsp_simple +# +SET NAMES latin1; +SELECT CONVERT(1, CHAR) IN ('100', 10, '101'); +CONVERT(1, CHAR) IN ('100', 10, '101') +0 +SELECT CONVERT(1, CHAR) IN ('100', 10, '1'); +CONVERT(1, CHAR) IN ('100', 10, '1') +1 +SELECT CONVERT(1, CHAR) IN ('100', '10', '1'); +CONVERT(1, CHAR) IN ('100', '10', '1') +1 +# # End of 10.1 tests # diff --git a/mysql-test/r/ctype_ucs.result b/mysql-test/r/ctype_ucs.result index f9f0acf72..55caabbaa 100644 --- a/mysql-test/r/ctype_ucs.result +++ b/mysql-test/r/ctype_ucs.result @@ -4616,6 +4616,37 @@ Field Type Null Key Default Extra c1 mediumtext YES NULL DROP TABLE t1; # +# MDEV-15624 Changing the default character set to utf8mb4 changes query evaluation in a very surprising way +# +SET NAMES utf8; +CREATE TABLE t1 (id INT); +INSERT INTO t1 VALUES (1),(2),(3); +SELECT COUNT(DISTINCT c) FROM (SELECT id, REPLACE(uuid_short(), '0', CAST('o' AS CHAR CHARACTER SET ucs2)) AS c FROM t1) AS d1; +COUNT(DISTINCT c) +3 +SELECT DISTINCT REPLACE(uuid_short(), '0', CAST('o' AS CHAR CHARACTER SET ucs2)) AS c FROM t1; +c +xxxxxxxxxxxxxxxxx +xxxxxxxxxxxxxxxxx +xxxxxxxxxxxxxxxxx +SELECT COUNT(DISTINCT c) FROM (SELECT id, INSERT(uuid_short(), 1, 1, CAST('0' AS CHAR CHARACTER SET ucs2)) AS c FROM t1) AS d1; +COUNT(DISTINCT c) +3 +SELECT DISTINCT INSERT(uuid_short(), 1, 1, CAST('0' AS CHAR CHARACTER SET ucs2)) AS c FROM t1; +c +xxxxxxxxxxxxxxxxx +xxxxxxxxxxxxxxxxx +xxxxxxxxxxxxxxxxx +SELECT COUNT(DISTINCT c) FROM (SELECT id, CONCAT(uuid_short(), CAST('0' AS CHAR CHARACTER SET ucs2)) AS c FROM t1) AS d1; +COUNT(DISTINCT c) +3 +SELECT DISTINCT CONCAT(uuid_short(), CAST('0' AS CHAR CHARACTER SET ucs2)) AS c FROM t1; +c +xxxxxxxxxxxxxxxxx +xxxxxxxxxxxxxxxxx +xxxxxxxxxxxxxxxxx +DROP TABLE t1; +# # End of 5.5 tests # # diff --git a/mysql-test/r/ctype_utf8.result b/mysql-test/r/ctype_utf8.result index 5a77ea3ae..3da74d128 100644 --- a/mysql-test/r/ctype_utf8.result +++ b/mysql-test/r/ctype_utf8.result @@ -10535,5 +10535,18 @@ CAST(_utf8 0xC499 AS CHAR CHARACTER SET latin1) Warnings: Warning 1977 Cannot convert 'utf8' character 0xC499 to 'latin1' # +# MDEV-15005 ASAN: stack-buffer-overflow in my_strnncollsp_simple +# +SET NAMES utf8; +SELECT CONVERT(1, CHAR) IN ('100', 10, '101'); +CONVERT(1, CHAR) IN ('100', 10, '101') +0 +SELECT CONVERT(1, CHAR) IN ('100', 10, '1'); +CONVERT(1, CHAR) IN ('100', 10, '1') +1 +SELECT CONVERT(1, CHAR) IN ('100', '10', '1'); +CONVERT(1, CHAR) IN ('100', '10', '1') +1 +# # End of 10.1 tests # diff --git a/mysql-test/r/ctype_utf8mb4.result b/mysql-test/r/ctype_utf8mb4.result index d45b6b232..904f432af 100644 --- a/mysql-test/r/ctype_utf8mb4.result +++ b/mysql-test/r/ctype_utf8mb4.result @@ -2859,6 +2859,29 @@ SELECT LENGTH(data) AS len FROM (SELECT REPEAT('☃', 65536) AS data ) AS sub; len 196608 # +# MDEV-15624 Changing the default character set to utf8mb4 changes query evaluation in a very surprising way +# +SET NAMES utf8mb4; +CREATE TABLE t1 (id INT); +INSERT INTO t1 VALUES (1),(2),(3); +SELECT COUNT(DISTINCT c) FROM (SELECT id, REPLACE(UUID(), "-", "") AS c FROM t1) AS d1; +COUNT(DISTINCT c) +3 +SELECT DISTINCT INSERT(uuid(), 9, 1, "X") AS c FROM t1; +c +xxxxxxxxxxxxx-xxxx-xxxx-xxxxxxxxxxxx +xxxxxxxxxxxxx-xxxx-xxxx-xxxxxxxxxxxx +xxxxxxxxxxxxx-xxxx-xxxx-xxxxxxxxxxxx +SELECT COUNT(DISTINCT c) FROM (SELECT id, INSERT(UUID(), 9, 1, "X") AS c FROM t1) AS d1; +COUNT(DISTINCT c) +3 +SELECT DISTINCT INSERT(UUID(), 9, 1, "X") AS c FROM t1; +c +xxxxxxxxxxxxx-xxxx-xxxx-xxxxxxxxxxxx +xxxxxxxxxxxxx-xxxx-xxxx-xxxxxxxxxxxx +xxxxxxxxxxxxx-xxxx-xxxx-xxxxxxxxxxxx +DROP TABLE t1; +# # End of 5.5 tests # # diff --git a/mysql-test/r/dyncol.result b/mysql-test/r/dyncol.result index 81446da9e..fe4ee3f7d 100644 --- a/mysql-test/r/dyncol.result +++ b/mysql-test/r/dyncol.result @@ -1883,5 +1883,15 @@ SELECT COLUMN_JSON(COLUMN_CREATE('test','First line\nSecond line')) AS json; json {"test":"First line\u000ASecond line"} # +# MDEV-15230: column_json breaks cyrillic in 10.1.31 +# +set names utf8; +create table t1 (b blob); +insert into t1 values (column_create('description',column_create('title','ОпиÑание'))); +select column_json(b) from t1; +column_json(b) +{"description":{"title":"ОпиÑание"}} +drop table t1; +# # end of 10.0 tests # diff --git a/mysql-test/r/fast_prefix_index_fetch_innodb.result b/mysql-test/r/fast_prefix_index_fetch_innodb.result index 92af85f7f..c6d96389b 100644 --- a/mysql-test/r/fast_prefix_index_fetch_innodb.result +++ b/mysql-test/r/fast_prefix_index_fetch_innodb.result @@ -30,73 +30,372 @@ id fake_id bigfield 33 1033 yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy 128 1128 zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz # Baseline sanity check: 0, 0. +select "no-op query"; no-op query no-op query -cluster_lookups_matched -1 -cluster_lookups_avoided_matched -1 +select @cluster_lookups; +@cluster_lookups +0 +select @cluster_lookups_avoided; +@cluster_lookups_avoided +0 # Eligible for optimization. +select id, bigfield from prefixinno where bigfield = repeat('d', 31); id bigfield 31 ddddddddddddddddddddddddddddddd -cluster_lookups_matched -1 -cluster_lookups_avoided_matched +select @cluster_lookups; +@cluster_lookups +0 +select @cluster_lookups_avoided; +@cluster_lookups_avoided 1 # Eligible for optimization, access via fake_id only. +select id, bigfield from prefixinno where fake_id = 1031; id bigfield 31 ddddddddddddddddddddddddddddddd -cluster_lookups_matched -1 -cluster_lookups_avoided_matched +select @cluster_lookups; +@cluster_lookups +0 +select @cluster_lookups_avoided; +@cluster_lookups_avoided 1 # Not eligible for optimization, access via fake_id of big row. +select id, bigfield from prefixinno where fake_id = 1033; id bigfield 33 yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy -cluster_lookups_matched -1 -cluster_lookups_avoided_matched +select @cluster_lookups; +@cluster_lookups 1 +select @cluster_lookups_avoided; +@cluster_lookups_avoided +0 # Not eligible for optimization. +select id, bigfield from prefixinno where bigfield = repeat('x', 32); id bigfield 32 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx -cluster_lookups_matched -1 -cluster_lookups_avoided_matched +select @cluster_lookups; +@cluster_lookups 1 +select @cluster_lookups_avoided; +@cluster_lookups_avoided +0 # Not eligible for optimization. +select id, bigfield from prefixinno where bigfield = repeat('y', 33); id bigfield 33 yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy -cluster_lookups_matched -1 -cluster_lookups_avoided_matched +select @cluster_lookups; +@cluster_lookups 1 +select @cluster_lookups_avoided; +@cluster_lookups_avoided +0 # Eligible, should not increment lookup counter. +select id, bigfield from prefixinno where bigfield = repeat('b', 8); id bigfield 8 bbbbbbbb -cluster_lookups_matched -1 -cluster_lookups_avoided_matched +select @cluster_lookups; +@cluster_lookups +0 +select @cluster_lookups_avoided; +@cluster_lookups_avoided 1 # Eligible, should not increment lookup counter. +select id, bigfield from prefixinno where bigfield = repeat('c', 24); id bigfield 24 cccccccccccccccccccccccc -cluster_lookups_matched -1 -cluster_lookups_avoided_matched +select @cluster_lookups; +@cluster_lookups +0 +select @cluster_lookups_avoided; +@cluster_lookups_avoided 1 # Should increment lookup counter. +select id, bigfield from prefixinno where bigfield = repeat('z', 128); id bigfield 128 zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz -cluster_lookups_matched -1 -cluster_lookups_avoided_matched +select @cluster_lookups; +@cluster_lookups 1 +select @cluster_lookups_avoided; +@cluster_lookups_avoided +0 # Disable optimization, confirm we still increment counter. +set global innodb_prefix_index_cluster_optimization = OFF; +select id, bigfield from prefixinno where fake_id = 1033; id bigfield 33 yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy -cluster_lookups_matched +select @cluster_lookups; +@cluster_lookups +1 +select @cluster_lookups_avoided; +@cluster_lookups_avoided +0 +drop table prefixinno; +# Multi-byte handling case +set global innodb_prefix_index_cluster_optimization = ON; +SET NAMES utf8mb4; +CREATE TABLE t1( +f1 varchar(10) CHARACTER SET UTF8MB4 COLLATE UTF8MB4_BIN, +INDEX (f1(3)))ENGINE=INNODB; +INSERT INTO t1 VALUES('a'), ('cccc'), ('až'), ('cÄc'), ('ggáµ·g'), ('¢¢'); +INSERT INTO t1 VALUES('தமிழà¯'), ('ðŸ±ðŸŒ‘'), ('🌒'), ('🌑'); +INSERT INTO t1 VALUES('😊me'), ('eu€'), ('ls¢'); +# Eligible - record length is shorter than prefix +SELECT f1 FROM t1 FORCE INDEX (`f1`) WHERE f1 = 'a'; +f1 +a +select @cluster_lookups; +@cluster_lookups +0 +select @cluster_lookups_avoided; +@cluster_lookups_avoided +1 +# Not eligible - record length longer than prefix length +SELECT f1 FROM t1 FORCE INDEX (`f1`) WHERE f1 like 'c%'; +f1 +cccc +cÄc +select @cluster_lookups; +@cluster_lookups +3 +select @cluster_lookups_avoided; +@cluster_lookups_avoided +0 +# Eligible - record length shorter than prefix length +SELECT f1 FROM t1 FORCE INDEX (`f1`) WHERE f1 = 'až'; +f1 +až +select @cluster_lookups; +@cluster_lookups +0 +select @cluster_lookups_avoided; +@cluster_lookups_avoided +1 +# Not eligible - record length longer than prefix length +SELECT f1 FROM t1 FORCE INDEX (`f1`) WHERE f1 = 'தமிழà¯'; +f1 +தமிழ௠+select @cluster_lookups; +@cluster_lookups +1 +select @cluster_lookups_avoided; +@cluster_lookups_avoided +0 +# Not eligible - record length longer than prefix length +SELECT f1 FROM t1 FORCE INDEX (`f1`) WHERE f1 like 'ggáµ·%'; +f1 +ggáµ·g +select @cluster_lookups; +@cluster_lookups +1 +select @cluster_lookups_avoided; +@cluster_lookups_avoided +0 +# Not eligible - record length longer than prefix length +SELECT f1 FROM t1 FORCE INDEX (`f1`) WHERE f1 like '😊%'; +f1 +😊me +select @cluster_lookups; +@cluster_lookups +1 +select @cluster_lookups_avoided; +@cluster_lookups_avoided +0 +# Not eligible - record length longer than prefix length +SELECT f1 FROM t1 FORCE INDEX (`f1`) WHERE f1 = 'ls¢'; +f1 +ls¢ +select @cluster_lookups; +@cluster_lookups +1 +select @cluster_lookups_avoided; +@cluster_lookups_avoided +0 +# Eligible - record length shorter than prefix length +SELECT f1 FROM t1 FORCE INDEX (`f1`) WHERE f1 like '¢¢%'; +f1 +¢¢ +select @cluster_lookups; +@cluster_lookups +1 +select @cluster_lookups_avoided; +@cluster_lookups_avoided +1 +# Eligible - record length shorter than prefix length +SELECT f1 FROM t1 FORCE INDEX (`f1`) WHERE f1 like 'ðŸ±ðŸŒ‘%'; +f1 +ðŸ±ðŸŒ‘ +select @cluster_lookups; +@cluster_lookups +1 +select @cluster_lookups_avoided; +@cluster_lookups_avoided +1 +# Not eligible - record length longer than prefix length +SELECT f1 FROM t1 FORCE INDEX (`f1`) WHERE f1 like '🌑%'; +f1 +🌑 +select @cluster_lookups; +@cluster_lookups +0 +select @cluster_lookups_avoided; +@cluster_lookups_avoided +2 +# Not eligible - record length longer than prefix length +SELECT f1 FROM t1 FORCE INDEX (`f1`) WHERE f1 like '🌒%'; +f1 +🌒 +select @cluster_lookups; +@cluster_lookups +0 +select @cluster_lookups_avoided; +@cluster_lookups_avoided +2 +DROP TABLE t1; +# Multi-byte with minimum character length > 1 bytes +CREATE TABLE t1( +f1 varchar(10) CHARACTER SET UTF16 COLLATE UTF16_BIN, +INDEX (f1(3)))ENGINE=INNODB; +INSERT INTO t1 VALUES('a'), ('cccc'), ('až'), ('cÄc'), ('ggáµ·g'), ('¢¢'); +INSERT INTO t1 VALUES('தமிழà¯'), ('ðŸ±ðŸŒ‘'), ('🌒'), ('🌑'); +INSERT INTO t1 VALUES('😊me'), ('eu€'), ('ls¢'); +# Eligible - record length is shorter than prefix +SELECT f1 FROM t1 FORCE INDEX (`f1`) WHERE f1 = 'a'; +f1 +a +select @cluster_lookups; +@cluster_lookups +0 +select @cluster_lookups_avoided; +@cluster_lookups_avoided +1 +# Not eligible - record length longer than prefix length +SELECT f1 FROM t1 FORCE INDEX (`f1`) WHERE f1 like 'c%'; +f1 +cccc +cÄc +select @cluster_lookups; +@cluster_lookups +3 +select @cluster_lookups_avoided; +@cluster_lookups_avoided +0 +# Eligible - record length shorter than prefix length +SELECT f1 FROM t1 FORCE INDEX (`f1`) WHERE f1 = 'až'; +f1 +až +select @cluster_lookups; +@cluster_lookups +0 +select @cluster_lookups_avoided; +@cluster_lookups_avoided +1 +# Not eligible - record length longer than prefix length +SELECT f1 FROM t1 FORCE INDEX (`f1`) WHERE f1 = 'தமிழà¯'; +f1 +தமிழ௠+select @cluster_lookups; +@cluster_lookups +1 +select @cluster_lookups_avoided; +@cluster_lookups_avoided +0 +# Not eligible - record length longer than prefix length +SELECT f1 FROM t1 FORCE INDEX (`f1`) WHERE f1 like 'ggáµ·%'; +f1 +ggáµ·g +select @cluster_lookups; +@cluster_lookups +2 +select @cluster_lookups_avoided; +@cluster_lookups_avoided +0 +# Not eligible - record length longer than prefix length +SELECT f1 FROM t1 FORCE INDEX (`f1`) WHERE f1 like '😊%'; +f1 +😊me +select @cluster_lookups; +@cluster_lookups +1 +select @cluster_lookups_avoided; +@cluster_lookups_avoided +0 +# Not eligible - record length longer than prefix length +SELECT f1 FROM t1 FORCE INDEX (`f1`) WHERE f1 = 'ls¢'; +f1 +ls¢ +select @cluster_lookups; +@cluster_lookups +1 +select @cluster_lookups_avoided; +@cluster_lookups_avoided +0 +# Eligible - record length shorter than prefix length +SELECT f1 FROM t1 FORCE INDEX(`f1`) WHERE f1 like '¢¢%'; +f1 +¢¢ +select @cluster_lookups; +@cluster_lookups +1 +select @cluster_lookups_avoided; +@cluster_lookups_avoided +1 +# Eligible - record length shorter than prefix length +SELECT f1 FROM t1 FORCE INDEX (`f1`) WHERE f1 like 'ðŸ±ðŸŒ‘%'; +f1 +ðŸ±ðŸŒ‘ +select @cluster_lookups; +@cluster_lookups +2 +select @cluster_lookups_avoided; +@cluster_lookups_avoided +0 +# Eligible - record length is shorter than prefix length +SELECT f1 FROM t1 FORCE INDEX (`f1`) WHERE f1 like '🌑%'; +f1 +🌑 +select @cluster_lookups; +@cluster_lookups +0 +select @cluster_lookups_avoided; +@cluster_lookups_avoided +2 +# Eligible - record length is shorter than prefix length +SELECT f1 FROM t1 FORCE INDEX (`f1`) WHERE f1 like '🌒%'; +f1 +🌒 +select @cluster_lookups; +@cluster_lookups +1 +select @cluster_lookups_avoided; +@cluster_lookups_avoided +1 +DROP TABLE t1; +CREATE TABLE t1( +col1 INT, +col2 BLOB DEFAULT NULL, +INDEX `idx1`(col2(4), col1))ENGINE=INNODB; +INSERT INTO t1 VALUES (2, 'test'), (3, repeat('test1', 2000)); +INSERT INTO t1(col1) VALUES(1); +# Eligible - record length is shorter than prefix length +SELECT col1 FROM t1 FORCE INDEX (`idx1`) WHERE col2 is NULL; +col1 1 -cluster_lookups_avoided_matched +select @cluster_lookups; +@cluster_lookups +0 +select @cluster_lookups_avoided; +@cluster_lookups_avoided 1 -# make test suite happy by cleaning up our mess +# Not eligible - record length longer than prefix index +SELECT col1 FROM t1 FORCE INDEX (`idx1`) WHERE col2 like 'test1%'; +col1 +3 +select @cluster_lookups; +@cluster_lookups +2 +select @cluster_lookups_avoided; +@cluster_lookups_avoided +0 +DROP TABLE t1; +set global innodb_prefix_index_cluster_optimization = OFF; diff --git a/mysql-test/r/func_date_add.result b/mysql-test/r/func_date_add.result index e8fbba786..0258267b5 100644 --- a/mysql-test/r/func_date_add.result +++ b/mysql-test/r/func_date_add.result @@ -102,3 +102,54 @@ select * from t1 where case a when adddate( '2012-12-12', 7 ) then true end; a drop table t1; End of 5.5 tests +# +# Start of 10.1 tests +# +# +# MDEV-14452 Precision in INTERVAL xxx DAY_MICROSECOND parsed wrong? +# +SELECT +DATE_ADD('1000-01-01 00:00:00', INTERVAL '0 00:00:01.5' DAY_MICROSECOND) c1, +DATE_ADD('1000-01-01 00:00:00', INTERVAL '0 00:00:01.50' DAY_MICROSECOND) c2, +DATE_ADD('1000-01-01 00:00:00', INTERVAL '0 00:00:01.500' DAY_MICROSECOND) c3, +DATE_ADD('1000-01-01 00:00:00', INTERVAL '0 00:00:01.5000' DAY_MICROSECOND) c4, +DATE_ADD('1000-01-01 00:00:00', INTERVAL '0 00:00:01.50000' DAY_MICROSECOND) c5, +DATE_ADD('1000-01-01 00:00:00', INTERVAL '0 00:00:01.500000' DAY_MICROSECOND) c6, +DATE_ADD('1000-01-01 00:00:00', INTERVAL '0 00:00:01.5000000' DAY_MICROSECOND) c7, +DATE_ADD('1000-01-01 00:00:00', INTERVAL '0 00:00:01.50000000' DAY_MICROSECOND) c8, +DATE_ADD('1000-01-01 00:00:00', INTERVAL '0 00:00:01.500000000' DAY_MICROSECOND) c9, +DATE_ADD('1000-01-01 00:00:00', INTERVAL '0 00:00:01.5000000000' DAY_MICROSECOND) c10, +DATE_ADD('1000-01-01 00:00:00', INTERVAL '0 00:00:01.50000000000' DAY_MICROSECOND) c11, +DATE_ADD('1000-01-01 00:00:00', INTERVAL '0 00:00:01.500000000000' DAY_MICROSECOND) c12, +DATE_ADD('1000-01-01 00:00:00', INTERVAL '0 00:00:01.5000000000000' DAY_MICROSECOND) c13, +DATE_ADD('1000-01-01 00:00:00', INTERVAL '0 00:00:01.50000000000000' DAY_MICROSECOND) c14, +DATE_ADD('1000-01-01 00:00:00', INTERVAL '0 00:00:01.500000000000000' DAY_MICROSECOND) c15, +DATE_ADD('1000-01-01 00:00:00', INTERVAL '0 00:00:01.5000000000000000' DAY_MICROSECOND) c16, +DATE_ADD('1000-01-01 00:00:00', INTERVAL '0 00:00:01.50000000000000000' DAY_MICROSECOND) c17, +DATE_ADD('1000-01-01 00:00:00', INTERVAL '0 00:00:01.500000000000000000' DAY_MICROSECOND) c18, +DATE_ADD('1000-01-01 00:00:00', INTERVAL '0 00:00:01.5000000000000000000' DAY_MICROSECOND) c19, +DATE_ADD('1000-01-01 00:00:00', INTERVAL '0 00:00:01.50000000000000000000' DAY_MICROSECOND) c20 +; +c1 1000-01-01 00:00:01.500000 +c2 1000-01-01 00:00:01.500000 +c3 1000-01-01 00:00:01.500000 +c4 1000-01-01 00:00:01.500000 +c5 1000-01-01 00:00:01.500000 +c6 1000-01-01 00:00:01.500000 +c7 1000-01-01 00:00:01.500000 +c8 1000-01-01 00:00:01.500000 +c9 1000-01-01 00:00:01.500000 +c10 1000-01-01 00:00:01.500000 +c11 1000-01-01 00:00:01.500000 +c12 1000-01-01 00:00:01.500000 +c13 1000-01-01 00:00:01.500000 +c14 1000-01-01 00:00:01.500000 +c15 1000-01-01 00:00:01.500000 +c16 1000-01-01 00:00:01.500000 +c17 1000-01-01 00:00:01.500000 +c18 1000-01-01 00:00:01.500000 +c19 1000-01-01 00:00:01.500000 +c20 NULL +# +# End of 10.1 tests +# diff --git a/mysql-test/r/func_misc.result b/mysql-test/r/func_misc.result index 545d51517..1f9aa2127 100644 --- a/mysql-test/r/func_misc.result +++ b/mysql-test/r/func_misc.result @@ -578,6 +578,17 @@ SELECT NAME_CONST('a', -(1)) OR 1; NAME_CONST('a', -(1)) OR 1 1 # +# MDEV-15630 uuid() function evaluates at wrong time in query +# +CREATE TABLE t1 (id INT); +INSERT INTO t1 VALUES (1),(2),(3); +SELECT COUNT(1), UUID() as uid FROM t1 GROUP BY uid; +COUNT(1) uid +1 xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx +1 xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx +1 xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx +DROP TABLE t1; +# # End of 5.5 tests # # diff --git a/mysql-test/r/func_str.result b/mysql-test/r/func_str.result index 3c84134d4..3d9c9bc15 100644 --- a/mysql-test/r/func_str.result +++ b/mysql-test/r/func_str.result @@ -4568,6 +4568,43 @@ id select_type table type possible_keys key key_len ref rows filtered Extra Warnings: Note 1003 select char(0xdf) AS `CHAR(0xDF)` # +# MDEV-15619 using CONVERT() inside AES_ENCRYPT() in an UPDATE corrupts data +# +CREATE TABLE t1 ( +id int(11) NOT NULL, +session_id varchar(255) DEFAULT NULL, +directory mediumtext, +checksum int(10) DEFAULT NULL, +last_update datetime DEFAULT NULL, +PRIMARY KEY (id), +KEY lastupdate (last_update) +) DEFAULT CHARSET=latin1; +INSERT INTO t1 VALUES (1,'',NULL,38391,'2017-06-24 07:35:28'); +UPDATE t1 SET directory = AES_ENCRYPT(CONVERT('test stringrererejrjerjehrjekhrjkehrjkehrkjehrjkerhkjehrjekrhkjehrkjerhjkehrkjehrkjehrjkehrjkehrjkehrjkerjkehrjkehrjkehrjke rekjhrejrejhrjehgrehjgrhjerjhegrjherejhgrjhegrjehgrjhegrejhrgjehgrjhegrjhegrjhergjhegrjhegrhjegrjerhthkjjkdhjkgdfjkgjkdgdjkfjkhgjkfdhjgjkfdghkjdfghkjfdghfjkdghkdjfghdkjfghfjkdghfkjdghkjfdghfkjdghfkdjghfkjdghfdjkghjkdfhgdfjkghfjkdghfjkdghfjdkghfjkdghkfjdghfkjdghfkjdghkjdfghfjdkghjkfdghkjdfhgjkdfhgjkfdhgkjfdghkfjdhgkjfdgdjkejktjherjthkjrethkjrethjkerthjkerhtjkerhtkjerhtjkerhtjkerhtjkrehtkjerhtkjrehtjkrehtkjrehtkjerhtkjerhtjkrehtkjrehtjkrehtkjrethjkrethkjrehtkjethjkerhtjkrehtjkretkjerhtkjrehtjkerhtjkrehtjrehtkjrekjtrfgdsfgdhjsghjgfdhjsfhjdfgdhjshjdshjfghjdsfgjhsfgjhsdfgjhdsfgjdhsfgsjhfgjhsdfgsdjhfgjdhsfdjshfgdsjhfgjsdhfdjshfgdjhsfgdjshfgjdhsfgjhsdfgjhsdgfjhsdgfjhdsgfjhsgfjhsdgfjhdsgfhjsdehkjthrkjethjkre' USING latin1), '95F5A1F52A554'), last_update= NOW(); +SELECT directory IS NULL FROM t1; +directory IS NULL +0 +DROP TABLE t1; +CREATE TABLE t1 ( +id int(11) NOT NULL PRIMARY KEY, +directory mediumtext +) DEFAULT CHARSET=latin1; +INSERT INTO t1 VALUES (1,AES_ENCRYPT(CONVERT(REPEAT('a',800) USING latin1),'95F5A1F52A554')); +SELECT AES_DECRYPT(directory,'95F5A1F52A554') FROM t1; +AES_DECRYPT(directory,'95F5A1F52A554') +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +DROP TABLE t1; +SET @enc=AES_ENCRYPT(REPEAT(_latin1'a',800),'95F5A1F52A554'); +CREATE TABLE t1 ( +id int(11) NOT NULL PRIMARY KEY, +directory mediumtext +) DEFAULT CHARSET=latin1; +INSERT INTO t1 VALUES (1,AES_DECRYPT(CONVERT(@enc USING binary),'95F5A1F52A554')); +SELECT * FROM t1; +id directory +1 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +DROP TABLE t1; +# # Start of 10.1 tests # # diff --git a/mysql-test/r/func_time.result b/mysql-test/r/func_time.result index 371dffdd3..2180ec2b8 100644 --- a/mysql-test/r/func_time.result +++ b/mysql-test/r/func_time.result @@ -2904,6 +2904,30 @@ NULL Warnings: Warning 1441 Datetime function: datetime field overflow # +# MDEV-13202 Assertion `ltime->neg == 0' failed in date_to_datetime +# +CREATE TABLE t1 (i INT, d DATE); +INSERT INTO t1 VALUES (1, '1970-01-01'); +SELECT MAX(NULLIF(i,1)) FROM t1 ORDER BY DATE_SUB(d,INTERVAL 17300000 HOUR); +MAX(NULLIF(i,1)) +NULL +Warnings: +Warning 1441 Datetime function: datetime field overflow +DROP TABLE t1; +CREATE TABLE t1 (i INT, d DATE); +INSERT INTO t1 VALUES (1, '1970-01-01'); +SELECT CONCAT(DATE_SUB(d, INTERVAL 17300000 HOUR)) FROM t1; +CONCAT(DATE_SUB(d, INTERVAL 17300000 HOUR)) +NULL +Warnings: +Warning 1441 Datetime function: datetime field overflow +DROP TABLE t1; +SELECT CONCAT(DATE_SUB(TIMESTAMP'1970-01-01 00:00:00', INTERVAL 17300000 HOUR)); +CONCAT(DATE_SUB(TIMESTAMP'1970-01-01 00:00:00', INTERVAL 17300000 HOUR)) +NULL +Warnings: +Warning 1441 Datetime function: datetime field overflow +# # End of 10.0 tests # # diff --git a/mysql-test/r/grant.result b/mysql-test/r/grant.result index 826d1f6c6..38d013677 100644 --- a/mysql-test/r/grant.result +++ b/mysql-test/r/grant.result @@ -1644,11 +1644,6 @@ drop user mysqluser11@localhost; drop database mysqltest1; End of 5.0 tests set names utf8; -grant select on test.* to юзер_юзер@localhost; -user() -юзер_юзер@localhost -revoke all on test.* from юзер_юзер@localhost; -drop user юзер_юзер@localhost; grant select on test.* to очень_длинный_юзер890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890@localhost; ERROR HY000: String 'очень_длинный_юзер890123456789012345678901234567890123' is too long for user name (should be no longer than 80) set names default; diff --git a/mysql-test/r/grant2.result b/mysql-test/r/grant2.result index cf58a2dc6..bdd88e126 100644 --- a/mysql-test/r/grant2.result +++ b/mysql-test/r/grant2.result @@ -707,10 +707,9 @@ LOAD INDEX INTO CACHE t3; Table Op Msg_type Msg_text mysqltest_db1.t3 preload_keys status OK # -# RENAME (doesn't work for temporary tables, thus should fail). +# RENAME should work for temporary tables # RENAME TABLE t3 TO t3_1; -ERROR 42000: INSERT, CREATE command denied to user 'mysqltest_u1'@'localhost' for table 't3_1' # # HANDLER OPEN/READ/CLOSE. # diff --git a/mysql-test/r/grant_not_windows.result b/mysql-test/r/grant_not_windows.result new file mode 100644 index 000000000..fedfaf984 --- /dev/null +++ b/mysql-test/r/grant_not_windows.result @@ -0,0 +1,8 @@ +set names utf8; +create user юзер_юзер@localhost; +grant select on test.* to юзер_юзер@localhost; +user() +юзер_юзер@localhost +revoke all on test.* from юзер_юзер@localhost; +drop user юзер_юзер@localhost; +set names default; diff --git a/mysql-test/r/having.result b/mysql-test/r/having.result index f7503597d..3845f1195 100644 --- a/mysql-test/r/having.result +++ b/mysql-test/r/having.result @@ -723,6 +723,20 @@ SELECT * FROM t1 JOIN t2 ON c1 = c2 HAVING c2 > 'a' ORDER BY c2 LIMIT 1; c1 c2 x x DROP TABLE t1,t2; +# +# MDEV-6736: Valgrind warnings 'Invalid read' in subselect_engine::calc_const_tables with SQ +# in WHERE and HAVING, ORDER BY, materialization+semijoin +# +CREATE TABLE t1 (a INT) ENGINE=MyISAM; +INSERT INTO t1 VALUES (3),(8); +CREATE TABLE t2 (b INT) ENGINE=MyISAM; +INSERT INTO t2 VALUES (2),(1); +SELECT a FROM t1 +WHERE 9 IN ( SELECT MIN( a ) FROM t1 ) +HAVING a <> ( SELECT COUNT(*) FROM t2 ) +ORDER BY a; +a +DROP TABLE t1,t2; End of 10.0 tests # # MDEV-10716: Assertion `real_type() != FIELD_ITEM' failed in diff --git a/mysql-test/r/implicit_commit.result b/mysql-test/r/implicit_commit.result index 07536ab07..b0cd0b75e 100644 --- a/mysql-test/r/implicit_commit.result +++ b/mysql-test/r/implicit_commit.result @@ -562,7 +562,7 @@ INSERT INTO db1.trans (a) VALUES (1); cache index t3 in keycache; CALL db1.test_if_commit(); IMPLICIT COMMIT -YES +NO set global keycache.key_buffer_size=0; # # SQLCOM_PRELOAD_KEYS @@ -571,7 +571,7 @@ INSERT INTO db1.trans (a) VALUES (1); load index into cache t3; CALL db1.test_if_commit(); IMPLICIT COMMIT -YES +NO # # SQLCOM_FLUSH # diff --git a/mysql-test/r/information_schema.result b/mysql-test/r/information_schema.result index 2b5a53630..631dd8eab 100644 --- a/mysql-test/r/information_schema.result +++ b/mysql-test/r/information_schema.result @@ -1413,7 +1413,7 @@ USE test; End of 5.0 tests. select * from information_schema.engines WHERE ENGINE="MyISAM"; ENGINE SUPPORT COMMENT TRANSACTIONS XA SAVEPOINTS -MyISAM DEFAULT MyISAM storage engine NO NO NO +MyISAM DEFAULT Non-transactional engine with good performance and small data footprint NO NO NO grant select on *.* to user3148@localhost; select user,db from information_schema.processlist; user db diff --git a/mysql-test/r/insert_select.result b/mysql-test/r/insert_select.result index 3f4a26a72..d130854ec 100644 --- a/mysql-test/r/insert_select.result +++ b/mysql-test/r/insert_select.result @@ -854,3 +854,12 @@ INSERT IGNORE INTO t1 SELECT t1.a FROM t1,t1 t2,t1 t3,t1 t4,t1 t5,t1 t6,t1 t7; SET GLOBAL myisam_data_pointer_size = @old_myisam_data_pointer_size; DROP TABLE t1; End of 5.1 tests +create table t1 (i int); +create table t2 as select values(i) as a from t1; +show create table t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `a` binary(0) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +drop table t1, t2; +End of 5.5 tests diff --git a/mysql-test/r/join_outer.result b/mysql-test/r/join_outer.result index 78cdfe6ec..312b36c16 100644 --- a/mysql-test/r/join_outer.result +++ b/mysql-test/r/join_outer.result @@ -2440,11 +2440,27 @@ CREATE TABLE t1 (b1 BIT NOT NULL); INSERT INTO t1 VALUES (0),(1); CREATE TABLE t2 (b2 BIT NOT NULL); INSERT INTO t2 VALUES (0),(1); -SET SESSION JOIN_CACHE_LEVEL = 3; +set @save_join_cache_level= @@join_cache_level; +SET @@join_cache_level = 3; SELECT t1.b1+'0' , t2.b2 + '0' FROM t1 LEFT JOIN t2 ON b1 = b2; t1.b1+'0' t2.b2 + '0' 0 0 1 1 DROP TABLE t1, t2; +set @join_cache_level= @save_join_cache_level; +# +# MDEV-14779: using left join causes incorrect results with materialization and derived tables +# +create table t1(id int); +insert into t1 values (1),(2); +create table t2(sid int, id int); +insert into t2 values (1,1),(2,2); +select * from t1 t +left join (select * from t2 where sid in (select max(sid) from t2 where 0=1 group by id)) r +on t.id=r.id ; +id sid id +1 NULL NULL +2 NULL NULL +drop table t1, t2; # end of 5.5 tests SET optimizer_switch=@save_optimizer_switch; diff --git a/mysql-test/r/join_outer_jcl6.result b/mysql-test/r/join_outer_jcl6.result index 861b22404..a006bafcf 100644 --- a/mysql-test/r/join_outer_jcl6.result +++ b/mysql-test/r/join_outer_jcl6.result @@ -2451,12 +2451,28 @@ CREATE TABLE t1 (b1 BIT NOT NULL); INSERT INTO t1 VALUES (0),(1); CREATE TABLE t2 (b2 BIT NOT NULL); INSERT INTO t2 VALUES (0),(1); -SET SESSION JOIN_CACHE_LEVEL = 3; +set @save_join_cache_level= @@join_cache_level; +SET @@join_cache_level = 3; SELECT t1.b1+'0' , t2.b2 + '0' FROM t1 LEFT JOIN t2 ON b1 = b2; t1.b1+'0' t2.b2 + '0' 0 0 1 1 DROP TABLE t1, t2; +set @join_cache_level= @save_join_cache_level; +# +# MDEV-14779: using left join causes incorrect results with materialization and derived tables +# +create table t1(id int); +insert into t1 values (1),(2); +create table t2(sid int, id int); +insert into t2 values (1,1),(2,2); +select * from t1 t +left join (select * from t2 where sid in (select max(sid) from t2 where 0=1 group by id)) r +on t.id=r.id ; +id sid id +1 NULL NULL +2 NULL NULL +drop table t1, t2; # end of 5.5 tests SET optimizer_switch=@save_optimizer_switch; set join_cache_level=default; diff --git a/mysql-test/r/limit.result b/mysql-test/r/limit.result index 176a93c7a..228c1be7a 100644 --- a/mysql-test/r/limit.result +++ b/mysql-test/r/limit.result @@ -146,3 +146,19 @@ a 16 DROP TABLE t1; End of 5.1 tests +# +# mdev-16235: SELECT over a table with LIMIT 0 +# +EXPLAIN +SELECT * FROM mysql.slow_log WHERE sql_text != 'foo' LIMIT 0; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Zero limit +SELECT * FROM mysql.slow_log WHERE sql_text != 'foo' LIMIT 0; +start_time user_host query_time lock_time rows_sent rows_examined db last_insert_id insert_id server_id sql_text thread_id rows_affected +EXPLAIN +SELECT * FROM mysql.help_topic WHERE help_category_id != example LIMIT 0; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Zero limit +SELECT * FROM mysql.help_topic WHERE help_category_id != example LIMIT 0; +help_topic_id name help_category_id description example url +End of 5.5 tests diff --git a/mysql-test/r/lock.result b/mysql-test/r/lock.result index 501c379b2..0dcc0de82 100644 --- a/mysql-test/r/lock.result +++ b/mysql-test/r/lock.result @@ -407,7 +407,7 @@ LOCK TABLE t1 WRITE; HANDLER t1 OPEN; ERROR HY000: Can't execute the given command because you have active locked tables or an active transaction HANDLER t1 READ FIRST; -ERROR HY000: Can't execute the given command because you have active locked tables or an active transaction +Got one of the listed errors HANDLER t1 CLOSE; ERROR HY000: Can't execute the given command because you have active locked tables or an active transaction UNLOCK TABLES; diff --git a/mysql-test/r/mdev375.result b/mysql-test/r/mdev375.result index 325808046..b3b83af09 100644 --- a/mysql-test/r/mdev375.result +++ b/mysql-test/r/mdev375.result @@ -1,5 +1,5 @@ SET GLOBAL log_warnings=4; -SET GLOBAL max_connections=2; +SET GLOBAL max_connections=10; SELECT 1; 1 1 diff --git a/mysql-test/r/myisam.result b/mysql-test/r/myisam.result index e114f424e..999f48945 100644 --- a/mysql-test/r/myisam.result +++ b/mysql-test/r/myisam.result @@ -1906,16 +1906,17 @@ DROP TABLE t1; # # BUG#48438 - crash with error in unioned query against merge table and view... # -SET GLOBAL table_open_cache=3; +SET @save_table_open_cache=@@table_open_cache; +SET GLOBAL table_open_cache=10; CREATE TABLE t1(a INT); -SELECT 1 FROM t1 AS a1, t1 AS a2, t1 AS a3, t1 AS a4 FOR UPDATE; +SELECT 1 FROM t1 AS a1, t1 AS a2, t1 AS a3, t1 AS a4, t1 AS a5, t1 AS a6, t1 AS a7, t1 AS a8, t1 AS a9, t1 AS a10, t1 AS a11 FOR UPDATE; 1 SELECT TABLE_ROWS, DATA_LENGTH FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='test' AND TABLE_NAME='t1'; TABLE_ROWS DATA_LENGTH 0 0 DROP TABLE t1; -SET GLOBAL table_open_cache=DEFAULT; +SET GLOBAL table_open_cache=@save_table_open_cache; End of 5.0 tests create table t1 (a int not null, key `a` (a) key_block_size=1024); show create table t1; @@ -2545,6 +2546,14 @@ OPTIMIZE TABLE t1; Table Op Msg_type Msg_text test.t1 optimize status OK DROP TABLE t1; +CREATE TABLE t1(a INT, b CHAR(10), KEY(a), KEY(b)) engine=myisam; +INSERT INTO t1 VALUES(1,'0'),(2,'0'),(3,'0'),(4,'0'),(5,'0'), +(6,'0'),(7,'0'); +flush tables test.t1 for export; +insert into t1 values (8,'0'); +ERROR HY000: Table 't1' was locked with a READ lock and can't be updated +unlock tables; +drop table t1; show variables like 'myisam_block_size'; Variable_name Value myisam_block_size 1024 diff --git a/mysql-test/r/myisam_recover.result b/mysql-test/r/myisam_recover.result index 0829c1e8b..6ae282cb2 100644 --- a/mysql-test/r/myisam_recover.result +++ b/mysql-test/r/myisam_recover.result @@ -18,6 +18,7 @@ call mtr.add_suppression("Got an error from thread_id=.*ha_myisam.cc:"); call mtr.add_suppression("MySQL thread id .*, query id .* localhost.*root Checking table"); call mtr.add_suppression(" '\..test.t1'"); +set @save_table_open_cache=@@table_open_cache; set global table_open_cache=256; set global table_definition_cache=400; drop procedure if exists p_create; @@ -102,7 +103,7 @@ prepare stmt from @drop_table_stmt; execute stmt; deallocate prepare stmt; set @@global.table_definition_cache=default; -set @@global.table_open_cache=default; +set @@global.table_open_cache=@save_table_open_cache; # # 18075170 - sql node restart required to avoid deadlock after # restore diff --git a/mysql-test/r/mysqld--help,win.rdiff b/mysql-test/r/mysqld--help,win.rdiff index 06116a2e6..6e18d16fe 100644 --- a/mysql-test/r/mysqld--help,win.rdiff +++ b/mysql-test/r/mysqld--help,win.rdiff @@ -121,10 +121,10 @@ sync-relay-log 10000 sync-relay-log-info 10000 sysdate-is-now FALSE --table-cache 431 +-table-cache 421 +table-cache 2000 table-definition-cache 400 --table-open-cache 431 +-table-open-cache 421 +table-open-cache 2000 tc-heuristic-recover OFF thread-cache-size 0 diff --git a/mysql-test/r/mysqld--help.result b/mysql-test/r/mysqld--help.result index e84921bfa..fdb4d8c28 100644 --- a/mysql-test/r/mysqld--help.result +++ b/mysql-test/r/mysqld--help.result @@ -2,8 +2,10 @@ Windows bug: happens when a new line is exactly at the right offset. The following options may be given as the first argument: --print-defaults Print the program argument list and exit. --no-defaults Don't read default options from any option file. +The following specify which files/extra groups are read (specified before remaining options): --defaults-file=# Only read default options from the given file #. --defaults-extra-file=# Read this file after the global files are read. +--defaults-group-suffix=# Additionally read default groups with # appended as a suffix. --allow-suspicious-udfs Allows use of UDFs consisting of only one symbol xxx() @@ -1438,9 +1440,9 @@ sync-master-info 10000 sync-relay-log 10000 sync-relay-log-info 10000 sysdate-is-now FALSE -table-cache 431 +table-cache 421 table-definition-cache 400 -table-open-cache 431 +table-open-cache 421 tc-heuristic-recover OFF thread-cache-size 0 thread-pool-idle-timeout 60 diff --git a/mysql-test/r/mysqldump.result b/mysql-test/r/mysqldump.result index a5fe01d63..48e77421b 100644 --- a/mysql-test/r/mysqldump.result +++ b/mysql-test/r/mysqldump.result @@ -5579,3 +5579,18 @@ USE `db1`; DROP DATABASE db1; DROP DATABASE db2; FOUND /Database: mysql/ in bug11505.sql +# +# MDEV-15021: Fix the order in which routines are called +# +use test; +CREATE FUNCTION f() RETURNS INT RETURN 1; +CREATE VIEW v1 AS SELECT f(); +# Running mysqldump -uroot test --routines --tables v1 > **vardir**/test.dmp +DROP VIEW v1; +DROP FUNCTION f; +# Running mysql -uroot test < **vardir**/test.dmp +# +# Cleanup after succesful import. +# +DROP VIEW v1; +DROP FUNCTION f; diff --git a/mysql-test/r/mysqlslap.result b/mysql-test/r/mysqlslap.result index d3c5107de..791cb5ac6 100644 --- a/mysql-test/r/mysqlslap.result +++ b/mysql-test/r/mysqlslap.result @@ -255,3 +255,6 @@ Benchmark # MDEV-4684 - Enhancement request: --init-command support for mysqlslap # DROP TABLE t1; +# +# Bug MDEV-15789 (Upstream: #80329): MYSQLSLAP OPTIONS --AUTO-GENERATE-SQL-GUID-PRIMARY and --AUTO-GENERATE-SQL-SECONDARY-INDEXES DONT WORK +# diff --git a/mysql-test/r/olap.result b/mysql-test/r/olap.result index b10f175b6..24140583d 100644 --- a/mysql-test/r/olap.result +++ b/mysql-test/r/olap.result @@ -766,3 +766,25 @@ b NULL DROP TABLE t1, t2; End of 5.0 tests +# +# Start of 10.1 tests +# +# +# MDEV-16190 Server crashes in Item_null_result::field_type on SELECT with time field, ROLLUP and HAVING +# +CREATE TABLE t1 (t TIME) ENGINE=MyISAM; +INSERT INTO t1 VALUES ('12:12:12'); +SELECT t, COUNT(*) FROM t1 GROUP BY t WITH ROLLUP HAVING t > '00:00:00'; +t COUNT(*) +12:12:12 1 +DROP TABLE t1; +CREATE TABLE t1 (t TIME) ENGINE=MyISAM; +INSERT INTO t1 VALUES ('12:12:12'),('12:12:13'); +SELECT t, COUNT(*) FROM t1 GROUP BY t WITH ROLLUP HAVING t > '00:00:00'; +t COUNT(*) +12:12:12 1 +12:12:13 1 +DROP TABLE t1; +# +# End of 10.1 tests +# diff --git a/mysql-test/r/parser.result b/mysql-test/r/parser.result index 26f4b0187..3ebd84ff5 100644 --- a/mysql-test/r/parser.result +++ b/mysql-test/r/parser.result @@ -673,6 +673,13 @@ PREPARE stmt FROM 'CREATE TRIGGER tr AFTER DELETE ON t1 FOR EACH ROW SET @a = 1\ ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '\' at line 1 DROP TABLE t1; # +# MDEV-15620 Crash when using "SET @@NEW.a=expr" inside a trigger +# +CREATE TABLE t1 (a INT); +CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW SET @@NEW.a=0; +ERROR HY000: Unknown system variable 'NEW' +DROP TABLE t1; +# # MDEV-7792 - SQL Parsing Error - UNION AND ORDER BY WITH JOIN # CREATE TABLE t1(a INT); diff --git a/mysql-test/r/perror.result b/mysql-test/r/perror.result index 432a4fd4c..465544427 100644 --- a/mysql-test/r/perror.result +++ b/mysql-test/r/perror.result @@ -3,4 +3,4 @@ MySQL error code 1062 (ER_DUP_ENTRY): Duplicate entry '%-.192s' for key %d MySQL error code 1408 (ER_STARTUP): %s: ready for connections. Version: '%s' socket: '%s' port: %d %s MySQL error code 1459 (ER_TABLE_NEEDS_UPGRADE): Upgrade required. Please do "REPAIR %s %`s" or dump/reload to fix it! -MySQL error code 1461 (ER_MAX_PREPARED_STMT_COUNT_REACHED): Can't create more than max_prepared_stmt_count statements (current value: %lu) +MySQL error code 1461 (ER_MAX_PREPARED_STMT_COUNT_REACHED): Can't create more than max_prepared_stmt_count statements (current value: %u) diff --git a/mysql-test/r/ps.result b/mysql-test/r/ps.result index 26e7bc373..1b40a7342 100644 --- a/mysql-test/r/ps.result +++ b/mysql-test/r/ps.result @@ -821,7 +821,7 @@ Warnings: Warning 1292 Truncated incorrect max_prepared_stmt_count value: '10000000000000000' select @@max_prepared_stmt_count; @@max_prepared_stmt_count -1048576 +4294967295 set global max_prepared_stmt_count=default; select @@max_prepared_stmt_count; @@max_prepared_stmt_count @@ -4351,3 +4351,45 @@ LINE2 2 LINE3 3 drop table t1; # End of 5.5 tests +# +# Start of 10.1 tests +# +# +# MDEV-12060 Crash in EXECUTE IMMEDIATE with an expression returning a GRANT command +# (the 10.1 part) +# +CREATE PROCEDURE p2 () +BEGIN +SET STATEMENT join_cache_level=CAST(CONCAT(_utf8'6',_latin1'') AS INT) FOR PREPARE stmt FROM 'SELECT 1'; +EXECUTE stmt; +DEALLOCATE PREPARE stmt; +END; +/ +CALL p2(); +1 +1 +DROP PROCEDURE p2; +BEGIN NOT ATOMIC +SET STATEMENT join_cache_level=CAST(CONCAT(_utf8'6',_latin1'') AS INT) FOR PREPARE stmt FROM 'SELECT 1'; +EXECUTE stmt; +DEALLOCATE PREPARE stmt; +END; +/ +1 +1 +BEGIN NOT ATOMIC +SET STATEMENT join_cache_level=CAST(CONCAT(_utf8'6',_latin1'') AS INT) FOR PREPARE stmt FROM 'SELECT 1'; +DEALLOCATE PREPARE stmt; +END; +/ +BEGIN NOT ATOMIC +PREPARE stmt FROM 'SELECT 1'; +SET STATEMENT join_cache_level=CAST(CONCAT(_utf8'6',_latin1'') AS INT) FOR EXECUTE stmt; +DEALLOCATE PREPARE stmt; +END; +/ +1 +1 +# +# End of 10.1 tests +# diff --git a/mysql-test/r/ps_qc_innodb.result b/mysql-test/r/ps_qc_innodb.result new file mode 100644 index 000000000..775055e85 --- /dev/null +++ b/mysql-test/r/ps_qc_innodb.result @@ -0,0 +1,23 @@ +# +# MDEV-15492: Subquery crash similar to MDEV-10050 +# +SET @qcs.save= @@global.query_cache_size, @qct.save= @@global.query_cache_type; +SET GLOBAL query_cache_size= 512*1024*1024, query_cache_type= ON; +CREATE TABLE t1 (a INT) ENGINE=InnoDB; +CREATE TABLE t2 (b INT) ENGINE=InnoDB; +CREATE VIEW v AS select a from t1 join t2; +PREPARE stmt1 FROM "SELECT * FROM t1 WHERE a in (SELECT a FROM v)"; +PREPARE stmt2 FROM "SELECT * FROM t1 WHERE a in (SELECT a FROM v)"; +EXECUTE stmt2; +a +EXECUTE stmt1; +a +INSERT INTO t2 VALUES (0); +EXECUTE stmt1; +a +START TRANSACTION; +EXECUTE stmt1; +a +DROP VIEW v; +DROP TABLE t1, t2; +SET GLOBAL query_cache_size= @qcs.save, query_cache_type= @qct.save; diff --git a/mysql-test/r/rename.result b/mysql-test/r/rename.result index 74370ba74..c90aaf24e 100644 --- a/mysql-test/r/rename.result +++ b/mysql-test/r/rename.result @@ -67,3 +67,69 @@ ERROR HY000: 'test.v1' is not BASE TABLE drop view v1; drop table t1; End of 5.0 tests +CREATE OR REPLACE TABLE t1 (a INT); +CREATE OR REPLACE TABLE t2 (a INT); +CREATE OR REPLACE TEMPORARY TABLE t1_tmp (b INT); +CREATE OR REPLACE TEMPORARY TABLE t2_tmp (b INT); +rename table t1 to t2; +ERROR 42S01: Table 't2' already exists +rename table t1 to tmp, tmp to t2; +ERROR 42S01: Table 't2' already exists +rename table t1_tmp to t2_tmp; +ERROR 42S01: Table 't2_tmp' already exists +rename table t1_tmp to tmp, tmp to t2_tmp; +ERROR 42S01: Table 't2_tmp' already exists +show create table t1_tmp; +Table Create Table +t1_tmp CREATE TEMPORARY TABLE `t1_tmp` ( + `b` int(11) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +show create table t2_tmp; +Table Create Table +t2_tmp CREATE TEMPORARY TABLE `t2_tmp` ( + `b` int(11) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +rename table t1 to t1_tmp; +rename table t2_tmp to t2; +rename table t2 to tmp, tmp to t2; +rename table t1_tmp to tmp, tmp to t1_tmp; +show tables; +Tables_in_test +t1_tmp +t2 +SHOW CREATE TABLE t1_tmp; +Table Create Table +t1_tmp CREATE TEMPORARY TABLE `t1_tmp` ( + `b` int(11) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +drop table t1_tmp; +SHOW CREATE TABLE t1_tmp; +Table Create Table +t1_tmp CREATE TABLE `t1_tmp` ( + `a` int(11) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +drop table t1_tmp; +SHOW CREATE TABLE t2; +Table Create Table +t2 CREATE TEMPORARY TABLE `t2` ( + `b` int(11) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +drop table t2; +SHOW CREATE TABLE t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `a` int(11) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +drop table t2; +CREATE TABLE t1 (a INT); +insert into t1 values (1); +CREATE TEMPORARY TABLE t1 (b INT); +insert into t1 values (2); +RENAME TABLE t1 TO tmp, t1 TO t2; +select * from tmp; +b +2 +select * from t2; +a +1 +drop table tmp,t2; diff --git a/mysql-test/r/selectivity.result b/mysql-test/r/selectivity.result index 018470069..6cb793467 100644 --- a/mysql-test/r/selectivity.result +++ b/mysql-test/r/selectivity.result @@ -356,13 +356,13 @@ and o_orderkey = l_orderkey group by c_name, c_custkey, o_orderkey, o_orderdate, o_totalprice order by o_totalprice desc, o_orderdate; id select_type table type possible_keys key key_len ref rows filtered Extra -1 PRIMARY ALL distinct_key NULL NULL NULL 6005 0.00 Using temporary; Using filesort -1 PRIMARY orders eq_ref PRIMARY,i_o_custkey PRIMARY 4 .l_orderkey 1 100.00 Using where +1 PRIMARY orders ALL PRIMARY,i_o_custkey NULL NULL NULL 1500 100.00 Using where; Using temporary; Using filesort +1 PRIMARY eq_ref distinct_key distinct_key 4 dbt3_s001.orders.o_orderkey 1 100.00 1 PRIMARY customer eq_ref PRIMARY PRIMARY 4 dbt3_s001.orders.o_custkey 1 100.00 -1 PRIMARY lineitem ref PRIMARY,i_l_orderkey,i_l_orderkey_quantity PRIMARY 4 .l_orderkey 4 100.00 +1 PRIMARY lineitem ref PRIMARY,i_l_orderkey,i_l_orderkey_quantity i_l_orderkey_quantity 4 dbt3_s001.orders.o_orderkey 4 100.00 Using index 2 MATERIALIZED lineitem index NULL i_l_orderkey_quantity 13 NULL 6005 100.00 Using index Warnings: -Note 1003 select `dbt3_s001`.`customer`.`c_name` AS `c_name`,`dbt3_s001`.`customer`.`c_custkey` AS `c_custkey`,`dbt3_s001`.`orders`.`o_orderkey` AS `o_orderkey`,`dbt3_s001`.`orders`.`o_orderDATE` AS `o_orderdate`,`dbt3_s001`.`orders`.`o_totalprice` AS `o_totalprice`,sum(`dbt3_s001`.`lineitem`.`l_quantity`) AS `sum(l_quantity)` from (select `dbt3_s001`.`lineitem`.`l_orderkey` from `dbt3_s001`.`lineitem` group by `dbt3_s001`.`lineitem`.`l_orderkey` having (sum(`dbt3_s001`.`lineitem`.`l_quantity`) > 250)) join `dbt3_s001`.`customer` join `dbt3_s001`.`orders` join `dbt3_s001`.`lineitem` where ((`dbt3_s001`.`customer`.`c_custkey` = `dbt3_s001`.`orders`.`o_custkey`) and (`dbt3_s001`.`orders`.`o_orderkey` = ``.`l_orderkey`) and (`dbt3_s001`.`lineitem`.`l_orderkey` = ``.`l_orderkey`)) group by `dbt3_s001`.`customer`.`c_name`,`dbt3_s001`.`customer`.`c_custkey`,`dbt3_s001`.`orders`.`o_orderkey`,`dbt3_s001`.`orders`.`o_orderDATE`,`dbt3_s001`.`orders`.`o_totalprice` order by `dbt3_s001`.`orders`.`o_totalprice` desc,`dbt3_s001`.`orders`.`o_orderDATE` +Note 1003 select `dbt3_s001`.`customer`.`c_name` AS `c_name`,`dbt3_s001`.`customer`.`c_custkey` AS `c_custkey`,`dbt3_s001`.`orders`.`o_orderkey` AS `o_orderkey`,`dbt3_s001`.`orders`.`o_orderDATE` AS `o_orderdate`,`dbt3_s001`.`orders`.`o_totalprice` AS `o_totalprice`,sum(`dbt3_s001`.`lineitem`.`l_quantity`) AS `sum(l_quantity)` from (select `dbt3_s001`.`lineitem`.`l_orderkey` from `dbt3_s001`.`lineitem` group by `dbt3_s001`.`lineitem`.`l_orderkey` having (sum(`dbt3_s001`.`lineitem`.`l_quantity`) > 250)) join `dbt3_s001`.`customer` join `dbt3_s001`.`orders` join `dbt3_s001`.`lineitem` where ((`dbt3_s001`.`customer`.`c_custkey` = `dbt3_s001`.`orders`.`o_custkey`) and (``.`l_orderkey` = `dbt3_s001`.`orders`.`o_orderkey`) and (`dbt3_s001`.`lineitem`.`l_orderkey` = `dbt3_s001`.`orders`.`o_orderkey`)) group by `dbt3_s001`.`customer`.`c_name`,`dbt3_s001`.`customer`.`c_custkey`,`dbt3_s001`.`orders`.`o_orderkey`,`dbt3_s001`.`orders`.`o_orderDATE`,`dbt3_s001`.`orders`.`o_totalprice` order by `dbt3_s001`.`orders`.`o_totalprice` desc,`dbt3_s001`.`orders`.`o_orderDATE` select c_name, c_custkey, o_orderkey, o_orderdate, o_totalprice, sum(l_quantity) from customer, orders, lineitem @@ -1530,6 +1530,68 @@ t 10:00:00 11:00:00 DROP TABLE t1; +# +# MDEV-16374: filtered shows 0 for materilization scan for a semi join, which makes optimizer +# always pick materialization scan over materialization lookup +# +create table t0(a int); +insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9); +create table t1 (a int, b int); +insert into t1 values (0,0),(1,1),(2,2),(3,3),(4,4),(5,5),(6,6),(7,7),(8,8),(9,9),(10,10), +(11,11),(12,12),(13,13),(14,14),(15,15); +set @@optimizer_use_condition_selectivity=2; +explain extended select * from t1 where a in (select max(a) from t1 group by b); +id select_type table type possible_keys key key_len ref rows filtered Extra +1 PRIMARY t1 ALL NULL NULL NULL NULL 16 100.00 Using where +1 PRIMARY eq_ref distinct_key distinct_key 4 test.t1.a 1 100.00 +2 MATERIALIZED t1 ALL NULL NULL NULL NULL 16 100.00 Using temporary +Warnings: +Note 1003 select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b` from (select max(`test`.`t1`.`a`) from `test`.`t1` group by `test`.`t1`.`b`) join `test`.`t1` where (``.`max(a)` = `test`.`t1`.`a`) +select * from t1 where a in (select max(a) from t1 group by b); +a b +0 0 +1 1 +2 2 +3 3 +4 4 +5 5 +6 6 +7 7 +8 8 +9 9 +10 10 +11 11 +12 12 +13 13 +14 14 +15 15 +set @@optimizer_use_condition_selectivity=1; +explain extended select * from t1 where a in (select max(a) from t1 group by b); +id select_type table type possible_keys key key_len ref rows filtered Extra +1 PRIMARY t1 ALL NULL NULL NULL NULL 16 100.00 Using where +1 PRIMARY eq_ref distinct_key distinct_key 4 test.t1.a 1 100.00 +2 MATERIALIZED t1 ALL NULL NULL NULL NULL 16 100.00 Using temporary +Warnings: +Note 1003 select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b` from (select max(`test`.`t1`.`a`) from `test`.`t1` group by `test`.`t1`.`b`) join `test`.`t1` where (``.`max(a)` = `test`.`t1`.`a`) +select * from t1 where a in (select max(a) from t1 group by b); +a b +0 0 +1 1 +2 2 +3 3 +4 4 +5 5 +6 6 +7 7 +8 8 +9 9 +10 10 +11 11 +12 12 +13 13 +14 14 +15 15 +drop table t1,t0; set histogram_size=@save_histogram_size; set optimizer_use_condition_selectivity=@save_optimizer_use_condition_selectivity; set use_stat_tables=@save_use_stat_tables; diff --git a/mysql-test/r/selectivity_innodb.result b/mysql-test/r/selectivity_innodb.result index 070cc49ca..e0227163d 100644 --- a/mysql-test/r/selectivity_innodb.result +++ b/mysql-test/r/selectivity_innodb.result @@ -359,13 +359,13 @@ and o_orderkey = l_orderkey group by c_name, c_custkey, o_orderkey, o_orderdate, o_totalprice order by o_totalprice desc, o_orderdate; id select_type table type possible_keys key key_len ref rows filtered Extra -1 PRIMARY ALL distinct_key NULL NULL NULL 6005 0.00 Using temporary; Using filesort -1 PRIMARY orders eq_ref PRIMARY,i_o_custkey PRIMARY 4 .l_orderkey 1 100.00 Using where +1 PRIMARY orders ALL PRIMARY,i_o_custkey NULL NULL NULL 1500 100.00 Using where; Using temporary; Using filesort +1 PRIMARY eq_ref distinct_key distinct_key 4 dbt3_s001.orders.o_orderkey 1 100.00 1 PRIMARY customer eq_ref PRIMARY PRIMARY 4 dbt3_s001.orders.o_custkey 1 100.00 -1 PRIMARY lineitem ref PRIMARY,i_l_orderkey,i_l_orderkey_quantity PRIMARY 4 .l_orderkey 4 100.00 +1 PRIMARY lineitem ref PRIMARY,i_l_orderkey,i_l_orderkey_quantity i_l_orderkey_quantity 4 dbt3_s001.orders.o_orderkey 4 100.00 Using index 2 MATERIALIZED lineitem index NULL PRIMARY 8 NULL 6005 100.00 Warnings: -Note 1003 select `dbt3_s001`.`customer`.`c_name` AS `c_name`,`dbt3_s001`.`customer`.`c_custkey` AS `c_custkey`,`dbt3_s001`.`orders`.`o_orderkey` AS `o_orderkey`,`dbt3_s001`.`orders`.`o_orderDATE` AS `o_orderdate`,`dbt3_s001`.`orders`.`o_totalprice` AS `o_totalprice`,sum(`dbt3_s001`.`lineitem`.`l_quantity`) AS `sum(l_quantity)` from (select `dbt3_s001`.`lineitem`.`l_orderkey` from `dbt3_s001`.`lineitem` group by `dbt3_s001`.`lineitem`.`l_orderkey` having (sum(`dbt3_s001`.`lineitem`.`l_quantity`) > 250)) join `dbt3_s001`.`customer` join `dbt3_s001`.`orders` join `dbt3_s001`.`lineitem` where ((`dbt3_s001`.`customer`.`c_custkey` = `dbt3_s001`.`orders`.`o_custkey`) and (`dbt3_s001`.`orders`.`o_orderkey` = ``.`l_orderkey`) and (`dbt3_s001`.`lineitem`.`l_orderkey` = ``.`l_orderkey`)) group by `dbt3_s001`.`customer`.`c_name`,`dbt3_s001`.`customer`.`c_custkey`,`dbt3_s001`.`orders`.`o_orderkey`,`dbt3_s001`.`orders`.`o_orderDATE`,`dbt3_s001`.`orders`.`o_totalprice` order by `dbt3_s001`.`orders`.`o_totalprice` desc,`dbt3_s001`.`orders`.`o_orderDATE` +Note 1003 select `dbt3_s001`.`customer`.`c_name` AS `c_name`,`dbt3_s001`.`customer`.`c_custkey` AS `c_custkey`,`dbt3_s001`.`orders`.`o_orderkey` AS `o_orderkey`,`dbt3_s001`.`orders`.`o_orderDATE` AS `o_orderdate`,`dbt3_s001`.`orders`.`o_totalprice` AS `o_totalprice`,sum(`dbt3_s001`.`lineitem`.`l_quantity`) AS `sum(l_quantity)` from (select `dbt3_s001`.`lineitem`.`l_orderkey` from `dbt3_s001`.`lineitem` group by `dbt3_s001`.`lineitem`.`l_orderkey` having (sum(`dbt3_s001`.`lineitem`.`l_quantity`) > 250)) join `dbt3_s001`.`customer` join `dbt3_s001`.`orders` join `dbt3_s001`.`lineitem` where ((`dbt3_s001`.`customer`.`c_custkey` = `dbt3_s001`.`orders`.`o_custkey`) and (``.`l_orderkey` = `dbt3_s001`.`orders`.`o_orderkey`) and (`dbt3_s001`.`lineitem`.`l_orderkey` = `dbt3_s001`.`orders`.`o_orderkey`)) group by `dbt3_s001`.`customer`.`c_name`,`dbt3_s001`.`customer`.`c_custkey`,`dbt3_s001`.`orders`.`o_orderkey`,`dbt3_s001`.`orders`.`o_orderDATE`,`dbt3_s001`.`orders`.`o_totalprice` order by `dbt3_s001`.`orders`.`o_totalprice` desc,`dbt3_s001`.`orders`.`o_orderDATE` select c_name, c_custkey, o_orderkey, o_orderdate, o_totalprice, sum(l_quantity) from customer, orders, lineitem @@ -1540,6 +1540,68 @@ t 10:00:00 11:00:00 DROP TABLE t1; +# +# MDEV-16374: filtered shows 0 for materilization scan for a semi join, which makes optimizer +# always pick materialization scan over materialization lookup +# +create table t0(a int); +insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9); +create table t1 (a int, b int); +insert into t1 values (0,0),(1,1),(2,2),(3,3),(4,4),(5,5),(6,6),(7,7),(8,8),(9,9),(10,10), +(11,11),(12,12),(13,13),(14,14),(15,15); +set @@optimizer_use_condition_selectivity=2; +explain extended select * from t1 where a in (select max(a) from t1 group by b); +id select_type table type possible_keys key key_len ref rows filtered Extra +1 PRIMARY t1 ALL NULL NULL NULL NULL 16 100.00 Using where +1 PRIMARY eq_ref distinct_key distinct_key 4 test.t1.a 1 100.00 +2 MATERIALIZED t1 ALL NULL NULL NULL NULL 16 100.00 Using temporary +Warnings: +Note 1003 select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b` from (select max(`test`.`t1`.`a`) from `test`.`t1` group by `test`.`t1`.`b`) join `test`.`t1` where (``.`max(a)` = `test`.`t1`.`a`) +select * from t1 where a in (select max(a) from t1 group by b); +a b +0 0 +1 1 +2 2 +3 3 +4 4 +5 5 +6 6 +7 7 +8 8 +9 9 +10 10 +11 11 +12 12 +13 13 +14 14 +15 15 +set @@optimizer_use_condition_selectivity=1; +explain extended select * from t1 where a in (select max(a) from t1 group by b); +id select_type table type possible_keys key key_len ref rows filtered Extra +1 PRIMARY t1 ALL NULL NULL NULL NULL 16 100.00 Using where +1 PRIMARY eq_ref distinct_key distinct_key 4 test.t1.a 1 100.00 +2 MATERIALIZED t1 ALL NULL NULL NULL NULL 16 100.00 Using temporary +Warnings: +Note 1003 select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b` from (select max(`test`.`t1`.`a`) from `test`.`t1` group by `test`.`t1`.`b`) join `test`.`t1` where (``.`max(a)` = `test`.`t1`.`a`) +select * from t1 where a in (select max(a) from t1 group by b); +a b +0 0 +1 1 +2 2 +3 3 +4 4 +5 5 +6 6 +7 7 +8 8 +9 9 +10 10 +11 11 +12 12 +13 13 +14 14 +15 15 +drop table t1,t0; set histogram_size=@save_histogram_size; set optimizer_use_condition_selectivity=@save_optimizer_use_condition_selectivity; set use_stat_tables=@save_use_stat_tables; diff --git a/mysql-test/r/sp-destruct.result b/mysql-test/r/sp-destruct.result index 0eddfa70d..a3754d25a 100644 --- a/mysql-test/r/sp-destruct.result +++ b/mysql-test/r/sp-destruct.result @@ -171,3 +171,9 @@ create database mysqltest1; create procedure mysqltest1.foo() select "foo"; update mysql.proc set name='' where db='mysqltest1'; drop database mysqltest1; +create procedure p1() set @foo = 10; +alter table mysql.proc drop primary key; +drop procedure p1; +ERROR HY000: Cannot load from mysql.proc. The table is probably corrupted +alter table mysql.proc add primary key (db,name,type); +drop procedure p1; diff --git a/mysql-test/r/sp-innodb.result b/mysql-test/r/sp-innodb.result index b34057056..8dee74040 100644 --- a/mysql-test/r/sp-innodb.result +++ b/mysql-test/r/sp-innodb.result @@ -130,3 +130,37 @@ SET @@innodb_lock_wait_timeout= @innodb_lock_wait_timeout_saved; # # BUG 16041903: End of test case # +# +# MDEV-15035: SP using query with outer join and a parameter +# in ON expression +# +CREATE TABLE t1 ( +id int NOT NULL, +PRIMARY KEY (id) +) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1), (2); +CREATE TABLE t2 ( +id int NOT NULL, +id_foo int NOT NULL, +PRIMARY KEY (id) +) ENGINE=InnoDB; +INSERT INTO t2 VALUES (1, 1); +DROP PROCEDURE IF EXISTS test_proc; +CREATE PROCEDURE test_proc(IN param int) +LANGUAGE SQL +READS SQL DATA +BEGIN +SELECT DISTINCT f.id +FROM t1 f +LEFT OUTER JOIN t2 b ON b.id_foo = f.id +WHERE (param <> 0 OR b.id IS NOT NULL); +END| +CALL test_proc(0); +id +1 +CALL test_proc(1); +id +1 +2 +DROP PROCEDURE IF EXISTS test_proc; +DROP TABLE t1, t2; diff --git a/mysql-test/r/sp.result b/mysql-test/r/sp.result index 57d704c36..bc33c08d9 100644 --- a/mysql-test/r/sp.result +++ b/mysql-test/r/sp.result @@ -7946,7 +7946,7 @@ CLOSE cur1; end| set @tmp_toc= @@table_open_cache; set @tmp_tdc= @@table_definition_cache; -set global table_open_cache=1; +set global table_open_cache=10; set global table_definition_cache=1; Warnings: Warning 1292 Truncated incorrect table_definition_cache value: '1' @@ -8242,4 +8242,15 @@ DROP PROCEDURE proc_13; DROP PROCEDURE proc_select; DROP TABLE t1, t2; SET max_sp_recursion_depth=default; +# +# MDEV-15347: Valgrind or ASAN errors in mysql_make_view on query +# from information_schema +# +CREATE VIEW v AS SELECT 1; +CREATE FUNCTION f() RETURNS INT RETURN 1; +SELECT * FROM INFORMATION_SCHEMA.TABLES JOIN INFORMATION_SCHEMA.PARAMETERS +UNION +SELECT * FROM INFORMATION_SCHEMA.TABLES JOIN INFORMATION_SCHEMA.PARAMETERS; +DROP FUNCTION f; +DROP VIEW v; #End of 10.1 tests diff --git a/mysql-test/r/statistics.result b/mysql-test/r/statistics.result index 2d0f18f1e..d5a112cc7 100644 --- a/mysql-test/r/statistics.result +++ b/mysql-test/r/statistics.result @@ -1664,6 +1664,24 @@ db_name table_name column_name HEX(min_value) HEX(max_value) nulls_ratio avg_fre test t1 a D879626AF872675F73E662F8 D879626AF872675F73E662F8 0.0000 1.0000 0 NULL NULL drop table t1; # +# MDEB-9744: session optimizer_use_condition_selectivity=5 causing SQL Error (1918): +# Encountered illegal value '' when converting to DECIMAL +# +set @save_optimizer_use_condition_selectivity= @@optimizer_use_condition_selectivity; +set optimizer_use_condition_selectivity=3, use_stat_tables=preferably; +create table t1 (id int(10),cost decimal(9,2)) engine=innodb; +ANALYZE TABLE t1 PERSISTENT FOR ALL; +Table Op Msg_type Msg_text +test.t1 analyze status Engine-independent statistics collected +test.t1 analyze status OK +create temporary table t2 (id int); +insert into t2 (id) select id from t1 where cost > 0; +select * from t2; +id +set use_stat_tables=@save_use_stat_tables; +set optimizer_use_condition_selectivity= @save_optimizer_use_condition_selectivity; +drop table t1,t2; +# # MDEV-9590: Always print "Engine-independent statistic" warnings and # might be filtering columns unintentionally from engines # diff --git a/mysql-test/r/statistics_close.result b/mysql-test/r/statistics_close.result new file mode 100644 index 000000000..348681c33 --- /dev/null +++ b/mysql-test/r/statistics_close.result @@ -0,0 +1,6 @@ +CREATE TABLE t1 (i int); +RENAME TABLE t1 TO t2; +FLUSH TABLES; +DROP TABLE IF EXISTS t1, t2; +Warnings: +Note 1051 Unknown table 'test.t1' diff --git a/mysql-test/r/subselect4.result b/mysql-test/r/subselect4.result index 4e7061512..a7e2bd9d1 100644 --- a/mysql-test/r/subselect4.result +++ b/mysql-test/r/subselect4.result @@ -2489,9 +2489,40 @@ FROM t2 WHERE b <= 'quux' GROUP BY field; field COUNT(DISTINCT c) 0 1 drop table t1,t2; +# +# MDEV-15555: select from DUAL where false yielding wrong result when in a IN +# +explain +SELECT 2 IN (SELECT 2 from DUAL WHERE 1 != 1); +id select_type table type possible_keys key key_len ref rows Extra +1 PRIMARY NULL NULL NULL NULL NULL NULL NULL No tables used +2 SUBQUERY NULL NULL NULL NULL NULL NULL NULL Impossible WHERE +SELECT 2 IN (SELECT 2 from DUAL WHERE 1 != 1); +2 IN (SELECT 2 from DUAL WHERE 1 != 1) +0 SET optimizer_switch= @@global.optimizer_switch; set @@tmp_table_size= @@global.tmp_table_size; # +# MDEV-14515: Wrong results for tableless query with subquery in WHERE +# and implicit aggregation +# +create table t1 (i1 int, i2 int); +insert into t1 values (1314, 1084),(1330, 1084),(1401, 1084),(580, 1084); +create table t2 (cd int); +insert into t2 values +(1330), (1330), (1330), (1330), (1330), (1330), (1330), (1330), +(1330), (1330), (1330), (1330), (1330), (1330), (1330), (1330); +select max(10) from dual +where exists (select 1 from t2 join t1 on t1.i1 = t2.cd and t1.i2 = 345); +max(10) +NULL +insert into t2 select * from t2; +select max(10) from dual +where exists (select 1 from t2 join t1 on t1.i1 = t2.cd and t1.i2 = 345); +max(10) +NULL +DROP TABLE t1,t2; +# # MDEV-10232 Scalar result of subquery changes after adding an outer select stmt # create table t1(c1 int, c2 int, primary key(c2)); diff --git a/mysql-test/r/subselect_mat.result b/mysql-test/r/subselect_mat.result index 934aca92f..924317dbc 100644 --- a/mysql-test/r/subselect_mat.result +++ b/mysql-test/r/subselect_mat.result @@ -2757,6 +2757,21 @@ a b sq 4 2 1 drop table t1, t2; # +# MDEV-15235: Assertion `length > 0' failed in create_ref_for_key +# +CREATE TABLE t1 (i INT); +INSERT INTO t1 VALUES (1),(2); +CREATE TABLE t2 (f CHAR(1)); +INSERT INTO t2 VALUES ('a'),('b'); +explain +SELECT * FROM t2 WHERE f IN ( SELECT LEFT('foo',0) FROM t1 ORDER BY 1 ); +id select_type table type possible_keys key key_len ref rows Extra +1 PRIMARY t2 ALL NULL NULL NULL NULL 2 Using where +2 DEPENDENT SUBQUERY t1 ALL NULL NULL NULL NULL 2 +SELECT * FROM t2 WHERE f IN ( SELECT LEFT('foo',0) FROM t1 ORDER BY 1 ); +f +DROP TABLE t1, t2; +# # MDEV-9489: Assertion `0' failed in Protocol::end_statement() on # UNION ALL # diff --git a/mysql-test/r/subselect_mat_cost_bugs.result b/mysql-test/r/subselect_mat_cost_bugs.result index df6b543ba..d33f1488e 100644 --- a/mysql-test/r/subselect_mat_cost_bugs.result +++ b/mysql-test/r/subselect_mat_cost_bugs.result @@ -334,7 +334,7 @@ SELECT * FROM t1 WHERE (f1) IN (SELECT f1 FROM t2) LIMIT 0; id select_type table type possible_keys key key_len ref rows Extra -1 PRIMARY NULL NULL NULL NULL NULL NULL NULL Impossible WHERE +1 PRIMARY NULL NULL NULL NULL NULL NULL NULL Zero limit 2 DEPENDENT SUBQUERY t2 ALL NULL NULL NULL NULL 2 Using where SELECT * FROM t1 WHERE (f1) IN (SELECT f1 FROM t2) diff --git a/mysql-test/r/subselect_sj.result b/mysql-test/r/subselect_sj.result index 643034f45..77dea34e2 100644 --- a/mysql-test/r/subselect_sj.result +++ b/mysql-test/r/subselect_sj.result @@ -3161,4 +3161,30 @@ id select_type table type possible_keys key key_len ref rows filtered Extra Warnings: Note 1003 select `test`.`t1`.`c1` AS `c1`,`test`.`t2`.`c2` AS `c2`,`test`.`t4`.`c4` AS `c4` from `test`.`t1` left join (`test`.`t2` join `test`.`t4`) on(((`test`.`t2`.`c2` = `test`.`t1`.`c1`) and (`test`.`t1`.`c1`,(select `test`.`t3`.`c3` from `test`.`t3` where ((`test`.`t2`.`c2`) = `test`.`t3`.`c3`))))) where 1 DROP TABLE t1,t2,t3,t4; +# +# MDEV-13699: Assertion `!new_field->field_name.str || +# strlen(new_field->field_name.str) == new_field->field_name.length' +# failed in create_tmp_table on 2nd execution of PS with semijoin +# +CREATE TABLE t1 (a INT); +INSERT INTO t1 VALUES (1),(2); +CREATE TABLE t2 (b INT); +INSERT INTO t2 VALUES (3),(4); +CREATE TABLE t3 (c INT); +CREATE ALGORITHM=MERGE VIEW v3 AS SELECT * FROM t3; +INSERT INTO t3 VALUES (5),(6); +PREPARE stmt FROM +"SELECT * FROM t1 + WHERE EXISTS ( + SELECT * FROM t2 WHERE t1.a IN ( SELECT c AS fld FROM v3 ) + )"; +EXECUTE stmt; +a +EXECUTE stmt; +a +EXECUTE stmt; +a +drop view v3; +drop table t1,t2,t3; +# End of 5.5 test set optimizer_switch=@subselect_sj_tmp; diff --git a/mysql-test/r/subselect_sj2_mat.result b/mysql-test/r/subselect_sj2_mat.result index c8ee451c6..db4ae1714 100644 --- a/mysql-test/r/subselect_sj2_mat.result +++ b/mysql-test/r/subselect_sj2_mat.result @@ -1655,3 +1655,60 @@ id select_type table type possible_keys key key_len ref rows Extra 1 PRIMARY eq_ref distinct_key distinct_key 11 func 1 2 MATERIALIZED t2 ALL NULL NULL NULL NULL 3 Using where DROP TABLE t1,t2; +# +# MDEV-16225: wrong resultset from query with semijoin=on +# +CREATE TABLE t1 ( +`id` int(10) NOT NULL AUTO_INCREMENT, +`local_name` varchar(64) NOT NULL, +PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=latin1; +insert into t1(`id`,`local_name`) values +(1,'Cash Advance'), +(2,'Cash Advance'), +(3,'Rollover'), +(4,'AL Installment'), +(5,'AL Installment'), +(6,'AL Installment'), +(7,'AL Installment'), +(8,'AL Installment'), +(9,'AL Installment'), +(10,'Internet Payday'), +(11,'Rollover - Internet Payday'), +(12,'AL Monthly Installment'), +(13,'AL Semi-Monthly Installment'); +explain +SELECT SQL_NO_CACHE t.id +FROM t1 t +WHERE ( +t.id IN (SELECT A.id FROM t1 AS A WHERE A.local_name IN (SELECT B.local_name FROM t1 AS B WHERE B.id IN (0,4,12,13,1,10,3,11))) +OR +(t.id IN (0,4,12,13,1,10,3,11)) +); +id select_type table type possible_keys key key_len ref rows Extra +1 PRIMARY t index PRIMARY PRIMARY 4 NULL 13 Using where; Using index +2 MATERIALIZED ALL distinct_key NULL NULL NULL 8 +2 MATERIALIZED A ALL PRIMARY NULL NULL NULL 13 Using where; Using join buffer (flat, BNL join) +3 MATERIALIZED B ALL PRIMARY NULL NULL NULL 13 Using where +SELECT SQL_NO_CACHE t.id +FROM t1 t +WHERE ( +t.id IN (SELECT A.id FROM t1 AS A WHERE A.local_name IN (SELECT B.local_name FROM t1 AS B WHERE B.id IN (0,4,12,13,1,10,3,11))) +OR +(t.id IN (0,4,12,13,1,10,3,11)) +); +id +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +drop table t1; diff --git a/mysql-test/r/subselect_sj_jcl6.result b/mysql-test/r/subselect_sj_jcl6.result index 6d9dc3734..0741eb236 100644 --- a/mysql-test/r/subselect_sj_jcl6.result +++ b/mysql-test/r/subselect_sj_jcl6.result @@ -3175,6 +3175,32 @@ id select_type table type possible_keys key key_len ref rows filtered Extra Warnings: Note 1003 select `test`.`t1`.`c1` AS `c1`,`test`.`t2`.`c2` AS `c2`,`test`.`t4`.`c4` AS `c4` from `test`.`t1` left join (`test`.`t2` join `test`.`t4`) on(((`test`.`t2`.`c2` = `test`.`t1`.`c1`) and (`test`.`t1`.`c1`,(select `test`.`t3`.`c3` from `test`.`t3` where ((`test`.`t2`.`c2`) = `test`.`t3`.`c3`))))) where 1 DROP TABLE t1,t2,t3,t4; +# +# MDEV-13699: Assertion `!new_field->field_name.str || +# strlen(new_field->field_name.str) == new_field->field_name.length' +# failed in create_tmp_table on 2nd execution of PS with semijoin +# +CREATE TABLE t1 (a INT); +INSERT INTO t1 VALUES (1),(2); +CREATE TABLE t2 (b INT); +INSERT INTO t2 VALUES (3),(4); +CREATE TABLE t3 (c INT); +CREATE ALGORITHM=MERGE VIEW v3 AS SELECT * FROM t3; +INSERT INTO t3 VALUES (5),(6); +PREPARE stmt FROM +"SELECT * FROM t1 + WHERE EXISTS ( + SELECT * FROM t2 WHERE t1.a IN ( SELECT c AS fld FROM v3 ) + )"; +EXECUTE stmt; +a +EXECUTE stmt; +a +EXECUTE stmt; +a +drop view v3; +drop table t1,t2,t3; +# End of 5.5 test set optimizer_switch=@subselect_sj_tmp; # # BUG#49129: Wrong result with IN-subquery with join_cache_level=6 and firstmatch=off diff --git a/mysql-test/r/subselect_sj_nonmerged.result b/mysql-test/r/subselect_sj_nonmerged.result index c7e04225f..47970668a 100644 --- a/mysql-test/r/subselect_sj_nonmerged.result +++ b/mysql-test/r/subselect_sj_nonmerged.result @@ -77,9 +77,9 @@ explain select * from t4 where t4.a in (select max(t2.a) from t1, t2 group by t2.b) and t4.b in (select max(t2.a) from t1, t2 group by t2.b); id select_type table type possible_keys key key_len ref rows Extra -1 PRIMARY ALL distinct_key NULL NULL NULL 5 -1 PRIMARY ALL distinct_key NULL NULL NULL 5 Using join buffer (flat, BNL join) -1 PRIMARY t4 ref a a 10 .max(t2.a),.max(t2.a) 12 +1 PRIMARY ALL distinct_key NULL NULL NULL 5 +1 PRIMARY t4 ref a a 5 .max(t2.a) 12 Using index condition +1 PRIMARY eq_ref distinct_key distinct_key 4 test.t4.b 1 3 MATERIALIZED t2 ALL NULL NULL NULL NULL 5 Using temporary 3 MATERIALIZED t1 ALL NULL NULL NULL NULL 10 Using join buffer (flat, BNL join) 2 MATERIALIZED t2 ALL NULL NULL NULL NULL 5 Using temporary diff --git a/mysql-test/r/trigger.result b/mysql-test/r/trigger.result index 8455450e2..8852a6222 100644 --- a/mysql-test/r/trigger.result +++ b/mysql-test/r/trigger.result @@ -2306,4 +2306,15 @@ CREATE TABLE t1 (i INT); insert into t2 value (2); DROP VIEW v1; DROP TABLE t1,t2,t3; -End of 10.1 tests. +# +# MDEV-16093 +# Assertion `global_status_var.global_memory_used == 0' failed or +# bytes lost after inserting into table with non-null blob and trigger +# +CREATE TABLE t1 (b BLOB NOT NULL); +CREATE TRIGGER tr BEFORE UPDATE ON t1 FOR EACH ROW BEGIN END; +INSERT INTO t1 VALUES ('foo'); +DROP TABLE t1; +# +# End of 10.1 tests. +# diff --git a/mysql-test/r/type_time.result b/mysql-test/r/type_time.result index b5689d31a..fc287e86f 100644 --- a/mysql-test/r/type_time.result +++ b/mysql-test/r/type_time.result @@ -1215,5 +1215,36 @@ MAX(a) MAX(COALESCE(a)) 10:20:30 10:20:30 DROP TABLE t1; # +# MDEV-15321: different results when using value of optimizer_use_condition_selectivity=4 and =1 +# +SET @save_old_mode=@@old_mode; +SET @@old_mode=zero_date_time_cast; +CREATE TABLE t1 (a TIME); +INSERT INTO t1 VALUES ('0000-00-00 10:20:30'),('0000-00-00 10:20:31'); +INSERT INTO t1 VALUES ('0000-00-01 10:20:30'),('0000-00-01 10:20:31'); +INSERT INTO t1 VALUES ('31 10:20:30'),('32 10:20:30'),('33 10:20:30'),('34 10:20:30'); +SET @save_optimizer_use_condition_selectivity= @@optimizer_use_condition_selectivity; +SET @@optimizer_use_condition_selectivity=1; +SELECT * FROM t1 WHERE a='0000-00-01 10:20:30' AND LENGTH(a)=8; +a +34:20:30 +EXPLAIN EXTENDED SELECT * FROM t1 WHERE a='0000-00-01 10:20:30' AND LENGTH(a)=8; +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 8 100.00 Using where +Warnings: +Note 1003 select `test`.`t1`.`a` AS `a` from `test`.`t1` where ((`test`.`t1`.`a` = '0000-00-01 10:20:30') and (length(`test`.`t1`.`a`) = 8)) +SET @@optimizer_use_condition_selectivity=4; +SELECT * FROM t1 WHERE a='0000-00-01 10:20:30' AND LENGTH(a)=8; +a +34:20:30 +EXPLAIN EXTENDED SELECT * FROM t1 WHERE a='0000-00-01 10:20:30' AND LENGTH(a)=8; +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 8 100.00 Using where +Warnings: +Note 1003 select `test`.`t1`.`a` AS `a` from `test`.`t1` where ((`test`.`t1`.`a` = '0000-00-01 10:20:30') and (length(`test`.`t1`.`a`) = 8)) +drop table t1; +SET @@optimizer_use_condition_selectivity= @save_optimizer_use_condition_selectivity; +set @@old_mode= @save_old_mode; +# # End of 10.1 tests # diff --git a/mysql-test/r/type_time_6065.result b/mysql-test/r/type_time_6065.result index a61c658d5..067fe9b89 100644 --- a/mysql-test/r/type_time_6065.result +++ b/mysql-test/r/type_time_6065.result @@ -2308,3 +2308,47 @@ col_int_nokey 1 DROP TABLE t1,t2,t3; SET TIMESTAMP=0; +# +# MDEV-15262 Wrong results for SELECT..WHERE non_indexed_datetime_column=indexed_time_column +# +SET TIMESTAMP=UNIX_TIMESTAMP('2012-01-31 10:14:35'); +CREATE TABLE t1 (col_time_key TIME, KEY(col_time_key)); +CREATE TABLE t2 (col_datetime_key DATETIME); +INSERT INTO t1 VALUES ('-760:00:00'),('760:00:00'); +INSERT INTO t1 VALUES ('-770:00:00'),('770:00:00'); +INSERT INTO t2 SELECT * FROM t1; +SELECT * FROM t2 STRAIGHT_JOIN t1 IGNORE INDEX(col_time_key) WHERE col_time_key = col_datetime_key; +col_datetime_key col_time_key +2011-12-30 08:00:00 -760:00:00 +2012-03-02 16:00:00 760:00:00 +2011-12-29 22:00:00 -770:00:00 +2012-03-03 02:00:00 770:00:00 +SELECT * FROM t2 STRAIGHT_JOIN t1 FORCE INDEX (col_time_key) WHERE col_time_key = col_datetime_key; +col_datetime_key col_time_key +2011-12-29 22:00:00 -770:00:00 +2011-12-30 08:00:00 -760:00:00 +2012-03-02 16:00:00 760:00:00 +2012-03-03 02:00:00 770:00:00 +INSERT INTO t1 VALUES ('-838:59:59'),('838:59:59'); +INSERT INTO t2 VALUES (DATE_ADD(CURRENT_DATE, INTERVAL '-838:59:59' HOUR_SECOND)); +INSERT INTO t2 VALUES (DATE_ADD(CURRENT_DATE, INTERVAL '838:59:59' HOUR_SECOND)); +INSERT INTO t2 VALUES (DATE_ADD(CURRENT_DATE, INTERVAL '-839:00:00' HOUR_SECOND)); +INSERT INTO t2 VALUES (DATE_ADD(CURRENT_DATE, INTERVAL '839:00:00' HOUR_SECOND)); +SELECT * FROM t2 STRAIGHT_JOIN t1 IGNORE INDEX(col_time_key) WHERE col_time_key = col_datetime_key; +col_datetime_key col_time_key +2011-12-30 08:00:00 -760:00:00 +2012-03-02 16:00:00 760:00:00 +2011-12-29 22:00:00 -770:00:00 +2012-03-03 02:00:00 770:00:00 +2011-12-27 01:00:01 -838:59:59 +2012-03-05 22:59:59 838:59:59 +SELECT * FROM t2 STRAIGHT_JOIN t1 FORCE INDEX (col_time_key) WHERE col_time_key = col_datetime_key; +col_datetime_key col_time_key +2011-12-29 22:00:00 -770:00:00 +2011-12-30 08:00:00 -760:00:00 +2012-03-02 16:00:00 760:00:00 +2012-03-03 02:00:00 770:00:00 +2011-12-27 01:00:01 -838:59:59 +2012-03-05 22:59:59 838:59:59 +DROP TABLE t1, t2; +SET TIMESTAMP=DEFAULT; diff --git a/mysql-test/r/variables.result b/mysql-test/r/variables.result index b621fc13e..df0d16237 100644 --- a/mysql-test/r/variables.result +++ b/mysql-test/r/variables.result @@ -568,6 +568,7 @@ set sql_safe_updates=1; set sql_select_limit=1; set sql_select_limit=default; set sql_warnings=1; +set @save_table_open_cache=@@table_open_cache; set global table_open_cache=100; set default_storage_engine=myisam; set global thread_cache_size=100; @@ -748,11 +749,11 @@ Warnings: Warning 1292 Truncated incorrect table_open_cache value: '-1' SHOW VARIABLES LIKE 'table_open_cache'; Variable_name Value -table_open_cache 1 +table_open_cache 10 SELECT * FROM INFORMATION_SCHEMA.SESSION_VARIABLES WHERE VARIABLE_NAME LIKE 'table_open_cache'; VARIABLE_NAME VARIABLE_VALUE -TABLE_OPEN_CACHE 1 -SET GLOBAL table_open_cache=DEFAULT; +TABLE_OPEN_CACHE 10 +SET GLOBAL table_open_cache=@save_table_open_cache; set character_set_results=NULL; select ifnull(@@character_set_results,"really null"); ifnull(@@character_set_results,"really null") diff --git a/mysql-test/r/view.result b/mysql-test/r/view.result index 88f40b2cc..e8c96e499 100644 --- a/mysql-test/r/view.result +++ b/mysql-test/r/view.result @@ -5268,114 +5268,6 @@ execute stmt1; deallocate prepare stmt1; drop view v1,v2; drop table t1,t2; -# -# MDEV-6251: SIGSEGV in query optimizer (in set_check_materialized -# with MERGE view) -# -CREATE TABLE t1 (a1 INT(11) NOT NULL DEFAULT NULL AUTO_INCREMENT PRIMARY KEY); -CREATE TABLE t2 (b1 INT(11) NOT NULL DEFAULT NULL AUTO_INCREMENT PRIMARY KEY); -CREATE TABLE t3 (c1 INT(11) NOT NULL DEFAULT NULL AUTO_INCREMENT PRIMARY KEY); -CREATE TABLE t4 (d1 INT(11) NOT NULL DEFAULT NULL AUTO_INCREMENT PRIMARY KEY); -CREATE TABLE t5 (e1 INT(11) NOT NULL DEFAULT NULL AUTO_INCREMENT PRIMARY KEY); -CREATE TABLE t6 (f1 INT(11) NOT NULL DEFAULT NULL AUTO_INCREMENT PRIMARY KEY); -CREATE OR REPLACE view v1 AS -SELECT 1 -FROM t1 a_alias_1 -LEFT JOIN (t2 b_alias_1 JOIN t1 a_alias_2) ON b_alias_1.b1 = a_alias_1.a1 AND a_alias_2.a1 = a_alias_1.a1 -LEFT JOIN t3 c_alias_1 ON c_alias_1.c1 = a_alias_1.a1 -LEFT JOIN t4 d_alias_1 ON d_alias_1.d1 = a_alias_1.a1 -LEFT JOIN t3 c_alias_2 ON c_alias_2.c1 = a_alias_1.a1 -LEFT JOIN t5 e_alias_1 ON e_alias_1.e1 = a_alias_1.a1 -LEFT JOIN t6 f_alias_1 ON f_alias_1.f1 = a_alias_1.a1 -; -SELECT 1 -FROM (( SELECT 1 -FROM t1 a_alias_1 -LEFT JOIN (t2 b_alias_1 JOIN t1 a_alias_2) ON b_alias_1.b1 = a_alias_1.a1 AND a_alias_2.a1 = a_alias_1.a1 -LEFT JOIN t3 c_alias_1 ON c_alias_1.c1 = a_alias_1.a1 -LEFT JOIN t4 d_alias_1 ON d_alias_1.d1 = a_alias_1.a1 -LEFT JOIN t3 c_alias_2 ON c_alias_2.c1 = a_alias_1.a1 -LEFT JOIN t5 e_alias_1 ON e_alias_1.e1 = a_alias_1.a1 -LEFT JOIN t6 f_alias_1 ON f_alias_1.f1 = a_alias_1.a1 -) t1) -LEFT OUTER JOIN (( SELECT 1 -FROM t1 a_alias_1 -LEFT JOIN (t2 b_alias_1 JOIN t1 a_alias_2) ON b_alias_1.b1 = a_alias_1.a1 AND a_alias_2.a1 = a_alias_1.a1 -LEFT JOIN t3 c_alias_1 ON c_alias_1.c1 = a_alias_1.a1 -LEFT JOIN t4 d_alias_1 ON d_alias_1.d1 = a_alias_1.a1 -LEFT JOIN t3 c_alias_2 ON c_alias_2.c1 = a_alias_1.a1 -LEFT JOIN t5 e_alias_1 ON e_alias_1.e1 = a_alias_1.a1 -LEFT JOIN t6 f_alias_1 ON f_alias_1.f1 = a_alias_1.a1 -) t2) ON 1=1 -LEFT OUTER JOIN (( SELECT 1 -FROM t1 a_alias_1 -LEFT JOIN (t2 b_alias_1 JOIN t1 a_alias_2) ON b_alias_1.b1 = a_alias_1.a1 AND a_alias_2.a1 = a_alias_1.a1 -LEFT JOIN t3 c_alias_1 ON c_alias_1.c1 = a_alias_1.a1 -LEFT JOIN t4 d_alias_1 ON d_alias_1.d1 = a_alias_1.a1 -LEFT JOIN t3 c_alias_2 ON c_alias_2.c1 = a_alias_1.a1 -LEFT JOIN t5 e_alias_1 ON e_alias_1.e1 = a_alias_1.a1 -LEFT JOIN t6 f_alias_1 ON f_alias_1.f1 = a_alias_1.a1 -) t3) ON 1=1 -LEFT OUTER JOIN (( SELECT 1 -FROM t1 a_alias_1 -LEFT JOIN (t2 b_alias_1 JOIN t1 a_alias_2) ON b_alias_1.b1 = a_alias_1.a1 AND a_alias_2.a1 = a_alias_1.a1 -LEFT JOIN t3 c_alias_1 ON c_alias_1.c1 = a_alias_1.a1 -LEFT JOIN t4 d_alias_1 ON d_alias_1.d1 = a_alias_1.a1 -LEFT JOIN t3 c_alias_2 ON c_alias_2.c1 = a_alias_1.a1 -LEFT JOIN t5 e_alias_1 ON e_alias_1.e1 = a_alias_1.a1 -LEFT JOIN t6 f_alias_1 ON f_alias_1.f1 = a_alias_1.a1 -) t4) ON 1=1 -LEFT OUTER JOIN (( SELECT 1 -FROM t1 a_alias_1 -LEFT JOIN (t2 b_alias_1 JOIN t1 a_alias_2) ON b_alias_1.b1 = a_alias_1.a1 AND a_alias_2.a1 = a_alias_1.a1 -LEFT JOIN t3 c_alias_1 ON c_alias_1.c1 = a_alias_1.a1 -LEFT JOIN t4 d_alias_1 ON d_alias_1.d1 = a_alias_1.a1 -LEFT JOIN t3 c_alias_2 ON c_alias_2.c1 = a_alias_1.a1 -LEFT JOIN t5 e_alias_1 ON e_alias_1.e1 = a_alias_1.a1 -LEFT JOIN t6 f_alias_1 ON f_alias_1.f1 = a_alias_1.a1 -) t5) ON 1=1 -LEFT OUTER JOIN (( SELECT 1 -FROM t1 a_alias_1 -LEFT JOIN (t2 b_alias_1 JOIN t1 a_alias_2) ON b_alias_1.b1 = a_alias_1.a1 AND a_alias_2.a1 = a_alias_1.a1 -LEFT JOIN t3 c_alias_1 ON c_alias_1.c1 = a_alias_1.a1 -LEFT JOIN t4 d_alias_1 ON d_alias_1.d1 = a_alias_1.a1 -LEFT JOIN t3 c_alias_2 ON c_alias_2.c1 = a_alias_1.a1 -LEFT JOIN t5 e_alias_1 ON e_alias_1.e1 = a_alias_1.a1 -LEFT JOIN t6 f_alias_1 ON f_alias_1.f1 = a_alias_1.a1 -) t6) ON 1=1 -LEFT OUTER JOIN (( SELECT 1 -FROM t1 a_alias_1 -LEFT JOIN (t2 b_alias_1 JOIN t1 a_alias_2) ON b_alias_1.b1 = a_alias_1.a1 AND a_alias_2.a1 = a_alias_1.a1 -LEFT JOIN t3 c_alias_1 ON c_alias_1.c1 = a_alias_1.a1 -LEFT JOIN t4 d_alias_1 ON d_alias_1.d1 = a_alias_1.a1 -LEFT JOIN t3 c_alias_2 ON c_alias_2.c1 = a_alias_1.a1 -LEFT JOIN t5 e_alias_1 ON e_alias_1.e1 = a_alias_1.a1 -LEFT JOIN t6 f_alias_1 ON f_alias_1.f1 = a_alias_1.a1 -) t7) ON 1=1 -LEFT OUTER JOIN (( SELECT 1 -FROM t1 a_alias_1 -LEFT JOIN (t2 b_alias_1 JOIN t1 a_alias_2) ON b_alias_1.b1 = a_alias_1.a1 AND a_alias_2.a1 = a_alias_1.a1 -LEFT JOIN t3 c_alias_1 ON c_alias_1.c1 = a_alias_1.a1 -LEFT JOIN t4 d_alias_1 ON d_alias_1.d1 = a_alias_1.a1 -LEFT JOIN t3 c_alias_2 ON c_alias_2.c1 = a_alias_1.a1 -LEFT JOIN t5 e_alias_1 ON e_alias_1.e1 = a_alias_1.a1 -LEFT JOIN t6 f_alias_1 ON f_alias_1.f1 = a_alias_1.a1 -) t8) ON 1=1 -; -1 -SELECT 1 -FROM (v1 t1) -LEFT OUTER JOIN (v1 t2) ON 1=1 -LEFT OUTER JOIN (v1 t3) ON 1=1 -LEFT OUTER JOIN (v1 t4) ON 1=1 -LEFT OUTER JOIN (v1 t5) ON 1=1 -LEFT OUTER JOIN (v1 t6) ON 1=1 -LEFT OUTER JOIN (v1 t7) ON 1=1 -LEFT OUTER JOIN (v1 t8) ON 1=1 -; -1 -drop view v1; -drop table t1,t2,t3,t4,t5,t6; # ----------------------------------------------------------------- # -- End of 5.3 tests. # ----------------------------------------------------------------- @@ -5676,6 +5568,203 @@ View Create View character_set_client collation_connection v1 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS select group_concat(`t1`.`str` separator '\\') AS `GROUP_CONCAT(str SEPARATOR '\\')` from `t1` latin1 latin1_swedish_ci drop view v1; drop table t1; +CREATE TABLE IF NOT EXISTS t0 (f0 INT); +CREATE TABLE IF NOT EXISTS t1 (f1 INT); +CREATE TABLE IF NOT EXISTS t2 (f2 INT); +CREATE TABLE IF NOT EXISTS t3 (f3 INT); +CREATE TABLE IF NOT EXISTS t4 (f4 INT); +CREATE TABLE IF NOT EXISTS t5 (f5 INT); +CREATE TABLE IF NOT EXISTS t6 (f6 INT); +CREATE TABLE IF NOT EXISTS t7 (f7 INT); +CREATE TABLE IF NOT EXISTS t8 (f8 INT); +CREATE TABLE IF NOT EXISTS t9 (f9 INT); +CREATE TABLE IF NOT EXISTS t10 (f10 INT); +CREATE TABLE IF NOT EXISTS t11 (f11 INT); +CREATE TABLE IF NOT EXISTS t12 (f12 INT); +CREATE TABLE IF NOT EXISTS t13 (f13 INT); +CREATE TABLE IF NOT EXISTS t14 (f14 INT); +CREATE TABLE IF NOT EXISTS t15 (f15 INT); +CREATE TABLE IF NOT EXISTS t16 (f16 INT); +CREATE TABLE IF NOT EXISTS t17 (f17 INT); +CREATE TABLE IF NOT EXISTS t18 (f18 INT); +CREATE TABLE IF NOT EXISTS t19 (f19 INT); +CREATE TABLE IF NOT EXISTS t20 (f20 INT); +CREATE TABLE IF NOT EXISTS t21 (f21 INT); +CREATE TABLE IF NOT EXISTS t22 (f22 INT); +CREATE TABLE IF NOT EXISTS t23 (f23 INT); +CREATE TABLE IF NOT EXISTS t24 (f24 INT); +CREATE TABLE IF NOT EXISTS t25 (f25 INT); +CREATE TABLE IF NOT EXISTS t26 (f26 INT); +CREATE TABLE IF NOT EXISTS t27 (f27 INT); +CREATE TABLE IF NOT EXISTS t28 (f28 INT); +CREATE TABLE IF NOT EXISTS t29 (f29 INT); +CREATE TABLE IF NOT EXISTS t30 (f30 INT); +CREATE TABLE IF NOT EXISTS t31 (f31 INT); +CREATE TABLE IF NOT EXISTS t32 (f32 INT); +CREATE TABLE IF NOT EXISTS t33 (f33 INT); +CREATE TABLE IF NOT EXISTS t34 (f34 INT); +CREATE TABLE IF NOT EXISTS t35 (f35 INT); +CREATE TABLE IF NOT EXISTS t36 (f36 INT); +CREATE TABLE IF NOT EXISTS t37 (f37 INT); +CREATE TABLE IF NOT EXISTS t38 (f38 INT); +CREATE TABLE IF NOT EXISTS t39 (f39 INT); +CREATE TABLE IF NOT EXISTS t40 (f40 INT); +CREATE TABLE IF NOT EXISTS t41 (f41 INT); +CREATE TABLE IF NOT EXISTS t42 (f42 INT); +CREATE TABLE IF NOT EXISTS t43 (f43 INT); +CREATE TABLE IF NOT EXISTS t44 (f44 INT); +CREATE TABLE IF NOT EXISTS t45 (f45 INT); +CREATE TABLE IF NOT EXISTS t46 (f46 INT); +CREATE TABLE IF NOT EXISTS t47 (f47 INT); +CREATE TABLE IF NOT EXISTS t48 (f48 INT); +CREATE TABLE IF NOT EXISTS t49 (f49 INT); +CREATE TABLE IF NOT EXISTS t50 (f50 INT); +CREATE TABLE IF NOT EXISTS t51 (f51 INT); +CREATE TABLE IF NOT EXISTS t52 (f52 INT); +CREATE TABLE IF NOT EXISTS t53 (f53 INT); +CREATE TABLE IF NOT EXISTS t54 (f54 INT); +CREATE TABLE IF NOT EXISTS t55 (f55 INT); +CREATE TABLE IF NOT EXISTS t56 (f56 INT); +CREATE TABLE IF NOT EXISTS t57 (f57 INT); +CREATE TABLE IF NOT EXISTS t58 (f58 INT); +CREATE TABLE IF NOT EXISTS t59 (f59 INT); +CREATE TABLE IF NOT EXISTS t60 (f60 INT); +CREATE OR REPLACE VIEW v60 AS SELECT * FROM t60; +EXPLAIN +SELECT t0.* +FROM t0 +JOIN t1 +ON t1.f1 = t0.f0 +LEFT JOIN t2 +ON t0.f0 = t2.f2 +LEFT JOIN t3 +ON t0.f0 = t3.f3 +LEFT JOIN t4 +ON t0.f0 = t4.f4 +LEFT JOIN t5 +ON t4.f4 = t5.f5 +LEFT JOIN t6 +ON t0.f0 = t6.f6 +LEFT JOIN t7 +ON t0.f0 = t7.f7 +LEFT JOIN t8 +ON t0.f0 = t8.f8 +LEFT JOIN t9 +ON t0.f0 = t9.f9 +LEFT JOIN t10 +ON t0.f0 = t10.f10 +LEFT JOIN t11 +ON t0.f0 = t11.f11 +LEFT JOIN t12 +ON t0.f0 = t12.f12 +LEFT JOIN t13 +ON t0.f0 = t13.f13 +LEFT JOIN t14 +ON t0.f0 = t14.f14 +LEFT JOIN t15 +ON t0.f0 = t15.f15 +LEFT JOIN t16 +ON t0.f0 = t16.f16 +LEFT JOIN t17 +ON t0.f0 = t17.f17 +LEFT JOIN t18 +ON t0.f0 = t18.f18 +LEFT JOIN t19 +ON t18.f18 = t19.f19 +LEFT JOIN t20 +ON t20.f20 = t19.f19 +LEFT JOIN t21 +ON t20.f20 = t21.f21 +LEFT JOIN t22 +ON t19.f19 = t22.f22 +LEFT JOIN t23 +ON t23.f23 = t0.f0 +LEFT JOIN t24 +ON t24.f24 = t23.f23 +LEFT JOIN t25 +ON t0.f0 = t25.f25 +LEFT JOIN t26 +ON t26.f26 = t0.f0 +LEFT JOIN t27 +ON t27.f27 = t0.f0 +LEFT JOIN t28 +ON t0.f0 = t28.f28 +LEFT JOIN t29 +ON t0.f0 = t29.f29 +LEFT JOIN t30 +ON t30.f30 = t0.f0 +LEFT JOIN t31 +ON t0.f0 = t31.f31 +LEFT JOIN t32 +ON t32.f32 = t31.f31 +LEFT JOIN t33 +ON t33.f33 = t0.f0 +LEFT JOIN t34 +ON t33.f33 = t34.f34 +LEFT JOIN t35 +ON t33.f33 = t35.f35 +LEFT JOIN t36 +ON t36.f36 = t0.f0 +LEFT JOIN t37 +ON t32.f32 = t37.f37 +LEFT JOIN t38 +ON t31.f31 = t38.f38 +LEFT JOIN t39 +ON t39.f39 = t0.f0 +LEFT JOIN t40 +ON t40.f40 = t39.f39 +LEFT JOIN t41 +ON t41.f41 = t0.f0 +LEFT JOIN t42 +ON t42.f42 = t41.f41 +LEFT JOIN t43 +ON t43.f43 = t41.f41 +LEFT JOIN t44 +ON t44.f44 = t0.f0 +LEFT JOIN t45 +ON t45.f45 = t0.f0 +LEFT JOIN t46 +ON t46.f46 = t0.f0 +LEFT JOIN t47 +ON t47.f47 = t0.f0 +LEFT JOIN t48 +ON t48.f48 = t0.f0 +LEFT JOIN t49 +ON t0.f0 = t49.f49 +LEFT JOIN t50 +ON t0.f0 = t50.f50 +LEFT JOIN t51 +ON t0.f0 = t51.f51 +LEFT JOIN t52 +ON t52.f52 = t0.f0 +LEFT JOIN t53 +ON t53.f53 = t0.f0 +LEFT JOIN t54 +ON t54.f54 = t0.f0 +LEFT JOIN t55 +ON t55.f55 = t0.f0 +LEFT JOIN t56 +ON t56.f56 = t0.f0 +LEFT JOIN t57 +ON t57.f57 = t0.f0 +LEFT JOIN t58 +ON t58.f58 = t57.f57 +LEFT JOIN t59 +ON t36.f36 = t59.f59 +LEFT JOIN v60 +ON t36.f36 = v60.f60 +; +id select_type table type possible_keys key key_len ref rows Extra +1 PRIMARY NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables +2 SUBQUERY NULL NULL NULL NULL NULL NULL NULL no matching row in const table +drop table t0, t1, t2, t3, t4, t5, t6, t7, t8, t9, +t10, t11, t12, t13, t14, t15, t16, t17, t18, +t19, t20, t21, t22, t23, t24, t25, t26, t27, +t28, t29, t30, t31, t32, t33, t34, t35, t36, +t37, t38, t39, t40, t41, t42, t43, t44, t45, +t46, t47, t48, t49, t50, t51, t52, t53, t54, +t55, t56, t57, t58, t59,t60; +drop view v60; # ----------------------------------------------------------------- # -- End of 5.5 tests. # ----------------------------------------------------------------- diff --git a/mysql-test/std_data/binlog-header.log b/mysql-test/std_data/binlog-header.log deleted file mode 100644 index c415a57e61612b723f773414898f9dcf0871f98e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 120 zcmeyDl$p1y@<1p*69WT72@qERF(U&DgQ=dGo{@=eN@`MRx^7N>I#8GZ02w1}!OOtG kAjH4|1VRi9F$^qH96)Ux92_9?xwyC_B^ekN=c)b#0H!YxNdN!< diff --git a/mysql-test/suite.pm b/mysql-test/suite.pm index 4d921d1b0..5ac3bd3e1 100644 --- a/mysql-test/suite.pm +++ b/mysql-test/suite.pm @@ -20,6 +20,9 @@ sub skip_combinations { my %skip = ( 'include/have_innodb.combinations' => [ @combinations ], 'include/have_xtradb.combinations' => [ @combinations ]); + $skip{'include/innodb_encrypt_log.combinations'} = [ 'crypt' ] + unless $ENV{DEBUG_KEY_MANAGEMENT_SO}; + # don't run tests for the wrong platform $skip{'include/platform.combinations'} = [ (IS_WINDOWS) ? 'unix' : 'win' ]; @@ -33,6 +36,9 @@ sub skip_combinations { die "unknown value max-binlog-stmt-cache-size=$longsysvar" unless $val_map{$longsysvar}; $skip{'include/word_size.combinations'} = [ $val_map{$longsysvar} ]; + $skip{'include/maybe_debug.combinations'} = + [ defined $::mysqld_variables{'debug-dbug'} ? 'release' : 'debug' ]; + # as a special case, disable certain include files as a whole $skip{'include/not_embedded.inc'} = 'Not run for embedded server' if $::opt_embedded_server; diff --git a/mysql-test/suite/encryption/r/innodb-bad-key-change.result b/mysql-test/suite/encryption/r/innodb-bad-key-change.result index 4e4fd89d1..51fc7a8cb 100644 --- a/mysql-test/suite/encryption/r/innodb-bad-key-change.result +++ b/mysql-test/suite/encryption/r/innodb-bad-key-change.result @@ -1,7 +1,7 @@ -call mtr.add_suppression("InnoDB: The page .*"); -call mtr.add_suppression("InnoDB: Cannot calculate statistics for table .* "); -call mtr.add_suppression("Plugin 'file_key_management' .*"); -call mtr.add_suppression("mysqld: File .*"); +call mtr.add_suppression("Plugin 'file_key_management' init function returned error"); +call mtr.add_suppression("Plugin 'file_key_management' registration.*failed"); +call mtr.add_suppression("InnoDB: The page \\[page id: space=[1-9][0-9]*, page number=[0-9]+\\] in file '.*test.t[12]\\.ibd' cannot be decrypted\\."); +call mtr.add_suppression("mysqld: File .*keysbad3.txt' not found "); # Start server with keys2.txt SET GLOBAL innodb_file_format = `Barracuda`; @@ -28,14 +28,7 @@ foobar 2 # Restart server with keysbad3.txt SELECT * FROM t1; ERROR HY000: Got error 192 'Table encrypted but decryption failed. This could be because correct encryption management plugin is not loaded, used encryption key is not available or encryption method does not match.' from InnoDB -SHOW WARNINGS; -Level Code Message -Warning 192 Table test/t1 in tablespace is encrypted but encryption service or used key_id is not available. Can't continue reading table. -Warning 192 Table "test"."t1" in file ./test/t1.ibd is encrypted but encryption service or used key_id is not available. Can't continue reading table. -Error 1296 Got error 192 'Table encrypted but decryption failed. This could be because correct encryption management plugin is not loaded, used encryption key is not available or encryption method does not match.' from InnoDB DROP TABLE t1; -SHOW WARNINGS; -Level Code Message # Start server with keys3.txt SET GLOBAL innodb_default_encryption_key_id=5; CREATE TABLE t2 (c VARCHAR(8), id int not null primary key, b int, key(b)) ENGINE=InnoDB ENCRYPTED=YES; @@ -44,73 +37,32 @@ INSERT INTO t2 VALUES ('foobar',1,2); # Restart server with keys2.txt SELECT * FROM t2; ERROR HY000: Got error 192 'Table encrypted but decryption failed. This could be because correct encryption management plugin is not loaded, used encryption key is not available or encryption method does not match.' from InnoDB -SHOW WARNINGS; -Level Code Message -Warning 192 Table test/t2 in tablespace is encrypted but encryption service or used key_id is not available. Can't continue reading table. -Warning 192 Table "test"."t2" in file ./test/t2.ibd is encrypted but encryption service or used key_id is not available. Can't continue reading table. -Error 1296 Got error 192 'Table encrypted but decryption failed. This could be because correct encryption management plugin is not loaded, used encryption key is not available or encryption method does not match.' from InnoDB SELECT * FROM t2 where id = 1; ERROR HY000: Got error 192 'Table encrypted but decryption failed. This could be because correct encryption management plugin is not loaded, used encryption key is not available or encryption method does not match.' from InnoDB -SHOW WARNINGS; -Level Code Message -Warning 192 Table "test"."t2" in file ./test/t2.ibd is encrypted but encryption service or used key_id is not available. Can't continue reading table. -Error 1296 Got error 192 'Table encrypted but decryption failed. This could be because correct encryption management plugin is not loaded, used encryption key is not available or encryption method does not match.' from InnoDB SELECT * FROM t2 where b = 1; ERROR HY000: Got error 192 'Table encrypted but decryption failed. This could be because correct encryption management plugin is not loaded, used encryption key is not available or encryption method does not match.' from InnoDB -SHOW WARNINGS; -Level Code Message -Warning 192 Table "test"."t2" in file ./test/t2.ibd is encrypted but encryption service or used key_id is not available. Can't continue reading table. -Error 1296 Got error 192 'Table encrypted but decryption failed. This could be because correct encryption management plugin is not loaded, used encryption key is not available or encryption method does not match.' from InnoDB INSERT INTO t2 VALUES ('tmp',3,3); ERROR HY000: Got error 192 'Table encrypted but decryption failed. This could be because correct encryption management plugin is not loaded, used encryption key is not available or encryption method does not match.' from InnoDB -SHOW WARNINGS; -Level Code Message -Warning 192 Table "test"."t2" in file ./test/t2.ibd is encrypted but encryption service or used key_id is not available. Can't continue reading table. -Error 1296 Got error 192 'Table encrypted but decryption failed. This could be because correct encryption management plugin is not loaded, used encryption key is not available or encryption method does not match.' from InnoDB DELETE FROM t2 where b = 3; ERROR HY000: Got error 192 'Table encrypted but decryption failed. This could be because correct encryption management plugin is not loaded, used encryption key is not available or encryption method does not match.' from InnoDB -SHOW WARNINGS; -Level Code Message -Warning 192 Table "test"."t2" in file ./test/t2.ibd is encrypted but encryption service or used key_id is not available. Can't continue reading table. -Error 1296 Got error 192 'Table encrypted but decryption failed. This could be because correct encryption management plugin is not loaded, used encryption key is not available or encryption method does not match.' from InnoDB DELETE FROM t2 where id = 3; ERROR HY000: Got error 192 'Table encrypted but decryption failed. This could be because correct encryption management plugin is not loaded, used encryption key is not available or encryption method does not match.' from InnoDB -SHOW WARNINGS; -Level Code Message -Warning 192 Table "test"."t2" in file ./test/t2.ibd is encrypted but encryption service or used key_id is not available. Can't continue reading table. -Error 1296 Got error 192 'Table encrypted but decryption failed. This could be because correct encryption management plugin is not loaded, used encryption key is not available or encryption method does not match.' from InnoDB UPDATE t2 set b = b +1; ERROR HY000: Got error 192 'Table encrypted but decryption failed. This could be because correct encryption management plugin is not loaded, used encryption key is not available or encryption method does not match.' from InnoDB -SHOW WARNINGS; -Level Code Message -Warning 192 Table "test"."t2" in file ./test/t2.ibd is encrypted but encryption service or used key_id is not available. Can't continue reading table. -Error 1296 Got error 192 'Table encrypted but decryption failed. This could be because correct encryption management plugin is not loaded, used encryption key is not available or encryption method does not match.' from InnoDB OPTIMIZE TABLE t2; Table Op Msg_type Msg_text test.t2 optimize Warning Table "test"."t2" in file ./test/t2.ibd is encrypted but encryption service or used key_id is not available. Can't continue reading table. test.t2 optimize Error Got error 192 'Table encrypted but decryption failed. This could be because correct encryption management plugin is not loaded, used encryption key is not available or encryption method does not match.' from InnoDB test.t2 optimize error Corrupt -SHOW WARNINGS; -Level Code Message ALTER TABLE t2 ADD COLUMN d INT; ERROR HY000: Got error 192 'Table encrypted but decryption failed. This could be because correct encryption management plugin is not loaded, used encryption key is not available or encryption method does not match.' from InnoDB -SHOW WARNINGS; -Level Code Message -Warning 192 Table "test"."t2" in file ./test/t2.ibd is encrypted but encryption service or used key_id is not available. Can't continue reading table. -Error 1296 Got error 192 'Table encrypted but decryption failed. This could be because correct encryption management plugin is not loaded, used encryption key is not available or encryption method does not match.' from InnoDB ANALYZE TABLE t2; Table Op Msg_type Msg_text test.t2 analyze Warning Table "test"."t2" in file ./test/t2.ibd is encrypted but encryption service or used key_id is not available. Can't continue reading table. test.t2 analyze Error Got error 192 'Table encrypted but decryption failed. This could be because correct encryption management plugin is not loaded, used encryption key is not available or encryption method does not match.' from InnoDB test.t2 analyze error Corrupt -SHOW WARNINGS; -Level Code Message TRUNCATE TABLE t2; ERROR HY000: Got error 192 'Table encrypted but decryption failed. This could be because correct encryption management plugin is not loaded, used encryption key is not available or encryption method does not match.' from InnoDB -SHOW WARNINGS; -Level Code Message -Warning 192 Table "test"."t2" in file ./test/t2.ibd is encrypted but encryption service or used key_id is not available. Can't continue reading table. -Error 1296 Got error 192 'Table encrypted but decryption failed. This could be because correct encryption management plugin is not loaded, used encryption key is not available or encryption method does not match.' from InnoDB DROP TABLE t2; # Start server with keys2.txt diff --git a/mysql-test/suite/encryption/r/innodb-bad-key-change2.result b/mysql-test/suite/encryption/r/innodb-bad-key-change2.result index 94ed922a0..1ed78a9ef 100644 --- a/mysql-test/suite/encryption/r/innodb-bad-key-change2.result +++ b/mysql-test/suite/encryption/r/innodb-bad-key-change2.result @@ -1,6 +1,5 @@ -call mtr.add_suppression("InnoDB: The page \[page id: space=[0-9]+, page number=[0-9]+\] in file test/t1new cannot be decrypted."); -call mtr.add_suppression("InnoDB: The page \[page id: space=[0-9]+, page number=[0-9]+\] in file test/t1 cannot be decrypted."); -call mtr.add_suppression("Couldn't load plugins from 'file_key_management.*"); +call mtr.add_suppression("InnoDB: The page \\[page id: space=[1-9][0-9]*, page number=[0-9]+\\] in file '.*test.t1(new)?\\.ibd' cannot be decrypted\\."); +call mtr.add_suppression("Couldn't load plugins from 'file_key_management"); call mtr.add_suppression("InnoDB: Table \'\"test\".\"t1\"\' tablespace is set as discarded."); SET GLOBAL innodb_file_format = `Barracuda`; SET GLOBAL innodb_file_per_table = ON; diff --git a/mysql-test/suite/encryption/r/innodb-bad-key-change4.result b/mysql-test/suite/encryption/r/innodb-bad-key-change4.result index 227b8cc3d..a491b0847 100644 --- a/mysql-test/suite/encryption/r/innodb-bad-key-change4.result +++ b/mysql-test/suite/encryption/r/innodb-bad-key-change4.result @@ -1,4 +1,4 @@ -call mtr.add_suppression("InnoDB: The page \[page id: space=[0-9]+, page number=[0-9]+\] in file test/t1 cannot be decrypted."); +call mtr.add_suppression("InnoDB: The page \\[page id: space=[1-9][0-9]*, page number=[0-9]+\\] in file '.*test.t1\\.ibd' cannot be decrypted\\."); call mtr.add_suppression("InnoDB: Cannot open table .*"); call mtr.add_suppression("InnoDB: .ibd file is missing for table test/.*"); call mtr.add_suppression("Couldn't load plugins from 'file_key_management.*"); diff --git a/mysql-test/suite/encryption/r/innodb-compressed-blob.result b/mysql-test/suite/encryption/r/innodb-compressed-blob.result index 15c2a4109..ce73b8082 100644 --- a/mysql-test/suite/encryption/r/innodb-compressed-blob.result +++ b/mysql-test/suite/encryption/r/innodb-compressed-blob.result @@ -1,5 +1,4 @@ -call mtr.add_suppression("InnoDB: However key management plugin or used key_version .*"); -call mtr.add_suppression("InnoDB: The page \\[page id: space=[1-9][0-9]*, page number=[0-9]+\\] in file test/t[1-3] cannot be decrypted."); +call mtr.add_suppression("InnoDB: The page \\[page id: space=[1-9][0-9]*, page number=[0-9]+\\] in file '..test.t[1-3]\\.ibd' cannot be decrypted\\."); call mtr.add_suppression("Unable to decompress space ..test.t[1-3].ibd \\[[1-9][0-9]*:[0-9]+\\]"); # Restart mysqld --file-key-management-filename=keys2.txt SET GLOBAL innodb_file_format = `Barracuda`; diff --git a/mysql-test/suite/encryption/r/innodb-discard-import.result b/mysql-test/suite/encryption/r/innodb-discard-import.result index 06f4abab9..406460d0a 100644 --- a/mysql-test/suite/encryption/r/innodb-discard-import.result +++ b/mysql-test/suite/encryption/r/innodb-discard-import.result @@ -1,5 +1,8 @@ call mtr.add_suppression("InnoDB: Tablespace for table .* is set as discarded."); call mtr.add_suppression("InnoDB: Cannot calculate statistics for table .* because the .ibd file is missing. Please refer to .* for how to resolve the issue."); +SET @innodb_file_format_orig = @@GLOBAL.innodb_file_format; +SET @innodb_file_per_table_orig = @@GLOBAL.innodb_file_per_table; +SET @innodb_compression_algo = @@GLOBAL.innodb_compression_algorithm; SET GLOBAL innodb_file_format = `Barracuda`; SET GLOBAL innodb_file_per_table = ON; SET GLOBAL innodb_compression_algorithm = 1; @@ -134,3 +137,6 @@ NOT FOUND /tmpres/ in t3.ibd NOT FOUND /mysql/ in t4.ibd DROP PROCEDURE innodb_insert_proc; DROP TABLE t1,t2,t3,t4; +SET GLOBAL innodb_file_format = @innodb_file_format_orig; +SET GLOBAL innodb_file_per_table = @innodb_file_per_table_orig; +SET GLOBAL innodb_compression_algorithm = @innodb_compression_algo; diff --git a/mysql-test/suite/encryption/r/innodb-encryption-disable.result b/mysql-test/suite/encryption/r/innodb-encryption-disable.result index dd2b02555..4d15098d9 100644 --- a/mysql-test/suite/encryption/r/innodb-encryption-disable.result +++ b/mysql-test/suite/encryption/r/innodb-encryption-disable.result @@ -1,5 +1,4 @@ -call mtr.add_suppression("InnoDB: The page \[page id: space=[0-9]+, page number=[0-9]+\] in file test/t1 cannot be decrypted."); -call mtr.add_suppression("InnoDB: The page \[page id: space=[0-9]+, page number=[0-9]+\] in file test/t5 cannot be decrypted."); +call mtr.add_suppression("InnoDB: The page \\[page id: space=[1-9][0-9]*, page number=[1-9][0-9]*\\] in file '.*test.t[15]\\.ibd' cannot be decrypted\\."); call mtr.add_suppression("Couldn't load plugins from 'file_key_management*"); create table t5 ( `intcol1` int(32) DEFAULT NULL, diff --git a/mysql-test/suite/encryption/r/innodb-force-corrupt.result b/mysql-test/suite/encryption/r/innodb-force-corrupt.result index 3f3a2afb0..7d63f47d1 100644 --- a/mysql-test/suite/encryption/r/innodb-force-corrupt.result +++ b/mysql-test/suite/encryption/r/innodb-force-corrupt.result @@ -1,9 +1,5 @@ -CALL mtr.add_suppression("InnoDB: Database page corruption on disk or a failed .*"); -CALL mtr.add_suppression("InnoDB: Corruption: Block in space_id .*"); -CALL mtr.add_suppression("InnoDB: However key management plugin or used key_version .*"); -call mtr.add_suppression("InnoDB: The page \[page id: space=[0-9]+, page number=[0-9]+\] in file test/t1 cannot be decrypted."); -call mtr.add_suppression("InnoDB: The page \[page id: space=[0-9]+, page number=[0-9]+\] in file test/t2 cannot be decrypted."); -call mtr.add_suppression("InnoDB: The page \[page id: space=[0-9]+, page number=[0-9]+\] in file test/t3 cannot be decrypted."); +call mtr.add_suppression("InnoDB: The page \\[page id: space=[1-9][0-9]*, page number=[1-9][0-9]*\\] in file '.*test.t[123]\\.ibd' cannot be decrypted\\."); +call mtr.add_suppression("InnoDB: Database page corruption on disk or a failed file read of tablespace test/t[0-9]+ page \[page id: space=[0-9]+, page number=[0-9]+\]. You may have to recover from a backup."); SET GLOBAL innodb_file_format = `Barracuda`; SET GLOBAL innodb_file_per_table = ON; set global innodb_compression_algorithm = 1; diff --git a/mysql-test/suite/encryption/r/innodb-missing-key.result b/mysql-test/suite/encryption/r/innodb-missing-key.result index 2f2cc0259..53ca0845c 100644 --- a/mysql-test/suite/encryption/r/innodb-missing-key.result +++ b/mysql-test/suite/encryption/r/innodb-missing-key.result @@ -1,6 +1,4 @@ -call mtr.add_suppression("InnoDB: The page \[page id: space=[0-9]+, page number=[0-9]+\] in file test/t1 cannot be decrypted."); -call mtr.add_suppression("InnoDB: The page \[page id: space=[0-9]+, page number=[0-9]+\] in file test/t2 cannot be decrypted."); -call mtr.add_suppression("InnoDB: The page \[page id: space=[0-9]+, page number=[0-9]+\] in file test/t3 cannot be decrypted."); +call mtr.add_suppression("InnoDB: The page \\[page id: space=[1-9][0-9]*, page number=[1-9][0-9]*\\] in file '.*test.t[123]\\.ibd' cannot be decrypted\\."); # Start server with keys2.txt CREATE TABLE t1(a int not null primary key auto_increment, b varchar(128)) engine=innodb ENCRYPTED=YES ENCRYPTION_KEY_ID=19; diff --git a/mysql-test/suite/encryption/r/innodb-redo-badkey.result b/mysql-test/suite/encryption/r/innodb-redo-badkey.result index e12dad6d0..ed578d80b 100644 --- a/mysql-test/suite/encryption/r/innodb-redo-badkey.result +++ b/mysql-test/suite/encryption/r/innodb-redo-badkey.result @@ -1,16 +1,13 @@ call mtr.add_suppression("InnoDB: Block in space_id .* in file .* encrypted."); -call mtr.add_suppression("Plugin 'file_key_management' .*"); +call mtr.add_suppression("Plugin 'file_key_management' "); call mtr.add_suppression("Plugin 'InnoDB' init function returned error."); call mtr.add_suppression("Plugin 'InnoDB' registration as a STORAGE ENGINE failed."); -call mtr.add_suppression("InnoDB: Read operation failed for tablespace .*"); -call mtr.add_suppression("InnoDB: Database page corruption on disk or a failed.*"); -call mtr.add_suppression("InnoDB: Recovery read page .*"); -call mtr.add_suppression("InnoDB: The page \[page id: space=[0-9]+, page number=[0-9]+\] in file test/t2 cannot be decrypted."); -call mtr.add_suppression("InnoDB: The page \[page id: space=[0-9]+, page number=[0-9]+\] in file test/t3 cannot be decrypted."); -call mtr.add_suppression("InnoDB: The page \[page id: space=[0-9]+, page number=[0-9]+\] in file test/t4 cannot be decrypted."); -call mtr.add_suppression("InnoDB: The page \[page id: space=[0-9]+, page number=[0-9]+\] in file test/t1 cannot be decrypted."); -call mtr.add_suppression("InnoDB: Missing MLOG_FILE_NAME or MLOG_FILE_DELETE .*"); -call mtr.add_suppression("InnoDB: Plugin initialization aborted .*"); +call mtr.add_suppression("InnoDB: Read operation failed for tablespace "); +call mtr.add_suppression("InnoDB: Database page corruption on disk or a failed"); +call mtr.add_suppression("InnoDB: Recovery read page "); +call mtr.add_suppression("InnoDB: The page \\[page id: space=[1-9][0-9]*, page number=[1-9][0-9]*\\] in file '.*test.t[1234]\\.ibd' cannot be decrypted\\."); +call mtr.add_suppression("InnoDB: Missing MLOG_FILE_NAME or MLOG_FILE_DELETE "); +call mtr.add_suppression("InnoDB: Plugin initialization aborted "); call mtr.add_suppression("InnoDB: ############### CORRUPT LOG RECORD FOUND ##################"); # Restart mysqld --file-key-management-filename=keys2.txt # Wait max 10 min for key encryption threads to encrypt all spaces diff --git a/mysql-test/suite/encryption/r/innodb-redo-nokeys.result b/mysql-test/suite/encryption/r/innodb-redo-nokeys.result index dcbe1f5a3..1ea706dbd 100644 --- a/mysql-test/suite/encryption/r/innodb-redo-nokeys.result +++ b/mysql-test/suite/encryption/r/innodb-redo-nokeys.result @@ -1,13 +1,10 @@ -call mtr.add_suppression("InnoDB: Block in space_id .*"); -call mtr.add_suppression("mysqld: File .*"); -call mtr.add_suppression("Plugin 'file_key_management' .*"); +call mtr.add_suppression("InnoDB: Block in space_id "); +call mtr.add_suppression("mysqld: File "); +call mtr.add_suppression("Plugin 'file_key_management' "); call mtr.add_suppression("InnoDB: cannot enable encryption, encryption plugin is not available"); -call mtr.add_suppression("Plugin 'InnoDB' init function returned error."); +call mtr.add_suppression("Plugin 'InnoDB' init function returned error\\."); call mtr.add_suppression("Plugin 'InnoDB' registration as a STORAGE ENGINE failed."); -call mtr.add_suppression("InnoDB: The page \[page id: space=[0-9]+, page number=[0-9]+\] in file test/t2 cannot be decrypted."); -call mtr.add_suppression("InnoDB: The page \[page id: space=[0-9]+, page number=[0-9]+\] in file test/t3 cannot be decrypted."); -call mtr.add_suppression("InnoDB: The page \[page id: space=[0-9]+, page number=[0-9]+\] in file test/t4 cannot be decrypted."); -call mtr.add_suppression("InnoDB: The page \[page id: space=[0-9]+, page number=[0-9]+\] in file test/t1 cannot be decrypted."); +call mtr.add_suppression("InnoDB: The page \\[page id: space=[1-9][0-9]*, page number=[1-9][0-9]*\\] in file '.*test.t[1234]\\.ibd' cannot be decrypted\\."); # Restart mysqld --file-key-management-filename=keys2.txt SET GLOBAL innodb_file_format = `Barracuda`; SET GLOBAL innodb_file_per_table = ON; diff --git a/mysql-test/suite/encryption/r/innodb-remove-encryption.result b/mysql-test/suite/encryption/r/innodb-remove-encryption.result new file mode 100644 index 000000000..06f1c986a --- /dev/null +++ b/mysql-test/suite/encryption/r/innodb-remove-encryption.result @@ -0,0 +1,41 @@ +set global innodb_file_per_table=OFF; +call mtr.add_suppression("mysqld: file-key-management-filename is not set"); +call mtr.add_suppression("Plugin 'file_key_management' init function returned error."); +call mtr.add_suppression("Plugin 'file_key_management' registration as a ENCRYPTION failed."); +flush tables; +create table t1(a int not null primary key, b char(200)) engine=innodb; + +# Restart server with encryption +# Wait until encryption threads have encrypted all tablespaces +SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION = 0; +NAME +SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION <> 0; +NAME +mysql/innodb_table_stats +mysql/innodb_index_stats +./ibdata1 +# Success! +SELECT * from t1; +a b +# Now turn off encryption and wait for threads to decrypt all tablespaces +SET GLOBAL innodb_encrypt_tables = off; +SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION = 0; +NAME +mysql/innodb_table_stats +mysql/innodb_index_stats +./ibdata1 +SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION <> 0; +NAME +# Success! + +# Restart server with no encryption setup, there should be no crashes +SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION = 0; +NAME +mysql/innodb_table_stats +mysql/innodb_index_stats +./ibdata1 +SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION <> 0; +NAME +SELECT * from t1; +a b +DROP TABLE t1; diff --git a/mysql-test/suite/encryption/r/innodb_encryption-page-compression.result b/mysql-test/suite/encryption/r/innodb_encryption-page-compression.result index ec92825ac..14933e526 100644 --- a/mysql-test/suite/encryption/r/innodb_encryption-page-compression.result +++ b/mysql-test/suite/encryption/r/innodb_encryption-page-compression.result @@ -1,5 +1,4 @@ SET GLOBAL innodb_file_format = `Barracuda`; -SET GLOBAL innodb_file_per_table = ON; SET GLOBAL innodb_encryption_threads = 4; SET GLOBAL innodb_encrypt_tables = on; set global innodb_compression_algorithm = 1; @@ -136,18 +135,19 @@ count(*) select count(*) from innodb_page_compressed9 where c1 < 500000; count(*) 2000 +flush tables innodb_page_compressed1, innodb_page_compressed2, +innodb_page_compressed3, innodb_page_compressed4, +innodb_page_compressed5, innodb_page_compressed6, +innodb_page_compressed7, innodb_page_compressed8, +innodb_page_compressed9 for export; +unlock tables; +# Wait until dirty pages are compressed and encrypted SELECT variable_value > 0 FROM information_schema.global_status WHERE variable_name = 'innodb_num_pages_encrypted'; variable_value > 0 1 -SELECT variable_value >= 0 FROM information_schema.global_status WHERE variable_name = 'innodb_num_pages_decrypted'; -variable_value >= 0 -1 SELECT variable_value > 0 FROM information_schema.global_status WHERE variable_name = 'innodb_num_pages_page_compressed'; variable_value > 0 1 -SELECT variable_value >= 0 FROM information_schema.global_status WHERE variable_name = 'innodb_num_pages_page_decompressed'; -variable_value >= 0 -1 SET GLOBAL innodb_encryption_threads = 4; SET GLOBAL innodb_encrypt_tables = off; update innodb_page_compressed1 set c1 = c1 + 1; @@ -159,17 +159,22 @@ update innodb_page_compressed6 set c1 = c1 + 1; update innodb_page_compressed7 set c1 = c1 + 1; update innodb_page_compressed8 set c1 = c1 + 1; update innodb_page_compressed9 set c1 = c1 + 1; -SELECT variable_value >= 0 FROM information_schema.global_status WHERE variable_name = 'innodb_num_pages_encrypted'; -variable_value >= 0 -1 +flush tables innodb_page_compressed1, innodb_page_compressed2, +innodb_page_compressed3, innodb_page_compressed4, +innodb_page_compressed5, innodb_page_compressed6, +innodb_page_compressed7, innodb_page_compressed8, +innodb_page_compressed9 for export; +unlock tables; +# Wait until dirty pages are compressed and encrypted 2 +unlock tables; SELECT variable_value > 0 FROM information_schema.global_status WHERE variable_name = 'innodb_num_pages_decrypted'; variable_value > 0 1 SELECT variable_value > 0 FROM information_schema.global_status WHERE variable_name = 'innodb_num_pages_page_compressed'; variable_value > 0 1 -SELECT variable_value >= 0 FROM information_schema.global_status WHERE variable_name = 'innodb_num_pages_page_decompressed'; -variable_value >= 0 +SELECT variable_value > 0 FROM information_schema.global_status WHERE variable_name = 'innodb_num_pages_page_decompressed'; +variable_value > 0 1 drop procedure innodb_insert_proc; drop table innodb_normal; diff --git a/mysql-test/suite/encryption/r/innodb_encryption_discard_import.result b/mysql-test/suite/encryption/r/innodb_encryption_discard_import.result index d08a6e943..a2a4f25b0 100644 --- a/mysql-test/suite/encryption/r/innodb_encryption_discard_import.result +++ b/mysql-test/suite/encryption/r/innodb_encryption_discard_import.result @@ -73,6 +73,8 @@ NOT FOUND /foobar/ in t1.ibd NOT FOUND /temp/ in t2.ibd # t3 ... on expecting NOT FOUND NOT FOUND /barfoo/ in t3.ibd +SET GLOBAL innodb_file_format = `Barracuda`; +SET GLOBAL innodb_file_per_table = ON; ALTER TABLE t1 ENGINE InnoDB; SHOW CREATE TABLE t1; Table Create Table diff --git a/mysql-test/suite/encryption/r/innodb_encryption_filekeys.result b/mysql-test/suite/encryption/r/innodb_encryption_filekeys.result index ab958004e..1c8341137 100644 --- a/mysql-test/suite/encryption/r/innodb_encryption_filekeys.result +++ b/mysql-test/suite/encryption/r/innodb_encryption_filekeys.result @@ -1,6 +1,4 @@ -call mtr.add_suppression("trying to do an operation on a dropped tablespace .*"); SET GLOBAL innodb_file_format = `Barracuda`; -SET GLOBAL innodb_file_per_table = ON; SET GLOBAL innodb_encrypt_tables = OFF; SET GLOBAL innodb_encryption_threads = 4; CREATE TABLE t1 (pk INT PRIMARY KEY AUTO_INCREMENT, c VARCHAR(256)) ENGINE=INNODB; @@ -14,24 +12,21 @@ t1 CREATE TABLE `t1` ( CREATE TABLE t2 (pk INT PRIMARY KEY AUTO_INCREMENT, c VARCHAR(256)) ENGINE=INNODB ENCRYPTED=YES; CREATE TABLE t3 (pk INT PRIMARY KEY AUTO_INCREMENT, c VARCHAR(256)) ENGINE=INNODB ENCRYPTED=NO; CREATE TABLE t4 (pk INT PRIMARY KEY AUTO_INCREMENT, c VARCHAR(256)) ENGINE=INNODB ENCRYPTED=YES ENCRYPTION_KEY_ID=4; -INSERT INTO t2 select * from t1; -INSERT INTO t3 select * from t1; -INSERT INTO t4 select * from t1; SET GLOBAL innodb_encrypt_tables = on; # Wait max 10 min for key encryption threads to encrypt required all spaces # Success! SELECT COUNT(1) FROM t1; COUNT(1) -400 +10 SELECT COUNT(1) FROM t2; COUNT(1) -400 +10 SELECT COUNT(1) FROM t3; COUNT(1) -400 +10 SELECT COUNT(1) FROM t4; COUNT(1) -400 +10 SET GLOBAL innodb_encrypt_tables = off; # Wait max 10 min for key encryption threads to decrypt all required spaces # Success! @@ -50,18 +45,17 @@ INSERT INTO t5 select * from t1; # Success! SELECT COUNT(1) FROM t1; COUNT(1) -400 +10 SELECT COUNT(1) FROM t2; COUNT(1) -400 +10 SELECT COUNT(1) FROM t3; COUNT(1) -400 +10 SELECT COUNT(1) FROM t4; COUNT(1) -400 +10 SELECT COUNT(1) FROM t5; COUNT(1) -400 +10 drop table t1,t2,t3,t4, t5; -set GLOBAL innodb_default_encryption_key_id=1; diff --git a/mysql-test/suite/encryption/r/tempfiles.result b/mysql-test/suite/encryption/r/tempfiles.result index a0b7596dd..658b7dc29 100644 --- a/mysql-test/suite/encryption/r/tempfiles.result +++ b/mysql-test/suite/encryption/r/tempfiles.result @@ -1,3 +1,6 @@ +select @@encrypt_tmp_files; +@@encrypt_tmp_files +1 CREATE TABLE t1(a INT); INSERT INTO t1 VALUES(1),(2); DELETE FROM t1 WHERE a=1; @@ -25,6 +28,7 @@ h 10 i 10 j 10 drop table t1; +reset master; set global binlog_cache_size=8192; create table t1 (a text) engine=innodb; start transaction; @@ -33,14 +37,67 @@ commit; start transaction; insert t1 select repeat(seq, 1000) from seq_1_to_8; commit; -drop table t1; -create table t1 (a text) engine=innodb; +create table t2 (a text) engine=innodb; start transaction; -insert t1 select repeat(seq, 1000) from seq_1_to_15; +insert t2 select repeat(seq, 1000) from seq_1_to_15; savepoint foo; -insert t1 select repeat(seq, 1000) from seq_16_to_30; +insert t2 select repeat(seq, 1000) from seq_16_to_30; rollback to savepoint foo; -insert t1 select repeat(seq, 1000) from seq_31_to_40; +insert t2 select repeat(seq, 1000) from seq_31_to_40; commit; -drop table t1; +flush binary logs; +drop table t1, t2; set global binlog_cache_size=default; +select left(a, 10) from t1; +left(a, 10) +1111111111 +2222222222 +3333333333 +4444444444 +5555555555 +6666666666 +7777777777 +8888888888 +9999999999 +1010101010 +1111111111 +1212121212 +1313131313 +1414141414 +1515151515 +1111111111 +2222222222 +3333333333 +4444444444 +5555555555 +6666666666 +7777777777 +8888888888 +select left(a, 10) from t2; +left(a, 10) +1111111111 +2222222222 +3333333333 +4444444444 +5555555555 +6666666666 +7777777777 +8888888888 +9999999999 +1010101010 +1111111111 +1212121212 +1313131313 +1414141414 +1515151515 +3131313131 +3232323232 +3333333333 +3434343434 +3535353535 +3636363636 +3737373737 +3838383838 +3939393939 +4040404040 +drop table t1, t2; diff --git a/mysql-test/suite/encryption/t/innodb-bad-key-change.test b/mysql-test/suite/encryption/t/innodb-bad-key-change.test index 66546872c..9d61770f5 100644 --- a/mysql-test/suite/encryption/t/innodb-bad-key-change.test +++ b/mysql-test/suite/encryption/t/innodb-bad-key-change.test @@ -8,10 +8,11 @@ # table exists and encryption service is not available. # -call mtr.add_suppression("InnoDB: The page .*"); -call mtr.add_suppression("InnoDB: Cannot calculate statistics for table .* "); -call mtr.add_suppression("Plugin 'file_key_management' .*"); -call mtr.add_suppression("mysqld: File .*"); +call mtr.add_suppression("Plugin 'file_key_management' init function returned error"); +call mtr.add_suppression("Plugin 'file_key_management' registration.*failed"); +call mtr.add_suppression("InnoDB: The page \\[page id: space=[1-9][0-9]*, page number=[0-9]+\\] in file '.*test.t[12]\\.ibd' cannot be decrypted\\."); +call mtr.add_suppression("mysqld: File .*keysbad3.txt' not found "); + --echo --echo # Start server with keys2.txt @@ -40,18 +41,18 @@ SELECT * FROM t1; -- let $restart_parameters=--file-key-management-filename=$MYSQL_TEST_DIR/std_data/keysbad3.txt -- source include/restart_mysqld.inc +--disable_warnings --error ER_GET_ERRMSG SELECT * FROM t1; ---replace_regex /tablespace [0-9]*/tablespace / /key_id [0-9]*/key_id / -SHOW WARNINGS; +--enable_warnings -- let $restart_parameters=--file-key-management-filename=$MYSQL_TEST_DIR/std_data/keysbad3.txt -- source include/restart_mysqld.inc +--disable_warnings --replace_regex /tablespace [0-9]*/tablespace / DROP TABLE t1; ---replace_regex /tablespace [0-9]*/tablespace / /key_id [0-9]*/key_id / -SHOW WARNINGS; +--enable_warnings # # MDEV-8591: Database page corruption on disk or a failed space, Assertion failure in file buf0buf.cc @@ -71,51 +72,41 @@ INSERT INTO t2 VALUES ('foobar',1,2); -- let $restart_parameters=--file-key-management-filename=$MYSQL_TEST_DIR/std_data/keys2.txt -- source include/restart_mysqld.inc +--disable_warnings --error ER_GET_ERRMSG SELECT * FROM t2; ---replace_regex /tablespace [0-9]*/tablespace / /key_id [0-9]*/key_id / -SHOW WARNINGS; + --error ER_GET_ERRMSG SELECT * FROM t2 where id = 1; ---replace_regex /tablespace [0-9]*/tablespace / /key_id [0-9]*/key_id / -SHOW WARNINGS; + --error ER_GET_ERRMSG SELECT * FROM t2 where b = 1; ---replace_regex /tablespace [0-9]*/tablespace / /key_id [0-9]*/key_id / -SHOW WARNINGS; + --replace_regex /tablespace [0-9]*/tablespace / --error ER_GET_ERRMSG INSERT INTO t2 VALUES ('tmp',3,3); ---replace_regex /tablespace [0-9]*/tablespace / /key_id [0-9]*/key_id / -SHOW WARNINGS; + --error ER_GET_ERRMSG DELETE FROM t2 where b = 3; ---replace_regex /tablespace [0-9]*/tablespace / /key_id [0-9]*/key_id / -SHOW WARNINGS; + --error ER_GET_ERRMSG DELETE FROM t2 where id = 3; ---replace_regex /tablespace [0-9]*/tablespace / /key_id [0-9]*/key_id / -SHOW WARNINGS; + --error ER_GET_ERRMSG UPDATE t2 set b = b +1; ---replace_regex /tablespace [0-9]*/tablespace / /key_id [0-9]*/key_id / -SHOW WARNINGS; + OPTIMIZE TABLE t2; ---replace_regex /tablespace [0-9]*/tablespace / /key_id [0-9]*/key_id / -SHOW WARNINGS; + --error ER_GET_ERRMSG ALTER TABLE t2 ADD COLUMN d INT; ---replace_regex /tablespace [0-9]*/tablespace / /key_id [0-9]*/key_id / -SHOW WARNINGS; + ANALYZE TABLE t2; ---replace_regex /tablespace [0-9]*/tablespace / /key_id [0-9]*/key_id / -SHOW WARNINGS; + --error ER_GET_ERRMSG TRUNCATE TABLE t2; ---replace_regex /tablespace [0-9]*/tablespace / /key_id [0-9]*/key_id / -SHOW WARNINGS; DROP TABLE t2; +--enable_warnings --echo --echo # Start server with keys2.txt diff --git a/mysql-test/suite/encryption/t/innodb-bad-key-change2.test b/mysql-test/suite/encryption/t/innodb-bad-key-change2.test index 52ee442c7..0c312f1f4 100644 --- a/mysql-test/suite/encryption/t/innodb-bad-key-change2.test +++ b/mysql-test/suite/encryption/t/innodb-bad-key-change2.test @@ -8,10 +8,9 @@ # MDEV-8768: Server crash at file btr0btr.ic line 122 when checking encrypted table using incorrect keys # MDEV-8727: Server/InnoDB hangs on shutdown after trying to read an encrypted table with a wrong key # -call mtr.add_suppression("InnoDB: The page \[page id: space=[0-9]+, page number=[0-9]+\] in file test/t1new cannot be decrypted."); -call mtr.add_suppression("InnoDB: The page \[page id: space=[0-9]+, page number=[0-9]+\] in file test/t1 cannot be decrypted."); +call mtr.add_suppression("InnoDB: The page \\[page id: space=[1-9][0-9]*, page number=[0-9]+\\] in file '.*test.t1(new)?\\.ibd' cannot be decrypted\\."); # Suppression for builds where file_key_management plugin is linked statically -call mtr.add_suppression("Couldn't load plugins from 'file_key_management.*"); +call mtr.add_suppression("Couldn't load plugins from 'file_key_management"); call mtr.add_suppression("InnoDB: Table \'\"test\".\"t1\"\' tablespace is set as discarded."); --let $restart_parameters=--plugin-load-add=file_key_management.so --file-key-management --file-key-management-filename=$MYSQL_TEST_DIR/std_data/keys2.txt diff --git a/mysql-test/suite/encryption/t/innodb-bad-key-change4.test b/mysql-test/suite/encryption/t/innodb-bad-key-change4.test index 14d88614f..0c52bfe3f 100644 --- a/mysql-test/suite/encryption/t/innodb-bad-key-change4.test +++ b/mysql-test/suite/encryption/t/innodb-bad-key-change4.test @@ -7,7 +7,7 @@ # MDEV-8768: Server crash at file btr0btr.ic line 122 when checking encrypted table using incorrect keys # -call mtr.add_suppression("InnoDB: The page \[page id: space=[0-9]+, page number=[0-9]+\] in file test/t1 cannot be decrypted."); +call mtr.add_suppression("InnoDB: The page \\[page id: space=[1-9][0-9]*, page number=[0-9]+\\] in file '.*test.t1\\.ibd' cannot be decrypted\\."); call mtr.add_suppression("InnoDB: Cannot open table .*"); call mtr.add_suppression("InnoDB: .ibd file is missing for table test/.*"); # Suppression for builds where file_key_management plugin is linked statically diff --git a/mysql-test/suite/encryption/t/innodb-compressed-blob.test b/mysql-test/suite/encryption/t/innodb-compressed-blob.test index cb69f22f7..4a81dae5a 100644 --- a/mysql-test/suite/encryption/t/innodb-compressed-blob.test +++ b/mysql-test/suite/encryption/t/innodb-compressed-blob.test @@ -4,8 +4,7 @@ # embedded does not support restart -- source include/not_embedded.inc -call mtr.add_suppression("InnoDB: However key management plugin or used key_version .*"); -call mtr.add_suppression("InnoDB: The page \\[page id: space=[1-9][0-9]*, page number=[0-9]+\\] in file test/t[1-3] cannot be decrypted."); +call mtr.add_suppression("InnoDB: The page \\[page id: space=[1-9][0-9]*, page number=[0-9]+\\] in file '..test.t[1-3]\\.ibd' cannot be decrypted\\."); call mtr.add_suppression("Unable to decompress space ..test.t[1-3].ibd \\[[1-9][0-9]*:[0-9]+\\]"); --echo # Restart mysqld --file-key-management-filename=keys2.txt diff --git a/mysql-test/suite/encryption/t/innodb-discard-import.test b/mysql-test/suite/encryption/t/innodb-discard-import.test index 9feaacc41..54471ae3b 100644 --- a/mysql-test/suite/encryption/t/innodb-discard-import.test +++ b/mysql-test/suite/encryption/t/innodb-discard-import.test @@ -1,10 +1,6 @@ -- source include/have_innodb.inc +-- source include/innodb_page_size_small.inc -- source include/have_file_key_management_plugin.inc -# embedded does not support restart --- source include/not_embedded.inc --- source include/not_valgrind.inc -# Avoid CrashReporter popup on Mac --- source include/not_crashrep.inc # # MDEV-8770: Incorrect error message when importing page compressed tablespace @@ -13,17 +9,13 @@ call mtr.add_suppression("InnoDB: Tablespace for table .* is set as discarded."); call mtr.add_suppression("InnoDB: Cannot calculate statistics for table .* because the .ibd file is missing. Please refer to .* for how to resolve the issue."); ---disable_query_log -let $innodb_file_format_orig = `SELECT @@innodb_file_format`; -let $innodb_file_per_table_orig = `SELECT @@innodb_file_per_table`; -let $innodb_compression_algo = `SELECT @@innodb_compression_algorithm`; ---enable_query_log +SET @innodb_file_format_orig = @@GLOBAL.innodb_file_format; +SET @innodb_file_per_table_orig = @@GLOBAL.innodb_file_per_table; +SET @innodb_compression_algo = @@GLOBAL.innodb_compression_algorithm; ---disable_warnings SET GLOBAL innodb_file_format = `Barracuda`; SET GLOBAL innodb_file_per_table = ON; SET GLOBAL innodb_compression_algorithm = 1; ---enable_warnings --let $MYSQLD_TMPDIR = `SELECT @@tmpdir` --let $MYSQLD_DATADIR = `SELECT @@datadir` @@ -37,7 +29,9 @@ create table t1(c1 bigint not null, b char(200)) engine=innodb encrypted=yes en show warnings; create table t2(c1 bigint not null, b char(200)) engine=innodb page_compressed=1 encrypted=yes encryption_key_id=4; show warnings; -create table t3(c1 bigint not null, b char(200)) engine=innodb row_format=compressed encrypted=yes encryption_key_id=4; +let $kbs= `select floor(@@global.innodb_page_size/1024)`; +--replace_regex / key_block_size=\d+//i +eval create table t3(c1 bigint not null, b char(200)) engine=innodb row_format=compressed encrypted=yes encryption_key_id=4 key_block_size=$kbs; show warnings; create table t4(c1 bigint not null, b char(200)) engine=innodb page_compressed=1; show warnings; @@ -98,6 +92,7 @@ ALTER TABLE t2 IMPORT TABLESPACE; SHOW CREATE TABLE t2; SELECT COUNT(*) FROM t2; ALTER TABLE t3 IMPORT TABLESPACE; +--replace_regex / key_block_size=\d+//i SHOW CREATE TABLE t3; SELECT COUNT(*) FROM t3; ALTER TABLE t4 IMPORT TABLESPACE; @@ -125,11 +120,6 @@ SELECT COUNT(*) FROM t4; DROP PROCEDURE innodb_insert_proc; DROP TABLE t1,t2,t3,t4; -# reset system ---disable_warnings ---disable_query_log -EVAL SET GLOBAL innodb_file_per_table = $innodb_file_per_table_orig; -EVAL SET GLOBAL innodb_file_format = $innodb_file_format_orig; -EVAL SET GLOBAL innodb_compression_algorithm = $innodb_compression_algo; ---enable_query_log ---enable_warnings +SET GLOBAL innodb_file_format = @innodb_file_format_orig; +SET GLOBAL innodb_file_per_table = @innodb_file_per_table_orig; +SET GLOBAL innodb_compression_algorithm = @innodb_compression_algo; diff --git a/mysql-test/suite/encryption/t/innodb-encryption-disable.test b/mysql-test/suite/encryption/t/innodb-encryption-disable.test index 38f36076c..6ade8d6e3 100644 --- a/mysql-test/suite/encryption/t/innodb-encryption-disable.test +++ b/mysql-test/suite/encryption/t/innodb-encryption-disable.test @@ -7,8 +7,7 @@ # MDEV-9559: Server without encryption configs crashes if selecting from an implicitly encrypted table # -call mtr.add_suppression("InnoDB: The page \[page id: space=[0-9]+, page number=[0-9]+\] in file test/t1 cannot be decrypted."); -call mtr.add_suppression("InnoDB: The page \[page id: space=[0-9]+, page number=[0-9]+\] in file test/t5 cannot be decrypted."); +call mtr.add_suppression("InnoDB: The page \\[page id: space=[1-9][0-9]*, page number=[1-9][0-9]*\\] in file '.*test.t[15]\\.ibd' cannot be decrypted\\."); # Suppression for builds where file_key_management plugin is linked statically call mtr.add_suppression("Couldn't load plugins from 'file_key_management*"); diff --git a/mysql-test/suite/encryption/t/innodb-force-corrupt.test b/mysql-test/suite/encryption/t/innodb-force-corrupt.test index dd4ee51b1..cb6440127 100644 --- a/mysql-test/suite/encryption/t/innodb-force-corrupt.test +++ b/mysql-test/suite/encryption/t/innodb-force-corrupt.test @@ -7,12 +7,8 @@ # Don't test under embedded -- source include/not_embedded.inc -CALL mtr.add_suppression("InnoDB: Database page corruption on disk or a failed .*"); -CALL mtr.add_suppression("InnoDB: Corruption: Block in space_id .*"); -CALL mtr.add_suppression("InnoDB: However key management plugin or used key_version .*"); -call mtr.add_suppression("InnoDB: The page \[page id: space=[0-9]+, page number=[0-9]+\] in file test/t1 cannot be decrypted."); -call mtr.add_suppression("InnoDB: The page \[page id: space=[0-9]+, page number=[0-9]+\] in file test/t2 cannot be decrypted."); -call mtr.add_suppression("InnoDB: The page \[page id: space=[0-9]+, page number=[0-9]+\] in file test/t3 cannot be decrypted."); +call mtr.add_suppression("InnoDB: The page \\[page id: space=[1-9][0-9]*, page number=[1-9][0-9]*\\] in file '.*test.t[123]\\.ibd' cannot be decrypted\\."); +call mtr.add_suppression("InnoDB: Database page corruption on disk or a failed file read of tablespace test/t[0-9]+ page \[page id: space=[0-9]+, page number=[0-9]+\]. You may have to recover from a backup."); --disable_warnings SET GLOBAL innodb_file_format = `Barracuda`; diff --git a/mysql-test/suite/encryption/t/innodb-missing-key.test b/mysql-test/suite/encryption/t/innodb-missing-key.test index 07a2b1621..6ea052882 100644 --- a/mysql-test/suite/encryption/t/innodb-missing-key.test +++ b/mysql-test/suite/encryption/t/innodb-missing-key.test @@ -7,9 +7,7 @@ # MDEV-11004: Unable to start (Segfault or os error 2) when encryption key missing # -call mtr.add_suppression("InnoDB: The page \[page id: space=[0-9]+, page number=[0-9]+\] in file test/t1 cannot be decrypted."); -call mtr.add_suppression("InnoDB: The page \[page id: space=[0-9]+, page number=[0-9]+\] in file test/t2 cannot be decrypted."); -call mtr.add_suppression("InnoDB: The page \[page id: space=[0-9]+, page number=[0-9]+\] in file test/t3 cannot be decrypted."); +call mtr.add_suppression("InnoDB: The page \\[page id: space=[1-9][0-9]*, page number=[1-9][0-9]*\\] in file '.*test.t[123]\\.ibd' cannot be decrypted\\."); --echo --echo # Start server with keys2.txt diff --git a/mysql-test/suite/encryption/t/innodb-redo-badkey.test b/mysql-test/suite/encryption/t/innodb-redo-badkey.test index 159646541..69de4f0f9 100644 --- a/mysql-test/suite/encryption/t/innodb-redo-badkey.test +++ b/mysql-test/suite/encryption/t/innodb-redo-badkey.test @@ -4,18 +4,15 @@ -- source include/not_embedded.inc call mtr.add_suppression("InnoDB: Block in space_id .* in file .* encrypted."); -call mtr.add_suppression("Plugin 'file_key_management' .*"); +call mtr.add_suppression("Plugin 'file_key_management' "); call mtr.add_suppression("Plugin 'InnoDB' init function returned error."); call mtr.add_suppression("Plugin 'InnoDB' registration as a STORAGE ENGINE failed."); -call mtr.add_suppression("InnoDB: Read operation failed for tablespace .*"); -call mtr.add_suppression("InnoDB: Database page corruption on disk or a failed.*"); -call mtr.add_suppression("InnoDB: Recovery read page .*"); -call mtr.add_suppression("InnoDB: The page \[page id: space=[0-9]+, page number=[0-9]+\] in file test/t2 cannot be decrypted."); -call mtr.add_suppression("InnoDB: The page \[page id: space=[0-9]+, page number=[0-9]+\] in file test/t3 cannot be decrypted."); -call mtr.add_suppression("InnoDB: The page \[page id: space=[0-9]+, page number=[0-9]+\] in file test/t4 cannot be decrypted."); -call mtr.add_suppression("InnoDB: The page \[page id: space=[0-9]+, page number=[0-9]+\] in file test/t1 cannot be decrypted."); -call mtr.add_suppression("InnoDB: Missing MLOG_FILE_NAME or MLOG_FILE_DELETE .*"); -call mtr.add_suppression("InnoDB: Plugin initialization aborted .*"); +call mtr.add_suppression("InnoDB: Read operation failed for tablespace "); +call mtr.add_suppression("InnoDB: Database page corruption on disk or a failed"); +call mtr.add_suppression("InnoDB: Recovery read page "); +call mtr.add_suppression("InnoDB: The page \\[page id: space=[1-9][0-9]*, page number=[1-9][0-9]*\\] in file '.*test.t[1234]\\.ibd' cannot be decrypted\\."); +call mtr.add_suppression("InnoDB: Missing MLOG_FILE_NAME or MLOG_FILE_DELETE "); +call mtr.add_suppression("InnoDB: Plugin initialization aborted "); call mtr.add_suppression("InnoDB: ############### CORRUPT LOG RECORD FOUND ##################"); --echo # Restart mysqld --file-key-management-filename=keys2.txt diff --git a/mysql-test/suite/encryption/t/innodb-redo-nokeys.test b/mysql-test/suite/encryption/t/innodb-redo-nokeys.test index e55e2ade1..68d831fcd 100644 --- a/mysql-test/suite/encryption/t/innodb-redo-nokeys.test +++ b/mysql-test/suite/encryption/t/innodb-redo-nokeys.test @@ -3,16 +3,13 @@ # embedded does not support restart -- source include/not_embedded.inc -call mtr.add_suppression("InnoDB: Block in space_id .*"); -call mtr.add_suppression("mysqld: File .*"); -call mtr.add_suppression("Plugin 'file_key_management' .*"); +call mtr.add_suppression("InnoDB: Block in space_id "); +call mtr.add_suppression("mysqld: File "); +call mtr.add_suppression("Plugin 'file_key_management' "); call mtr.add_suppression("InnoDB: cannot enable encryption, encryption plugin is not available"); -call mtr.add_suppression("Plugin 'InnoDB' init function returned error."); +call mtr.add_suppression("Plugin 'InnoDB' init function returned error\\."); call mtr.add_suppression("Plugin 'InnoDB' registration as a STORAGE ENGINE failed."); -call mtr.add_suppression("InnoDB: The page \[page id: space=[0-9]+, page number=[0-9]+\] in file test/t2 cannot be decrypted."); -call mtr.add_suppression("InnoDB: The page \[page id: space=[0-9]+, page number=[0-9]+\] in file test/t3 cannot be decrypted."); -call mtr.add_suppression("InnoDB: The page \[page id: space=[0-9]+, page number=[0-9]+\] in file test/t4 cannot be decrypted."); -call mtr.add_suppression("InnoDB: The page \[page id: space=[0-9]+, page number=[0-9]+\] in file test/t1 cannot be decrypted."); +call mtr.add_suppression("InnoDB: The page \\[page id: space=[1-9][0-9]*, page number=[1-9][0-9]*\\] in file '.*test.t[1234]\\.ibd' cannot be decrypted\\."); --echo # Restart mysqld --file-key-management-filename=keys2.txt -- let $restart_parameters=--file-key-management-filename=$MYSQL_TEST_DIR/std_data/keys2.txt diff --git a/mysql-test/suite/encryption/t/innodb-remove-encryption.test b/mysql-test/suite/encryption/t/innodb-remove-encryption.test new file mode 100644 index 000000000..24e00a00a --- /dev/null +++ b/mysql-test/suite/encryption/t/innodb-remove-encryption.test @@ -0,0 +1,59 @@ +--source include/have_innodb.inc +# Test uses restart +--source include/not_embedded.inc +--source filekeys_plugin.inc + +# +# MDEV-15566: System tablespace does not easily key rotate to unencrypted +# + +set global innodb_file_per_table=OFF; + +call mtr.add_suppression("mysqld: file-key-management-filename is not set"); +call mtr.add_suppression("Plugin 'file_key_management' init function returned error."); +call mtr.add_suppression("Plugin 'file_key_management' registration as a ENCRYPTION failed."); +flush tables; + +create table t1(a int not null primary key, b char(200)) engine=innodb; + +--echo +--echo # Restart server with encryption +-- let $restart_parameters=--plugin-load-add=$FILE_KEY_MANAGEMENT_SO --loose-file-key-management --loose-file-key-management-filename=$MYSQL_TEST_DIR/std_data/keys.txt --file-key-management-encryption-algorithm=aes_cbc --innodb-encrypt-tables=ON --innodb-encryption-threads=4 --innodb-tablespaces-encryption --innodb-encryption-rotate-key-age=15 +-- source include/restart_mysqld.inc + +--echo # Wait until encryption threads have encrypted all tablespaces + +--let $tables_count= `select count(*) from information_schema.tables where engine = 'InnoDB'` +--let $wait_timeout= 600 +--let $wait_condition=SELECT COUNT(*) = $tables_count FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION <> 0 AND ROTATING_OR_FLUSHING = 0; +--source include/wait_condition.inc + +SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION = 0; +SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION <> 0; + +--echo # Success! + +SELECT * from t1; + +--echo # Now turn off encryption and wait for threads to decrypt all tablespaces +SET GLOBAL innodb_encrypt_tables = off; + +--let $wait_condition=SELECT COUNT(*) = $tables_count FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION = 0 AND ROTATING_OR_FLUSHING = 0; +--source include/wait_condition.inc + +SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION = 0; +SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION <> 0; + +--echo # Success! + +--echo +--echo # Restart server with no encryption setup, there should be no crashes +--let $restart_parameters=--skip-file-key-management --innodb-encrypt-tables=OFF --innodb-encryption-threads=0 --innodb-tablespaces-encryption +-- source include/restart_mysqld.inc + +SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION = 0; +SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION <> 0; + +SELECT * from t1; +DROP TABLE t1; + diff --git a/mysql-test/suite/encryption/t/innodb_encryption-page-compression.test b/mysql-test/suite/encryption/t/innodb_encryption-page-compression.test index ea6bd65d6..fe132c0c5 100644 --- a/mysql-test/suite/encryption/t/innodb_encryption-page-compression.test +++ b/mysql-test/suite/encryption/t/innodb_encryption-page-compression.test @@ -1,17 +1,14 @@ -- source include/have_innodb.inc -- source include/have_example_key_management_plugin.inc +-- source include/not_embedded.inc --disable_query_log -let $innodb_compression_algorithm_orig=`SELECT @@innodb_compression_algorithm`; -let $innodb_file_format_orig = `SELECT @@innodb_file_format`; -let $innodb_file_per_table_orig = `SELECT @@innodb_file_per_table`; let $innodb_encrypt_tables_orig = `SELECT @@innodb_encrypt_tables`; let $innodb_encryption_threads_orig = `SELECT @@innodb_encryption_threads`; --enable_query_log --disable_warnings SET GLOBAL innodb_file_format = `Barracuda`; -SET GLOBAL innodb_file_per_table = ON; SET GLOBAL innodb_encryption_threads = 4; SET GLOBAL innodb_encrypt_tables = on; --enable_warnings @@ -84,13 +81,24 @@ select count(*) from innodb_page_compressed7 where c1 < 500000; select count(*) from innodb_page_compressed8 where c1 < 500000; select count(*) from innodb_page_compressed9 where c1 < 500000; +flush tables innodb_page_compressed1, innodb_page_compressed2, +innodb_page_compressed3, innodb_page_compressed4, +innodb_page_compressed5, innodb_page_compressed6, +innodb_page_compressed7, innodb_page_compressed8, +innodb_page_compressed9 for export; + +unlock tables; + +--echo # Wait until dirty pages are compressed and encrypted let $wait_condition= select variable_value > 0 from information_schema.global_status where variable_name = 'INNODB_NUM_PAGES_PAGE_COMPRESSED'; --source include/wait_condition.inc +let $wait_condition= select variable_value > 0 from information_schema.global_status where variable_name = 'INNODB_NUM_PAGES_ENCRYPTED'; +--source include/wait_condition.inc SELECT variable_value > 0 FROM information_schema.global_status WHERE variable_name = 'innodb_num_pages_encrypted'; -SELECT variable_value >= 0 FROM information_schema.global_status WHERE variable_name = 'innodb_num_pages_decrypted'; SELECT variable_value > 0 FROM information_schema.global_status WHERE variable_name = 'innodb_num_pages_page_compressed'; -SELECT variable_value >= 0 FROM information_schema.global_status WHERE variable_name = 'innodb_num_pages_page_decompressed'; + +--source include/restart_mysqld.inc SET GLOBAL innodb_encryption_threads = 4; SET GLOBAL innodb_encrypt_tables = off; @@ -105,13 +113,23 @@ update innodb_page_compressed7 set c1 = c1 + 1; update innodb_page_compressed8 set c1 = c1 + 1; update innodb_page_compressed9 set c1 = c1 + 1; +flush tables innodb_page_compressed1, innodb_page_compressed2, +innodb_page_compressed3, innodb_page_compressed4, +innodb_page_compressed5, innodb_page_compressed6, +innodb_page_compressed7, innodb_page_compressed8, +innodb_page_compressed9 for export; +unlock tables; + +--echo # Wait until dirty pages are compressed and encrypted 2 +let $wait_condition= select variable_value > 0 from information_schema.global_status where variable_name = 'INNODB_NUM_PAGES_PAGE_COMPRESSED'; +--source include/wait_condition.inc +unlock tables; let $wait_condition= select variable_value > 0 from information_schema.global_status where variable_name = 'INNODB_NUM_PAGES_DECRYPTED'; --source include/wait_condition.inc -SELECT variable_value >= 0 FROM information_schema.global_status WHERE variable_name = 'innodb_num_pages_encrypted'; SELECT variable_value > 0 FROM information_schema.global_status WHERE variable_name = 'innodb_num_pages_decrypted'; SELECT variable_value > 0 FROM information_schema.global_status WHERE variable_name = 'innodb_num_pages_page_compressed'; -SELECT variable_value >= 0 FROM information_schema.global_status WHERE variable_name = 'innodb_num_pages_page_decompressed'; +SELECT variable_value > 0 FROM information_schema.global_status WHERE variable_name = 'innodb_num_pages_page_decompressed'; drop procedure innodb_insert_proc; drop table innodb_normal; @@ -127,9 +145,6 @@ drop table innodb_page_compressed9; # reset system --disable_query_log -EVAL SET GLOBAL innodb_compression_algorithm = $innodb_compression_algorithm_orig; -EVAL SET GLOBAL innodb_file_per_table = $innodb_file_per_table_orig; -EVAL SET GLOBAL innodb_file_format = $innodb_file_format_orig; EVAL SET GLOBAL innodb_encrypt_tables = $innodb_encrypt_tables_orig; EVAL SET GLOBAL innodb_encryption_threads = $innodb_encryption_threads_orig; --enable_query_log diff --git a/mysql-test/suite/encryption/t/innodb_encryption_discard_import.test b/mysql-test/suite/encryption/t/innodb_encryption_discard_import.test index 192233a53..29c762a5d 100644 --- a/mysql-test/suite/encryption/t/innodb_encryption_discard_import.test +++ b/mysql-test/suite/encryption/t/innodb_encryption_discard_import.test @@ -50,10 +50,12 @@ set autocommit=1; --echo # Wait max 10 min for key encryption threads to encrypt all spaces --let $wait_timeout= 600 ---let $wait_condition=SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION = 0 +--let $wait_condition=SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION = 0 AND ROTATING_OR_FLUSHING <> 0 --source include/wait_condition.inc ---sleep 5 +# shutdown so that grep is safe +--source include/shutdown_mysqld.inc + --echo # tablespaces should be now encrypted --let SEARCH_PATTERN=foobar --echo # t1 yes on expecting NOT FOUND @@ -68,7 +70,9 @@ set autocommit=1; -- let SEARCH_FILE=$t3_IBD -- source include/search_pattern_in_file.inc +--source include/start_mysqld.inc let MYSQLD_DATADIR =`SELECT @@datadir`; + --list_files $MYSQLD_DATADIR/test FLUSH TABLES t1, t2, t3 FOR EXPORT; perl; @@ -95,7 +99,9 @@ SELECT COUNT(1) FROM t2; ALTER TABLE t3 IMPORT TABLESPACE; SELECT COUNT(1) FROM t3; ---sleep 5 +# shutdown so that grep is safe +--source include/shutdown_mysqld.inc + --echo # tablespaces should remain encrypted after import --let SEARCH_PATTERN=foobar --echo # t1 yes on expecting NOT FOUND @@ -110,6 +116,13 @@ SELECT COUNT(1) FROM t3; -- let SEARCH_FILE=$t3_IBD -- source include/search_pattern_in_file.inc +--source include/start_mysqld.inc + +--disable_warnings +SET GLOBAL innodb_file_format = `Barracuda`; +SET GLOBAL innodb_file_per_table = ON; +--enable_warnings + ALTER TABLE t1 ENGINE InnoDB; SHOW CREATE TABLE t1; ALTER TABLE t2 ENGINE InnoDB; @@ -126,7 +139,9 @@ SELECT COUNT(1) FROM t1; SELECT COUNT(1) FROM t2; SELECT COUNT(1) FROM t3; ---sleep 5 +# shutdown so that grep is safe +--source include/shutdown_mysqld.inc + --echo # Tablespaces should be encrypted after restart --let SEARCH_PATTERN=foobar --echo # t1 yes on expecting NOT FOUND @@ -141,9 +156,11 @@ SELECT COUNT(1) FROM t3; -- let SEARCH_FILE=$t3_IBD -- source include/search_pattern_in_file.inc +--source include/start_mysqld.inc + --echo # Wait max 10 min for key encryption threads to encrypt all spaces --let $wait_timeout= 600 ---let $wait_condition=SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION = 0 +--let $wait_condition=SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION = 0 AND ROTATING_OR_FLUSHING <> 0 --source include/wait_condition.inc --echo # Success! diff --git a/mysql-test/suite/encryption/t/innodb_encryption_filekeys.test b/mysql-test/suite/encryption/t/innodb_encryption_filekeys.test index 8f0986071..60afb6033 100644 --- a/mysql-test/suite/encryption/t/innodb_encryption_filekeys.test +++ b/mysql-test/suite/encryption/t/innodb_encryption_filekeys.test @@ -1,21 +1,18 @@ -- source include/have_innodb.inc -- source include/have_file_key_management_plugin.inc -# embedded does not support restart --- source include/not_embedded.inc - -call mtr.add_suppression("trying to do an operation on a dropped tablespace .*"); --disable_query_log let $innodb_file_format_orig = `SELECT @@innodb_file_format`; -let $innodb_file_per_table_orig = `SELECT @@innodb_file_per_table`; let $encrypt_tables = `SELECT @@innodb_encrypt_tables`; let $threads = `SELECT @@innodb_encryption_threads`; +let $key_id = `SELECT @@innodb_default_encryption_key_id`; --enable_query_log +--disable_warnings SET GLOBAL innodb_file_format = `Barracuda`; -SET GLOBAL innodb_file_per_table = ON; SET GLOBAL innodb_encrypt_tables = OFF; SET GLOBAL innodb_encryption_threads = 4; +--enable_warnings CREATE TABLE t1 (pk INT PRIMARY KEY AUTO_INCREMENT, c VARCHAR(256)) ENGINE=INNODB; SHOW CREATE TABLE t1; @@ -25,21 +22,20 @@ CREATE TABLE t4 (pk INT PRIMARY KEY AUTO_INCREMENT, c VARCHAR(256)) ENGINE=INNOD --disable_warnings --disable_query_log -set autocommit=0; -let $i = 400; +begin; +let $i = 10; while ($i) { INSERT INTO t1 values(NULL, substring(MD5(RAND()), -128)); dec $i; } -commit; -set autocommit=1; ---enable_warnings ---enable_query_log INSERT INTO t2 select * from t1; INSERT INTO t3 select * from t1; INSERT INTO t4 select * from t1; +commit; +--enable_warnings +--enable_query_log SET GLOBAL innodb_encrypt_tables = on; @@ -60,7 +56,7 @@ while ($cnt) } if (!$success) { - SELECT * FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION; + SELECT NAME,ENCRYPTION_SCHEME,MIN_KEY_VERSION, ROTATING_OR_FLUSHING FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION; SHOW STATUS LIKE 'innodb_encryption%'; -- die Timeout waiting for encryption threads } @@ -90,7 +86,7 @@ while ($cnt) } if (!$success) { - SELECT * FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION; + SELECT NAME,ENCRYPTION_SCHEME,MIN_KEY_VERSION, ROTATING_OR_FLUSHING FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION; SHOW STATUS LIKE 'innodb_encryption%'; -- die Timeout waiting for encryption threads } @@ -119,7 +115,7 @@ while ($cnt) } if (!$success) { - SELECT * FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION; + SELECT NAME,ENCRYPTION_SCHEME,MIN_KEY_VERSION, ROTATING_OR_FLUSHING FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION; SHOW STATUS LIKE 'innodb_encryption%'; -- die Timeout waiting for encryption threads } @@ -131,15 +127,16 @@ SELECT COUNT(1) FROM t3; SELECT COUNT(1) FROM t4; SELECT COUNT(1) FROM t5; +drop table t1,t2,t3,t4, t5; + # reset system --disable_query_log -EVAL SET GLOBAL innodb_file_per_table = $innodb_file_per_table_orig; +--disable_warnings EVAL SET GLOBAL innodb_file_format = $innodb_file_format_orig; EVAL SET GLOBAL innodb_encrypt_tables = $encrypt_tables; EVAL SET GLOBAL innodb_encryption_threads = $threads; +EVAL set GLOBAL innodb_default_encryption_key_id = $key_id; +--enable_warnings --enable_query_log -drop table t1,t2,t3,t4, t5; - -set GLOBAL innodb_default_encryption_key_id=1; diff --git a/mysql-test/suite/encryption/t/tempfiles.combinations b/mysql-test/suite/encryption/t/tempfiles.combinations new file mode 100644 index 000000000..7010d2c10 --- /dev/null +++ b/mysql-test/suite/encryption/t/tempfiles.combinations @@ -0,0 +1,5 @@ +[none] +binlog-checksum=NONE + +[crc32] +binlog-checksum=CRC32 diff --git a/mysql-test/suite/encryption/t/tempfiles.opt b/mysql-test/suite/encryption/t/tempfiles.opt new file mode 100644 index 000000000..2b90f4744 --- /dev/null +++ b/mysql-test/suite/encryption/t/tempfiles.opt @@ -0,0 +1 @@ +--encrypt-tmp-files diff --git a/mysql-test/suite/encryption/t/tempfiles.test b/mysql-test/suite/encryption/t/tempfiles.test index 34dcbdf59..5232bcb5d 100644 --- a/mysql-test/suite/encryption/t/tempfiles.test +++ b/mysql-test/suite/encryption/t/tempfiles.test @@ -11,6 +11,8 @@ source include/have_binlog_format_row.inc; # engine. But there's no need to run it twice for InnoDB and XtraDB. source include/have_xtradb.inc; +select @@encrypt_tmp_files; + # # MyISAM messing around with IO_CACHE::file # @@ -31,6 +33,7 @@ update t1 set c=v, t=v; select sql_big_result t,count(t) from t1 group by t limit 10; drop table t1; +reset master; set global binlog_cache_size=8192; connect con1, localhost, root; @@ -48,7 +51,6 @@ commit; start transaction; insert t1 select repeat(seq, 1000) from seq_1_to_8; commit; -drop table t1; disconnect con1; connect con2, localhost, root; @@ -58,17 +60,27 @@ connect con2, localhost, root; # Start a transaction, write until the cache goes to disk, # create a savepoint, write more blocks to disk, rollback to savepoint. # -create table t1 (a text) engine=innodb; +create table t2 (a text) engine=innodb; start transaction; -insert t1 select repeat(seq, 1000) from seq_1_to_15; +insert t2 select repeat(seq, 1000) from seq_1_to_15; savepoint foo; -insert t1 select repeat(seq, 1000) from seq_16_to_30; +insert t2 select repeat(seq, 1000) from seq_16_to_30; rollback to savepoint foo; -insert t1 select repeat(seq, 1000) from seq_31_to_40; +insert t2 select repeat(seq, 1000) from seq_31_to_40; commit; -drop table t1; disconnect con2; connection default; +flush binary logs; + +drop table t1, t2; + set global binlog_cache_size=default; + +let $MYSQLD_DATADIR= `select @@datadir`; +exec $MYSQL_BINLOG $MYSQLD_DATADIR/master-bin.000001 | $MYSQL; + +select left(a, 10) from t1; +select left(a, 10) from t2; +drop table t1, t2; diff --git a/mysql-test/suite/federated/have_federatedx.inc b/mysql-test/suite/federated/have_federatedx.inc index 56ce31f5b..2250dd205 100644 --- a/mysql-test/suite/federated/have_federatedx.inc +++ b/mysql-test/suite/federated/have_federatedx.inc @@ -1,5 +1,5 @@ if (!`SELECT count(*) FROM information_schema.plugins WHERE plugin_name = 'federated' AND plugin_status = 'active' AND - plugin_description LIKE '%FederatedX%'`){ + plugin_description LIKE '%transactions%'`){ skip Need FederatedX engine; } diff --git a/mysql-test/suite/funcs_1/r/is_engines_archive.result b/mysql-test/suite/funcs_1/r/is_engines_archive.result index 277299249..52802b17a 100644 --- a/mysql-test/suite/funcs_1/r/is_engines_archive.result +++ b/mysql-test/suite/funcs_1/r/is_engines_archive.result @@ -2,7 +2,7 @@ SELECT * FROM information_schema.engines WHERE ENGINE = 'ARCHIVE'; ENGINE ARCHIVE SUPPORT YES -COMMENT Archive storage engine +COMMENT gzip-compresses tables for a low storage footprint TRANSACTIONS NO XA NO SAVEPOINTS NO diff --git a/mysql-test/suite/funcs_1/r/is_engines_csv.result b/mysql-test/suite/funcs_1/r/is_engines_csv.result index 2a7e61ee4..7e413b9af 100644 --- a/mysql-test/suite/funcs_1/r/is_engines_csv.result +++ b/mysql-test/suite/funcs_1/r/is_engines_csv.result @@ -2,7 +2,7 @@ SELECT * FROM information_schema.engines WHERE ENGINE = 'CSV'; ENGINE CSV SUPPORT YES -COMMENT CSV storage engine +COMMENT Stores tables as CSV files TRANSACTIONS NO XA NO SAVEPOINTS NO diff --git a/mysql-test/suite/funcs_1/r/is_engines_federated.result b/mysql-test/suite/funcs_1/r/is_engines_federated.result index 8057a0266..20926458e 100644 --- a/mysql-test/suite/funcs_1/r/is_engines_federated.result +++ b/mysql-test/suite/funcs_1/r/is_engines_federated.result @@ -2,7 +2,7 @@ SELECT * FROM information_schema.engines WHERE ENGINE = 'FEDERATED'; ENGINE FEDERATED SUPPORT YES -COMMENT FederatedX pluggable storage engine +COMMENT Allows to access tables on other MariaDB servers, supports transactions and more TRANSACTIONS YES XA NO SAVEPOINTS YES diff --git a/mysql-test/suite/funcs_1/r/is_engines_myisam.result b/mysql-test/suite/funcs_1/r/is_engines_myisam.result index 7e42c8641..d307ce4be 100644 --- a/mysql-test/suite/funcs_1/r/is_engines_myisam.result +++ b/mysql-test/suite/funcs_1/r/is_engines_myisam.result @@ -2,7 +2,7 @@ SELECT * FROM information_schema.engines WHERE ENGINE = 'MyISAM'; ENGINE MyISAM SUPPORT DEFAULT -COMMENT MyISAM storage engine +COMMENT Non-transactional engine with good performance and small data footprint TRANSACTIONS NO XA NO SAVEPOINTS NO diff --git a/mysql-test/suite/galera/disabled.def b/mysql-test/suite/galera/disabled.def index b67dea0f2..397ad22da 100644 --- a/mysql-test/suite/galera/disabled.def +++ b/mysql-test/suite/galera/disabled.def @@ -9,53 +9,24 @@ # Do not use any TAB characters for whitespace. # ############################################################################## -MW-336 : MDEV-13549 Galera test failures -galera_gra_log : MDEV-13549 Galera test failures -galera_flush_local : MDEV-13549 Galera test failures -galera_flush : MDEV-13549 Galera test failures -MW-329 : MDEV-13549 Galera test failures + +galera_flush : MariaDB does not have global.thread_statistics galera_account_management : MariaDB 10.0 does not support ALTER USER -galera_binlog_row_image : MariaDB 10.0 does not support binlog_row_image galera_binlog_rows_query_log_events: MariaDB does not support binlog_rows_query_log_events -GAL-419 : MDEV-13549 Galera test failures -galera_toi_ddl_fk_insert : MDEV-13549 Galera test failures -galera_var_notify_cmd : MDEV-13549 Galera test failures -galera_var_slave_threads : MDEV-13549 Galera test failures -mysql-wsrep#90 : MDEV-13549 Galera test failures +galera_migrate : MariaDB does not support START SLAVE USER galera_as_master_gtid : Requires MySQL GTID galera_as_master_gtid_change_master : Requires MySQL GTID -galera_as_slave_replication_bundle : MDEV-13549 Galera test failures galera_as_slave_preordered : wsrep-preordered feature not merged to MariaDB -galera_gcs_fragment : MDEV-13549 Galera test failures +GAL-419 : MDEV-13549 Galera test failures +galera_var_notify_cmd : MDEV-13549 Galera test failures +galera_as_slave_replication_bundle : MDEV-13549 Galera test failures galera_gcache_recover : MDEV-13549 Galera test failures galera_gcache_recover_full_gcache : MDEV-13549 Galera test failures galera_gcache_recover_manytrx : MDEV-13549 Galera test failures -galera_ist_mysqldump : MDEV-13549 Galera test failures -mysql-wsrep#31 : MDEV-13549 Galera test failures -galera_migrate : MariaDB 10.0 does not support START SLAVE USER -galera_concurrent_ctas : MDEV-13549 Galera test failures -galera_bf_abort_for_update : MDEV-13549 Galera test failures -galera_wsrep_desync_wsrep_on : MDEV-13549 Galera test failures galera_ssl_upgrade : MDEV-13549 Galera test failures -mysql-wsrep#33 : MDEV-13549 Galera test failures -galera_var_auto_inc_control_on : MDEV-13549 Galera test failures -MW-44 : MDEV-13549 Galera test failures -galera_var_retry_autocommit : MDEV-13549 Galera test failures -pxc-421 : MDEV-13549 Galera test failures -lp1376747-2 : MDEV-13549 Galera test failures -lp1376747 : MDEV-13549 Galera test failures -galera_toi_ddl_nonconflicting : MDEV-13549 Galera test failures -galera_parallel_simple : MDEV-13549 Galera test failures -galera_admin : MDEV-13549 Galera test failures -galera_var_max_ws_rows : MDEV-13549 Galera test failures 10.1 -MW-286 : MDEV-13549 Galera test failures 10.1 -galera_as_master: MDEV-13549 Galera test failures 10.1 -galera_pc_ignore_sb : MDEV-13549 Galera test failures 10.1 -galera_lock_table : MDEV-13549 Galera test failures 10.1 -MW-284 : MDEV-13549 Galera test failures 10.1 -galera_as_slave : MDEV-13549 Galera test failures 10.1 -MW-328C: MDEV-13549 Galera test failures 10.1 -MW-328A: MDEV-13549 Galera test failures 10.1 -MW-328B: MDEV-13549 Galera test failures 10.1 -MW-328: MDEV-13549 Galera test failures 10.1 -galera_suspend_slave: MDEV-13549 Galera test failures 10.1 \ No newline at end of file +galera.MW-329 : wsrep_local_replays not stable +galera.MW-328A : have_deadlocks test not stable +query_cache : MDEV-15805 Test failure on galera.query_cache +MW-416 : MDEV-13549 Galera test failures +galera_wan : MDEV-13549 Galera test failures +MW-388 : MDEV-13549 Galera test failures diff --git a/mysql-test/suite/galera/galera_2nodes_as_master_slave.cnf b/mysql-test/suite/galera/galera_2nodes_as_master_slave.cnf deleted file mode 100644 index f68fe5249..000000000 --- a/mysql-test/suite/galera/galera_2nodes_as_master_slave.cnf +++ /dev/null @@ -1,83 +0,0 @@ - -# -# Let's understand the topology. -# * Independent Master with server-id = 1 -# * Galera cluster with 2 nodes: node#1 and node#2 with server-id = 2, 3 -# node#1 act as slave to Independent Master with server-id = 1 -# * Independent Slave with server-id = 4 replicating from galera node#2 -# - -# Use default setting for mysqld processes -!include include/default_mysqld.cnf - -[mysqld] -log-slave-updates -log-bin=mysqld-bin -binlog-format=row -gtid-mode=on -enforce-gtid-consistency=true - -[mysqld.1] -server-id=1 - -[mysqld.2] -server-id=2 - -wsrep_provider=@ENV.WSREP_PROVIDER -wsrep_cluster_address='gcomm://' -wsrep_provider_options='base_port=@mysqld.2.#galera_port;evs.install_timeout = PT15S; evs.max_install_timeouts=1;' - -# enforce read-committed characteristics across the cluster -wsrep_causal_reads=ON -wsrep_sync_wait = 15 - -wsrep_node_address=127.0.0.1 -wsrep_sst_receive_address=127.0.0.2:@mysqld.2.#sst_port -wsrep_node_incoming_address=127.0.0.1:@mysqld.2.port - -# Required for Galera -innodb_autoinc_lock_mode=2 - -innodb_flush_log_at_trx_commit=2 - -[mysqld.3] -server-id=3 - -wsrep_provider=@ENV.WSREP_PROVIDER -wsrep_cluster_address='gcomm://127.0.0.1:@mysqld.2.#galera_port' -wsrep_provider_options='base_port=@mysqld.3.#galera_port;evs.install_timeout = PT15S; evs.max_install_timeouts = 1;' - -# enforce read-committed characteristics across the cluster -wsrep_causal_reads=ON -wsrep_sync_wait = 15 - -wsrep_node_address=127.0.0.1 -wsrep_sst_receive_address=127.0.0.2:@mysqld.3.#sst_port -wsrep_node_incoming_address=127.0.0.1:@mysqld.3.port - -# Required for Galera -innodb_autoinc_lock_mode=2 - -innodb_flush_log_at_trx_commit=2 - -[mysqld.4] -server-id=4 - -[ENV] -NODE_MYPORT_1= @mysqld.1.port -NODE_MYSOCK_1= @mysqld.1.socket - -NODE_MYPORT_2= @mysqld.2.port -NODE_MYSOCK_2= @mysqld.2.socket - -NODE_MYPORT_3= @mysqld.3.port -NODE_MYSOCK_3= @mysqld.3.socket - -NODE_MYPORT_4= @mysqld.4.port -NODE_MYSOCK_4= @mysqld.4.socket - -NODE_GALERAPORT_2= @mysqld.2.#galera_port -NODE_GALERAPORT_3= @mysqld.3.#galera_port - -NODE_SSTPORT_2= @mysqld.2.#sst_port -NODE_SSTPORT_3= @mysqld.3.#sst_port diff --git a/mysql-test/suite/galera/galera_2nodes_as_master_with_repl_filter.cnf b/mysql-test/suite/galera/galera_2nodes_as_master_with_repl_filter.cnf deleted file mode 100644 index d5490280a..000000000 --- a/mysql-test/suite/galera/galera_2nodes_as_master_with_repl_filter.cnf +++ /dev/null @@ -1,87 +0,0 @@ -# -# This .cnf file creates a setup with a 2-node Galera cluster and one stand-alone MySQL server, to be used as a slave -# - -# Use default setting for mysqld processes -!include include/default_mysqld.cnf - -[mysqld] -default-storage-engine=InnoDB - -[mysqld.1] -server-id=1 -binlog-format=row -log-bin=mysqld-bin -log_slave_updates -gtid-mode=on -enforce-gtid-consistency=true -event-scheduler=1 - -wsrep_provider=@ENV.WSREP_PROVIDER -wsrep_cluster_address='gcomm://' -wsrep_provider_options='base_port=@mysqld.1.#galera_port' - -# enforce read-committed characteristics across the cluster -wsrep_causal_reads=ON -wsrep_sync_wait = 15 - -wsrep_node_address=127.0.0.1 -wsrep_sst_receive_address=127.0.0.2:@mysqld.1.#sst_port -wsrep_node_incoming_address=127.0.0.1:@mysqld.1.port - -# Required for Galera -innodb_autoinc_lock_mode=2 - -innodb_flush_log_at_trx_commit=2 - -[mysqld.2] -server-id=2 -binlog-format=row -log-bin=mysqld-bin -log_slave_updates -gtid-mode=on -enforce-gtid-consistency=true -event-scheduler=1 - -wsrep_provider=@ENV.WSREP_PROVIDER -wsrep_cluster_address='gcomm://127.0.0.1:@mysqld.1.#galera_port' -wsrep_provider_options='base_port=@mysqld.2.#galera_port' - -# enforce read-committed characteristics across the cluster -wsrep_causal_reads=ON -wsrep_sync_wait = 15 - -wsrep_node_address=127.0.0.1 -wsrep_sst_receive_address=127.0.0.2:@mysqld.2.#sst_port -wsrep_node_incoming_address=127.0.0.1:@mysqld.2.port - -# Required for Galera -innodb_autoinc_lock_mode=2 - -innodb_flush_log_at_trx_commit=2 - -[mysqld.3] -server-id=3 -replicate-ignore-db=test -replicate-wild-ignore-table=test.% -log-bin=mysqld-bin -log_slave_updates -gtid-mode=on -enforce-gtid-consistency=true -event-scheduler=1 - -[ENV] -NODE_MYPORT_1= @mysqld.1.port -NODE_MYSOCK_1= @mysqld.1.socket - -NODE_MYPORT_2= @mysqld.2.port -NODE_MYSOCK_2= @mysqld.2.socket - -NODE_MYPORT_3= @mysqld.3.port -NODE_MYSOCK_3= @mysqld.3.socket - -NODE_GALERAPORT_1= @mysqld.1.#galera_port -NODE_GALERAPORT_2= @mysqld.2.#galera_port - -NODE_SSTPORT_1= @mysqld.1.#sst_port -NODE_SSTPORT_2= @mysqld.2.#sst_port diff --git a/mysql-test/suite/galera/include/galera_load_provider.inc b/mysql-test/suite/galera/include/galera_load_provider.inc index 761a1a89f..aeab7e6ea 100644 --- a/mysql-test/suite/galera/include/galera_load_provider.inc +++ b/mysql-test/suite/galera/include/galera_load_provider.inc @@ -5,6 +5,4 @@ --eval SET GLOBAL wsrep_cluster_address = '$wsrep_cluster_address_orig'; --enable_query_log ---enable_reconnect ---source include/wait_until_connected_again.inc ---source include/wait_until_ready.inc +--source include/galera_wait_ready.inc diff --git a/mysql-test/suite/galera/include/galera_sst_set_mysqldump.inc b/mysql-test/suite/galera/include/galera_sst_set_mysqldump.inc index cbd2c1c81..16af5742b 100644 --- a/mysql-test/suite/galera/include/galera_sst_set_mysqldump.inc +++ b/mysql-test/suite/galera/include/galera_sst_set_mysqldump.inc @@ -4,6 +4,9 @@ --echo Setting SST method to mysqldump ... +call mtr.add_suppression("WSREP: wsrep_sst_method is set to 'mysqldump' yet mysqld bind_address is set to '127.0.0.1'"); +call mtr.add_suppression("Failed to load slave replication state from table mysql.gtid_slave_pos"); + --connection node_1 # We need a user with a password to perform SST, otherwise we hit LP #1378253 CREATE USER 'sst'; @@ -19,6 +22,6 @@ SET GLOBAL wsrep_sst_auth = 'sst:'; --disable_query_log # Set wsrep_sst_receive_address to the SQL port ---eval SET GLOBAL wsrep_sst_receive_address = '127.0.0.2:$NODE_MYPORT_2'; +--eval SET GLOBAL wsrep_sst_receive_address = '127.0.0.1:$NODE_MYPORT_2'; --enable_query_log SET GLOBAL wsrep_sst_method = 'mysqldump'; diff --git a/mysql-test/suite/galera/include/galera_st_clean_slave.inc b/mysql-test/suite/galera/include/galera_st_clean_slave.inc index 81ba54aa6..3a49f4f6a 100644 --- a/mysql-test/suite/galera/include/galera_st_clean_slave.inc +++ b/mysql-test/suite/galera/include/galera_st_clean_slave.inc @@ -64,7 +64,9 @@ INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after'); --connection node_2 --echo Starting server ... --source include/start_mysqld.inc ---source include/wait_until_ready.inc + +--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size' +--source include/wait_condition.inc SET AUTOCOMMIT=OFF; START TRANSACTION; diff --git a/mysql-test/suite/galera/include/galera_st_kill_slave.inc b/mysql-test/suite/galera/include/galera_st_kill_slave.inc index bae37755c..0b96de55a 100644 --- a/mysql-test/suite/galera/include/galera_st_kill_slave.inc +++ b/mysql-test/suite/galera/include/galera_st_kill_slave.inc @@ -24,7 +24,6 @@ COMMIT; --source include/kill_galera.inc --connection node_1 ---source include/wait_until_connected_again.inc --let $wait_condition = SELECT VARIABLE_VALUE = 1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size' --source include/wait_condition.inc @@ -59,7 +58,9 @@ INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after'); --echo Starting server ... --source include/start_mysqld.inc ---source include/wait_until_ready.inc + +--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size' +--source include/wait_condition.inc SET AUTOCOMMIT=OFF; START TRANSACTION; diff --git a/mysql-test/suite/galera/include/galera_st_kill_slave_ddl.inc b/mysql-test/suite/galera/include/galera_st_kill_slave_ddl.inc index b8dd0fda9..44a1513fa 100644 --- a/mysql-test/suite/galera/include/galera_st_kill_slave_ddl.inc +++ b/mysql-test/suite/galera/include/galera_st_kill_slave_ddl.inc @@ -1,3 +1,5 @@ +source include/maybe_debug.inc; +if ($have_debug) { --echo Performing State Transfer on a server that has been killed and restarted --echo while a DDL was in progress on it @@ -70,7 +72,9 @@ INSERT INTO t1 (f1) VALUES ('node1_to_be_rollbacked_after'); --connection node_2 --echo Starting server ... --source include/start_mysqld.inc ---source include/wait_until_ready.inc + +--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size' +--source include/wait_condition.inc SET AUTOCOMMIT=OFF; START TRANSACTION; @@ -121,3 +125,4 @@ COMMIT; SET AUTOCOMMIT=ON; SET GLOBAL debug_dbug = $debug_orig; +} diff --git a/mysql-test/suite/galera/include/galera_st_shutdown_slave.inc b/mysql-test/suite/galera/include/galera_st_shutdown_slave.inc index 1a65ef1bd..6c09b0ceb 100644 --- a/mysql-test/suite/galera/include/galera_st_shutdown_slave.inc +++ b/mysql-test/suite/galera/include/galera_st_shutdown_slave.inc @@ -56,7 +56,9 @@ INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after'); --connection node_2 --echo Starting server ... --source include/start_mysqld.inc ---source include/wait_until_ready.inc + +--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size' +--source include/wait_condition.inc SET AUTOCOMMIT=OFF; START TRANSACTION; diff --git a/mysql-test/suite/galera/include/have_mariabackup.inc b/mysql-test/suite/galera/include/have_mariabackup.inc new file mode 100644 index 000000000..0dd693f2c --- /dev/null +++ b/mysql-test/suite/galera/include/have_mariabackup.inc @@ -0,0 +1,4 @@ +# +# suite.pm will make sure that all tests including this file +# will be skipped as needed +# diff --git a/mysql-test/suite/galera/include/have_wsrep_replicate_myisam.inc b/mysql-test/suite/galera/include/have_wsrep_replicate_myisam.inc new file mode 100644 index 000000000..726fc6e2b --- /dev/null +++ b/mysql-test/suite/galera/include/have_wsrep_replicate_myisam.inc @@ -0,0 +1,4 @@ +--require suite/galera/r/have_wsrep_replicate_myisam.require +disable_query_log; +SHOW VARIABLES LIKE 'wsrep_replicate_myisam'; +enable_query_log; diff --git a/mysql-test/suite/galera/include/have_xtrabackup.inc b/mysql-test/suite/galera/include/have_xtrabackup.inc new file mode 100644 index 000000000..0dd693f2c --- /dev/null +++ b/mysql-test/suite/galera/include/have_xtrabackup.inc @@ -0,0 +1,4 @@ +# +# suite.pm will make sure that all tests including this file +# will be skipped as needed +# diff --git a/mysql-test/suite/galera/include/kill_galera.inc b/mysql-test/suite/galera/include/kill_galera.inc index c61bad8e1..d7f665df6 100644 --- a/mysql-test/suite/galera/include/kill_galera.inc +++ b/mysql-test/suite/galera/include/kill_galera.inc @@ -1,7 +1,6 @@ --echo Killing server ... # Write file to make mysql-test-run.pl expect the crash, but don't start it ---source include/wait_until_connected_again.inc --let $_server_id= `SELECT @@server_id` --let $_expect_file_name= $MYSQLTEST_VARDIR/tmp/mysqld.$_server_id.expect --exec echo "wait" > $_expect_file_name diff --git a/mysql-test/suite/galera/include/start_mysqld.inc b/mysql-test/suite/galera/include/start_mysqld.inc index 4ee3d1781..57af9203d 100644 --- a/mysql-test/suite/galera/include/start_mysqld.inc +++ b/mysql-test/suite/galera/include/start_mysqld.inc @@ -12,11 +12,4 @@ if ($galera_wsrep_start_position == '') { --exec echo "restart:$start_mysqld_params" > $_expect_file_name } -# Turn on reconnect ---enable_reconnect - -# Call script that will poll the server waiting for it to be back online again ---source include/wait_until_connected_again.inc - -# Turn off reconnect again ---disable_reconnect +--source include/galera_wait_ready.inc diff --git a/mysql-test/suite/galera/r/MW-284.result b/mysql-test/suite/galera/r/MW-284.result index 9d1c3e566..c9c006988 100644 --- a/mysql-test/suite/galera/r/MW-284.result +++ b/mysql-test/suite/galera/r/MW-284.result @@ -14,3 +14,6 @@ STOP SLAVE; RESET SLAVE ALL; CALL mtr.add_suppression('failed registering on master'); CALL mtr.add_suppression('You need to use --log-bin to make --binlog-format work'); +RESET MASTER; +CALL mtr.add_suppression('WSREP: Last Applied Action message in non-primary configuration from member'); +CALL mtr.add_suppression('WSREP: Last Applied Action message in non-primary configuration from member'); diff --git a/mysql-test/suite/galera/r/MW-329.result b/mysql-test/suite/galera/r/MW-329.result index a79ba598d..4666d131c 100644 --- a/mysql-test/suite/galera/r/MW-329.result +++ b/mysql-test/suite/galera/r/MW-329.result @@ -19,3 +19,4 @@ VARIABLE_VALUE > 0 DROP PROCEDURE proc_insert; DROP TABLE t1; CALL mtr.add_suppression("conflict state 3 after post commit"); +set global innodb_status_output=Default; diff --git a/mysql-test/suite/galera/r/MW-336.result b/mysql-test/suite/galera/r/MW-336.result index 9bdb61c1a..34874198c 100644 --- a/mysql-test/suite/galera/r/MW-336.result +++ b/mysql-test/suite/galera/r/MW-336.result @@ -3,13 +3,7 @@ SET GLOBAL wsrep_slave_threads = 10; SET GLOBAL wsrep_slave_threads = 1; INSERT INTO t1 VALUES (1); SET GLOBAL wsrep_slave_threads = 10; -SELECT COUNT(*) = 11 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'system user'; -COUNT(*) = 11 -1 SET GLOBAL wsrep_slave_threads = 20; -SELECT COUNT(*) = 21 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'system user'; -COUNT(*) = 21 -1 SET GLOBAL wsrep_slave_threads = 1; INSERT INTO t1 VALUES (1); INSERT INTO t1 VALUES (2); @@ -35,8 +29,5 @@ INSERT INTO t1 VALUES (17); INSERT INTO t1 VALUES (18); INSERT INTO t1 VALUES (19); INSERT INTO t1 VALUES (20); -SELECT COUNT(*) = 2 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'system user'; -COUNT(*) = 2 -1 SET GLOBAL wsrep_slave_threads = 1; DROP TABLE t1; diff --git a/mysql-test/suite/galera/r/MW-416.result b/mysql-test/suite/galera/r/MW-416.result new file mode 100644 index 000000000..05399b213 --- /dev/null +++ b/mysql-test/suite/galera/r/MW-416.result @@ -0,0 +1,114 @@ +CREATE USER 'userMW416'@'localhost'; +GRANT SELECT, INSERT, UPDATE ON test.* TO 'userMW416'@'localhost'; +SHOW GLOBAL STATUS LIKE 'wsrep_replicated'; +Variable_name Value +wsrep_replicated 2 +ALTER DATABASE db CHARACTER SET = utf8; +ERROR 42000: Access denied for user 'userMW416'@'localhost' to database 'db' +ALTER EVENT ev1 RENAME TO ev2; +ERROR 42000: Access denied for user 'userMW416'@'localhost' to database 'test' +ALTER FUNCTION fun1 COMMENT 'foo'; +ERROR 42000: alter routine command denied to user 'userMW416'@'localhost' for routine 'test.fun1' +ALTER LOGFILE GROUP lfg ADD UNDOFILE 'file' ENGINE=InnoDB; +Got one of the listed errors +ALTER PROCEDURE proc1 COMMENT 'foo'; +Got one of the listed errors +ALTER SERVER srv OPTIONS (USER 'sally'); +Got one of the listed errors +ALTER TABLE tbl DROP COLUMN col; +Got one of the listed errors +ALTER TABLESPACE tblspc DROP DATAFILE 'file' ENGINE=innodb; +Got one of the listed errors +ALTER VIEW vw AS SELECT 1; +Got one of the listed errors +CREATE DATABASE db; +Got one of the listed errors +CREATE EVENT ev1 ON SCHEDULE AT CURRENT_TIMESTAMP DO SELECT 1; +Got one of the listed errors +CREATE FUNCTION fun1() RETURNS int RETURN(1); +Got one of the listed errors +CREATE FUNCTION fun1 RETURNS STRING SONAME 'funlib.so'; +Got one of the listed errors +CREATE PROCEDURE proc1() BEGIN END; +Got one of the listed errors +CREATE INDEX idx ON tbl(id); +Got one of the listed errors +CREATE LOGFILE GROUP lfg ADD UNDOFILE 'undofile' ENGINE innodb; +Got one of the listed errors +CREATE SERVER srv FOREIGN DATA WRAPPER 'fdw' OPTIONS (USER 'user'); +Got one of the listed errors +CREATE TABLE t (i int); +Got one of the listed errors +CREATE TABLESPACE tblspc ADD DATAFILE 'file' ENGINE=innodb; +Got one of the listed errors +CREATE TRIGGER trg BEFORE UPDATE ON t FOR EACH ROW BEGIN END; +Got one of the listed errors +CREATE VIEW vw AS SELECT 1; +Got one of the listed errors +DROP DATABASE db; +Got one of the listed errors +DROP EVENT ev; +Got one of the listed errors +DROP FUNCTION fun1; +Got one of the listed errors +DROP INDEX idx ON t0; +Got one of the listed errors +DROP LOGFILE GROUP lfg; +Got one of the listed errors +DROP PROCEDURE proc1; +Got one of the listed errors +DROP SERVEr srv; +Got one of the listed errors +DROP TABLE t0; +Got one of the listed errors +DROP TABLESPACE tblspc; +Got one of the listed errors +DROP TRIGGER trg; +Got one of the listed errors +DROP VIEW vw; +Got one of the listed errors +RENAME TABLE t0 TO t1; +Got one of the listed errors +TRUNCATE TABLE t0; +Got one of the listed errors +ALTER USER myuser PASSWORD EXPIRE; +Got one of the listed errors +CREATE USER myuser IDENTIFIED BY 'pass'; +Got one of the listed errors +DROP USER myuser; +Got one of the listed errors +GRANT ALL ON *.* TO 'myuser'; +Got one of the listed errors +RENAME USER myuser TO mariauser; +Got one of the listed errors +REVOKE SELECT ON test FROM myuser; +Got one of the listed errors +REVOKE ALL, GRANT OPTION FROM myuser; +Got one of the listed errors +REVOKE PROXY ON myuser FROM myuser; +Got one of the listed errors +ANALYZE TABLE db.tbl; +Got one of the listed errors +CHECK TABLE db.tbl; +Got one of the listed errors +CHECKSUM TABLE db.tbl; +Got one of the listed errors +OPTIMIZE TABLE db.tbl; +Got one of the listed errors +REPAIR TABLE db.tbl; +Got one of the listed errors +INSTALL PLUGIN plg SONAME 'plg.so'; +Got one of the listed errors +UNINSTALL PLUGIN plg; +Got one of the listed errors +DROP USER 'userMW416'@'localhost'; +SHOW DATABASES; +Database +information_schema +mtr +mysql +performance_schema +test +SHOW GLOBAL STATUS LIKE 'wsrep_replicated'; +Variable_name Value +wsrep_replicated 3 diff --git a/mysql-test/suite/galera/r/MW-44.result b/mysql-test/suite/galera/r/MW-44.result index 28a6f1ac8..459a61030 100644 --- a/mysql-test/suite/galera/r/MW-44.result +++ b/mysql-test/suite/galera/r/MW-44.result @@ -1,5 +1,21 @@ +SET GLOBAL general_log='OFF'; TRUNCATE TABLE mysql.general_log; +SELECT COUNT(*) from mysql.general_log; +COUNT(*) +0 +SELECT * FROM mysql.general_log; +event_time user_host thread_id server_id command_type argument +SET GLOBAL general_log='OFF'; TRUNCATE TABLE mysql.general_log; +SELECT COUNT(*) from mysql.general_log; +COUNT(*) +0 +SELECT * FROM mysql.general_log; +event_time user_host thread_id server_id command_type argument +SET GLOBAL general_log='ON'; +SELECT COUNT(*) from mysql.general_log; +COUNT(*) +1 SET SESSION wsrep_osu_method=TOI; CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB; SET SESSION wsrep_osu_method=RSU; @@ -8,6 +24,7 @@ SET SESSION wsrep_osu_method=TOI; SELECT COUNT(*) = 2 FROM mysql.general_log WHERE argument LIKE 'CREATE%' OR argument LIKE 'ALTER%'; COUNT(*) = 2 1 +SET GLOBAL general_log='ON'; SELECT COUNT(*) = 0 FROM mysql.general_log WHERE argument NOT LIKE 'SELECT%'; COUNT(*) = 0 1 diff --git a/mysql-test/suite/galera/r/galera#500.result b/mysql-test/suite/galera/r/galera#500.result new file mode 100644 index 000000000..6a07d0359 --- /dev/null +++ b/mysql-test/suite/galera/r/galera#500.result @@ -0,0 +1,10 @@ +SET SESSION wsrep_sync_wait = 0; +SET GLOBAL wsrep_provider_options="gmcast.isolate=2"; +SET SESSION wsrep_sync_wait = 0; +SHOW STATUS LIKE 'wsrep_cluster_status'; +Variable_name Value +wsrep_cluster_status non-Primary +SET SESSION wsrep_sync_wait = default; +SET GLOBAL wsrep_provider_options="pc.bootstrap=1"; +SET SESSION wsrep_on=0; +CALL mtr.add_suppression("WSREP: exception from gcomm, backend must be restarted: Gcomm backend termination was requested by setting gmcast.isolate=2."); diff --git a/mysql-test/suite/galera/r/galera_as_master.result b/mysql-test/suite/galera/r/galera_as_master.result index e96d39aea..06de9ccf0 100644 --- a/mysql-test/suite/galera/r/galera_as_master.result +++ b/mysql-test/suite/galera/r/galera_as_master.result @@ -47,3 +47,4 @@ DROP TABLE t2, t3; STOP SLAVE; RESET SLAVE ALL; CALL mtr.add_suppression('You need to use --log-bin to make --binlog-format work'); +RESET MASTER; diff --git a/mysql-test/suite/galera/r/galera_bf_abort_for_update.result b/mysql-test/suite/galera/r/galera_bf_abort_for_update.result index 3978a3df1..236792446 100644 --- a/mysql-test/suite/galera/r/galera_bf_abort_for_update.result +++ b/mysql-test/suite/galera/r/galera_bf_abort_for_update.result @@ -1,10 +1,21 @@ -CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB; -SET AUTOCOMMIT=OFF; -START TRANSACTION; -INSERT INTO t1 VALUES (1); -INSERT INTO t1 VALUES (1); +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY, f2 INT) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1, 10); +BEGIN; SELECT * FROM t1 FOR UPDATE; +f1 f2 +1 10 +UPDATE t1 SET f1 = 2; +COMMIT; ERROR 40001: Deadlock found when trying to get lock; try restarting transaction -wsrep_local_aborts_increment +wsrep_local_bf_aborts_diff +1 +BEGIN; +SELECT * FROM t1 FOR UPDATE; +f1 f2 +2 10 +UPDATE t1 SET f2 = 20; +COMMIT; +ERROR 40001: Deadlock found when trying to get lock; try restarting transaction +wsrep_local_bf_aborts_diff 1 DROP TABLE t1; diff --git a/mysql-test/suite/galera/r/galera_defaults.result b/mysql-test/suite/galera/r/galera_defaults.result index 28c3f4dd1..5c5fdabf4 100644 --- a/mysql-test/suite/galera/r/galera_defaults.result +++ b/mysql-test/suite/galera/r/galera_defaults.result @@ -1,6 +1,6 @@ SELECT COUNT(*) = 43 FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES WHERE VARIABLE_NAME LIKE 'wsrep_%'; COUNT(*) = 43 -1 +0 SELECT VARIABLE_NAME, VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES WHERE VARIABLE_NAME LIKE 'wsrep_%' @@ -40,6 +40,7 @@ WSREP_NOTIFY_CMD WSREP_ON ON WSREP_OSU_METHOD TOI WSREP_RECOVER OFF +WSREP_REJECT_QUERIES NONE WSREP_REPLICATE_MYISAM OFF WSREP_RESTART_SLAVE OFF WSREP_RETRY_AUTOCOMMIT 1 @@ -51,7 +52,7 @@ WSREP_SST_DONOR WSREP_SST_DONOR_REJECTS_QUERIES OFF WSREP_SST_METHOD rsync WSREP_SYNC_WAIT 15 -; ; ; cert.log_conflicts = no; debug = no; evs.auto_evict = 0; evs.causal_keepalive_period = PT1S; evs.debug_log_mask = 0x1; evs.delay_margin = PT1S; evs.delayed_keep_period = PT30S; evs.inactive_check_period = PT0.5S; evs.inactive_timeout = PT30S; evs.info_log_mask = 0; evs.install_timeout = PT15S; evs.join_retrans_period = PT1S; evs.keepalive_period = PT1S; evs.max_install_timeouts = 3; evs.send_window = 4; evs.stats_report_period = PT1M; evs.suspect_timeout = PT10S; evs.use_aggregate = true; evs.user_send_window = 2; evs.version = 0; evs.view_forget_timeout = P1D; ; gcache.keep_pages_size = 0; gcache.mem_size = 0; ; gcache.page_size = 128M; gcache.recover = no; gcache.size = 10M; gcomm.thread_prio = ; gcs.fc_debug = 0; gcs.fc_factor = 1.0; gcs.fc_limit = 16; gcs.fc_master_slave = no; gcs.max_packet_size = 64500; gcs.max_throttle = 0.25; ; gcs.recv_q_soft_limit = 0.25; gcs.sync_donor = no; ; gmcast.mcast_addr = ; gmcast.mcast_ttl = 1; gmcast.peer_timeout = PT3S; gmcast.segment = 0; gmcast.time_wait = PT5S; gmcast.version = 0; ; pc.announce_timeout = PT3S; pc.checksum = false; pc.ignore_quorum = false; pc.ignore_sb = false; pc.linger = PT20S; pc.npvo = false; pc.recovery = true; pc.version = 0; pc.wait_prim = true; pc.wait_prim_timeout = PT30S; pc.weight = 1; protonet.backend = asio; protonet.version = 0; repl.causal_read_timeout = PT90S; repl.commit_order = 3; repl.key_format = FLAT8; repl.max_ws_size = 2147483647; repl.proto_max = 7; socket.checksum = 2; socket.recv_buf_size = 212992; +; ; ; cert.log_conflicts = no; debug = no; evs.auto_evict = 0; evs.causal_keepalive_period = PT1S; evs.debug_log_mask = 0x1; evs.delay_margin = PT1S; evs.delayed_keep_period = PT30S; evs.inactive_check_period = PT0.5S; evs.inactive_timeout = PT30S; evs.info_log_mask = 0; evs.install_timeout = PT15S; evs.join_retrans_period = PT1S; evs.keepalive_period = PT1S; evs.max_install_timeouts = 3; evs.send_window = 4; evs.stats_report_period = PT1M; evs.suspect_timeout = PT10S; evs.use_aggregate = true; evs.user_send_window = 2; evs.version = 0; evs.view_forget_timeout = P1D; ; gcache.keep_pages_size = 0; gcache.mem_size = 0; ; gcache.page_size = 128M; gcache.recover = no; gcache.size = 10M; gcomm.thread_prio = ; gcs.fc_debug = 0; gcs.fc_factor = 1.0; gcs.fc_limit = 16; gcs.fc_master_slave = no; gcs.max_packet_size = 64500; gcs.max_throttle = 0.25; ; gcs.recv_q_soft_limit = 0.25; gcs.sync_donor = no; ; gmcast.mcast_addr = ; gmcast.mcast_ttl = 1; gmcast.peer_timeout = PT3S; gmcast.segment = 0; gmcast.time_wait = PT5S; gmcast.version = 0; ; pc.announce_timeout = PT3S; pc.checksum = false; pc.ignore_quorum = false; pc.ignore_sb = false; pc.linger = PT20S; pc.npvo = false; pc.recovery = true; pc.version = 0; pc.wait_prim = true; pc.wait_prim_timeout = PT30S; pc.weight = 1; protonet.backend = asio; protonet.version = 0; repl.causal_read_timeout = PT90S; repl.commit_order = 3; repl.key_format = FLAT8; repl.max_ws_size = 2147483647; ;socket.checksum = 2; socket.recv_buf_size = 212992; SELECT COUNT(*) FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME LIKE 'wsrep_%' AND VARIABLE_NAME != 'wsrep_debug_sync_waiters'; diff --git a/mysql-test/suite/galera/r/galera_encrypt_tmp_files.result b/mysql-test/suite/galera/r/galera_encrypt_tmp_files.result new file mode 100644 index 000000000..63f6c281a --- /dev/null +++ b/mysql-test/suite/galera/r/galera_encrypt_tmp_files.result @@ -0,0 +1,35 @@ +SELECT VARIABLE_VALUE = 'Synced' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment'; +VARIABLE_VALUE = 'Synced' +1 +SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +VARIABLE_VALUE = 2 +1 +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) Engine=InnoDB; +INSERT INTO t1 VALUES (1); +SELECT VARIABLE_VALUE = 'Synced' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment'; +VARIABLE_VALUE = 'Synced' +1 +SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +VARIABLE_VALUE = 2 +1 +SELECT COUNT(*) = 1 FROM t1; +COUNT(*) = 1 +1 +DROP TABLE t1; +CREATE TABLE `t1` ( +`col1` int(11) NOT NULL, +`col2` varchar(64) NOT NULL DEFAULT '', +`col3` varchar(32) NOT NULL DEFAULT '0', +`col4` varchar(64) NOT NULL DEFAULT '', +`col5` tinyint(4) NOT NULL DEFAULT '0', +`col6` int(11) NOT NULL DEFAULT '0', +`col7` varchar(64) NOT NULL DEFAULT '', +`col8` tinyint(4) NOT NULL DEFAULT '0', +`col9` tinyint(4) NOT NULL DEFAULT '0', +`col10` text NOT NULL, +`col11` varchar(255) NOT NULL DEFAULT '', +`col12` tinyint(4) NOT NULL DEFAULT '1' +) ; +create table t2 (test int); +insert into t2 values (1); +drop table t1,t2; diff --git a/mysql-test/suite/galera/r/galera_gra_log.result b/mysql-test/suite/galera/r/galera_gra_log.result index 9f5cbdd75..a5b87c0ef 100644 --- a/mysql-test/suite/galera/r/galera_gra_log.result +++ b/mysql-test/suite/galera/r/galera_gra_log.result @@ -1,6 +1,7 @@ SET SESSION wsrep_on=OFF; CREATE TABLE t1 (f1 INTEGER); CREATE TABLE t1 (f1 INTEGER); +SET SESSION wsrep_on=ON; SELECT COUNT(*) = 0 FROM t1; COUNT(*) = 0 1 @@ -8,22 +9,13 @@ COUNT(*) = 0 /*!40019 SET @@session.max_insert_delayed_threads=0*/; /*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/; DELIMITER /*!*/; -# at 4 - server id 2 end_log_pos 120 Start: binlog v 4, server v 5.6.24-debug-log created 150804 11:37:14 at startup -# Warning: this binlog is either in use or was not closed properly. ROLLBACK/*!*/; -BINLOG ' -unnAVQ8CAAAAdAAAAHgAAAABAAQANS42LjI0LWRlYnVnLWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAC6ecBVEzgNAAgAEgAEBAQEEgAAXAAEGggAAAAICAgCAAAACgoKGRkAAKNu -Jfk= -'/*!*/; -# at 120 - server id 1 end_log_pos 91 Query thread_id= exec_time=0 error_code=0 +ROLLBACK/*!*/; use `test`/*!*/; SET TIMESTAMP=/*!*/; SET @@session.pseudo_thread_id=/*!*/; SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/; -SET @@session.sql_mode=1073741824/*!*/; +SET @@session.sql_mode=1342177280/*!*/; SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/; /*!\C latin1 *//*!*/; SET @@session.character_set_client=8,@@session.collation_connection=8,@@session.collation_server=8/*!*/; @@ -36,6 +28,5 @@ DELIMITER ; ROLLBACK /* added by mysqlbinlog */; /*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/; /*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/; -SET SESSION wsrep_on=ON; CALL mtr.add_suppression("Slave SQL: Error 'Table 't1' already exists' on query"); DROP TABLE t1; diff --git a/mysql-test/suite/galera/r/galera_gtid_slave.result b/mysql-test/suite/galera/r/galera_gtid_slave.result index 40f3f1c0d..58a9d3f59 100644 --- a/mysql-test/suite/galera/r/galera_gtid_slave.result +++ b/mysql-test/suite/galera/r/galera_gtid_slave.result @@ -19,8 +19,8 @@ SELECT @@global.gtid_binlog_state; @@global.gtid_binlog_state 1-1-4,2-2-2,2-3-3 DROP TABLE t1,t2; -reset master; STOP SLAVE; RESET SLAVE ALL; reset master; reset master; +reset master; diff --git a/mysql-test/suite/galera/r/galera_ist_mysqldump.result b/mysql-test/suite/galera/r/galera_ist_mysqldump.result index 788d60051..a7ce7c6c2 100644 --- a/mysql-test/suite/galera/r/galera_ist_mysqldump.result +++ b/mysql-test/suite/galera/r/galera_ist_mysqldump.result @@ -1,4 +1,6 @@ Setting SST method to mysqldump ... +call mtr.add_suppression("WSREP: wsrep_sst_method is set to 'mysqldump' yet mysqld bind_address is set to '127.0.0.1'"); +call mtr.add_suppression("Failed to load slave replication state from table mysql.gtid_slave_pos"); CREATE USER 'sst'; GRANT ALL PRIVILEGES ON *.* TO 'sst'; SET GLOBAL wsrep_sst_auth = 'sst:'; @@ -194,7 +196,7 @@ INSERT INTO t1 VALUES ('node2_committed_before'); INSERT INTO t1 VALUES ('node2_committed_before'); INSERT INTO t1 VALUES ('node2_committed_before'); COMMIT; -SET GLOBAL debug = 'd,sync.alter_opened_table'; +SET GLOBAL debug_dbug = 'd,sync.alter_opened_table'; ALTER TABLE t1 ADD COLUMN f2 INTEGER; SET wsrep_sync_wait = 0; Killing server ... @@ -273,6 +275,7 @@ COUNT(*) = 0 DROP TABLE t1; COMMIT; SET AUTOCOMMIT=ON; +SET GLOBAL debug_dbug = $debug_orig; CALL mtr.add_suppression("Slave SQL: Error 'The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement' on query"); DROP USER sst; CALL mtr.add_suppression("Slave SQL: Error 'The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement' on query"); diff --git a/mysql-test/suite/galera/r/galera_kill_nochanges.result b/mysql-test/suite/galera/r/galera_kill_nochanges.result index db3c75e28..cdcebdb4e 100644 --- a/mysql-test/suite/galera/r/galera_kill_nochanges.result +++ b/mysql-test/suite/galera/r/galera_kill_nochanges.result @@ -1,6 +1,8 @@ CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB; INSERT INTO t1 VALUES (1); Killing server ... +SET SESSION wsrep_sync_wait = 0; +SET SESSION wsrep_sync_wait = DEFAULT; SELECT COUNT(*) = 1 FROM t1; COUNT(*) = 1 1 diff --git a/mysql-test/suite/galera/r/galera_lock_table.result b/mysql-test/suite/galera/r/galera_lock_table.result index 16e9037a4..0d40ac165 100644 --- a/mysql-test/suite/galera/r/galera_lock_table.result +++ b/mysql-test/suite/galera/r/galera_lock_table.result @@ -1,5 +1,9 @@ CREATE TABLE t1 (id INT PRIMARY KEY) ENGINE=InnoDB; CREATE TABLE t2 (id INT PRIMARY KEY) ENGINE=InnoDB; +SELECT NAME FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME LIKE 'test/t%'; +NAME +test/t1 +test/t2 LOCK TABLE t1 READ; INSERT INTO t1 VALUES (1); INSERT INTO t2 VALUES (1); diff --git a/mysql-test/suite/galera/r/galera_mdev_15611.result b/mysql-test/suite/galera/r/galera_mdev_15611.result new file mode 100644 index 000000000..677ed9820 --- /dev/null +++ b/mysql-test/suite/galera/r/galera_mdev_15611.result @@ -0,0 +1,15 @@ +CREATE TABLE t1 ( +id int primary key +); +CREATE TABLE t2 ( +id int primary key , +f_id int DEFAULT NULL, FOREIGN KEY(f_id) REFERENCES t1 (id) +); +insert into t1 select 1; +#Running 200 insert in t2 table +select count(*) from t2; +count(*) +200 +delete from t2; +delete from t1; +drop table t2,t1; diff --git a/mysql-test/suite/galera/r/galera_parallel_simple.result b/mysql-test/suite/galera/r/galera_parallel_simple.result index 3b10815c6..0b19ef7da 100644 --- a/mysql-test/suite/galera/r/galera_parallel_simple.result +++ b/mysql-test/suite/galera/r/galera_parallel_simple.result @@ -1,6 +1,10 @@ CREATE TABLE t1 (id INT) ENGINE=InnoDB; CREATE TABLE t2 (id INT) ENGINE=InnoDB; SET GLOBAL wsrep_slave_threads = 2; +SELECT NAME FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME LIKE 'test/t%'; +NAME +test/t1 +test/t2 LOCK TABLE t1 WRITE; INSERT INTO t1 VALUES (1); INSERT INTO t2 VALUES (1); diff --git a/mysql-test/suite/galera/r/galera_schema_dirty_reads.result b/mysql-test/suite/galera/r/galera_schema_dirty_reads.result new file mode 100644 index 000000000..edf20da92 --- /dev/null +++ b/mysql-test/suite/galera/r/galera_schema_dirty_reads.result @@ -0,0 +1,13 @@ +USE information_schema; +SELECT * FROM SESSION_VARIABLES WHERE VARIABLE_NAME LIKE "wsrep_dirty_reads"; +VARIABLE_NAME VARIABLE_VALUE +WSREP_DIRTY_READS OFF +SET GLOBAL wsrep_reject_queries=ALL; +SELECT * FROM SESSION_VARIABLES WHERE VARIABLE_NAME LIKE "wsrep_dirty_reads"; +VARIABLE_NAME VARIABLE_VALUE +WSREP_DIRTY_READS OFF +SET GLOBAL wsrep_reject_queries=NONE; +SET SESSION wsrep_dirty_reads=TRUE; +SELECT * FROM SESSION_VARIABLES WHERE VARIABLE_NAME LIKE "wsrep_dirty_reads"; +VARIABLE_NAME VARIABLE_VALUE +WSREP_DIRTY_READS ON diff --git a/mysql-test/suite/galera/r/galera_sst_mariabackup,debug.rdiff b/mysql-test/suite/galera/r/galera_sst_mariabackup,debug.rdiff new file mode 100644 index 000000000..efedb1b46 --- /dev/null +++ b/mysql-test/suite/galera/r/galera_sst_mariabackup,debug.rdiff @@ -0,0 +1,103 @@ +--- galera_sst_mariabackup.reject ++++ galera_sst_mariabackup.result +@@ -260,3 +260,100 @@ + DROP TABLE t1; + COMMIT; + SET AUTOCOMMIT=ON; ++Performing State Transfer on a server that has been killed and restarted ++while a DDL was in progress on it ++CREATE TABLE t1 (f1 CHAR(255)) ENGINE=InnoDB; ++SET AUTOCOMMIT=OFF; ++START TRANSACTION; ++INSERT INTO t1 VALUES ('node1_committed_before'); ++INSERT INTO t1 VALUES ('node1_committed_before'); ++INSERT INTO t1 VALUES ('node1_committed_before'); ++INSERT INTO t1 VALUES ('node1_committed_before'); ++INSERT INTO t1 VALUES ('node1_committed_before'); ++START TRANSACTION; ++INSERT INTO t1 VALUES ('node2_committed_before'); ++INSERT INTO t1 VALUES ('node2_committed_before'); ++INSERT INTO t1 VALUES ('node2_committed_before'); ++INSERT INTO t1 VALUES ('node2_committed_before'); ++INSERT INTO t1 VALUES ('node2_committed_before'); ++COMMIT; ++SET GLOBAL debug_dbug = 'd,sync.alter_opened_table'; ++ALTER TABLE t1 ADD COLUMN f2 INTEGER; ++SET wsrep_sync_wait = 0; ++Killing server ... ++SET AUTOCOMMIT=OFF; ++START TRANSACTION; ++INSERT INTO t1 (f1) VALUES ('node1_committed_during'); ++INSERT INTO t1 (f1) VALUES ('node1_committed_during'); ++INSERT INTO t1 (f1) VALUES ('node1_committed_during'); ++INSERT INTO t1 (f1) VALUES ('node1_committed_during'); ++INSERT INTO t1 (f1) VALUES ('node1_committed_during'); ++COMMIT; ++START TRANSACTION; ++INSERT INTO t1 (f1) VALUES ('node1_to_be_committed_after'); ++INSERT INTO t1 (f1) VALUES ('node1_to_be_committed_after'); ++INSERT INTO t1 (f1) VALUES ('node1_to_be_committed_after'); ++INSERT INTO t1 (f1) VALUES ('node1_to_be_committed_after'); ++INSERT INTO t1 (f1) VALUES ('node1_to_be_committed_after'); ++SET AUTOCOMMIT=OFF; ++START TRANSACTION; ++INSERT INTO t1 (f1) VALUES ('node1_to_be_rollbacked_after'); ++INSERT INTO t1 (f1) VALUES ('node1_to_be_rollbacked_after'); ++INSERT INTO t1 (f1) VALUES ('node1_to_be_rollbacked_after'); ++INSERT INTO t1 (f1) VALUES ('node1_to_be_rollbacked_after'); ++INSERT INTO t1 (f1) VALUES ('node1_to_be_rollbacked_after'); ++Performing --wsrep-recover ... ++Starting server ... ++Using --wsrep-start-position when starting mysqld ... ++SET AUTOCOMMIT=OFF; ++START TRANSACTION; ++INSERT INTO t1 (f1) VALUES ('node2_committed_after'); ++INSERT INTO t1 (f1) VALUES ('node2_committed_after'); ++INSERT INTO t1 (f1) VALUES ('node2_committed_after'); ++INSERT INTO t1 (f1) VALUES ('node2_committed_after'); ++INSERT INTO t1 (f1) VALUES ('node2_committed_after'); ++COMMIT; ++INSERT INTO t1 (f1) VALUES ('node1_to_be_committed_after'); ++INSERT INTO t1 (f1) VALUES ('node1_to_be_committed_after'); ++INSERT INTO t1 (f1) VALUES ('node1_to_be_committed_after'); ++INSERT INTO t1 (f1) VALUES ('node1_to_be_committed_after'); ++INSERT INTO t1 (f1) VALUES ('node1_to_be_committed_after'); ++COMMIT; ++SET AUTOCOMMIT=OFF; ++START TRANSACTION; ++INSERT INTO t1 (f1) VALUES ('node1_committed_after'); ++INSERT INTO t1 (f1) VALUES ('node1_committed_after'); ++INSERT INTO t1 (f1) VALUES ('node1_committed_after'); ++INSERT INTO t1 (f1) VALUES ('node1_committed_after'); ++INSERT INTO t1 (f1) VALUES ('node1_committed_after'); ++COMMIT; ++INSERT INTO t1 (f1) VALUES ('node1_to_be_rollbacked_after'); ++INSERT INTO t1 (f1) VALUES ('node1_to_be_rollbacked_after'); ++INSERT INTO t1 (f1) VALUES ('node1_to_be_rollbacked_after'); ++INSERT INTO t1 (f1) VALUES ('node1_to_be_rollbacked_after'); ++INSERT INTO t1 (f1) VALUES ('node1_to_be_rollbacked_after'); ++ROLLBACK; ++SELECT COUNT(*) = 2 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 't1'; ++COUNT(*) = 2 ++1 ++SELECT COUNT(*) = 35 FROM t1; ++COUNT(*) = 35 ++1 ++SELECT COUNT(*) = 0 FROM (SELECT COUNT(*) AS c, f1 FROM t1 GROUP BY f1 HAVING c NOT IN (5, 10)) AS a1; ++COUNT(*) = 0 ++1 ++COMMIT; ++SET AUTOCOMMIT=ON; ++SELECT COUNT(*) = 2 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 't1'; ++COUNT(*) = 2 ++1 ++SELECT COUNT(*) = 35 FROM t1; ++COUNT(*) = 35 ++1 ++SELECT COUNT(*) = 0 FROM (SELECT COUNT(*) AS c, f1 FROM t1 GROUP BY f1 HAVING c NOT IN (5, 10)) AS a1; ++COUNT(*) = 0 ++1 ++DROP TABLE t1; ++COMMIT; ++SET AUTOCOMMIT=ON; ++SET GLOBAL debug_dbug = $debug_orig; diff --git a/mysql-test/suite/galera/r/galera_sst_mariabackup.result b/mysql-test/suite/galera/r/galera_sst_mariabackup.result new file mode 100644 index 000000000..cec0f21ee --- /dev/null +++ b/mysql-test/suite/galera/r/galera_sst_mariabackup.result @@ -0,0 +1,262 @@ +Performing State Transfer on a server that has been shut down cleanly and restarted +CREATE TABLE t1 (f1 CHAR(255)) ENGINE=InnoDB; +SET AUTOCOMMIT=OFF; +START TRANSACTION; +INSERT INTO t1 VALUES ('node1_committed_before'); +INSERT INTO t1 VALUES ('node1_committed_before'); +INSERT INTO t1 VALUES ('node1_committed_before'); +INSERT INTO t1 VALUES ('node1_committed_before'); +INSERT INTO t1 VALUES ('node1_committed_before'); +COMMIT; +SET AUTOCOMMIT=OFF; +START TRANSACTION; +INSERT INTO t1 VALUES ('node2_committed_before'); +INSERT INTO t1 VALUES ('node2_committed_before'); +INSERT INTO t1 VALUES ('node2_committed_before'); +INSERT INTO t1 VALUES ('node2_committed_before'); +INSERT INTO t1 VALUES ('node2_committed_before'); +COMMIT; +Shutting down server ... +SET AUTOCOMMIT=OFF; +START TRANSACTION; +INSERT INTO t1 VALUES ('node1_committed_during'); +INSERT INTO t1 VALUES ('node1_committed_during'); +INSERT INTO t1 VALUES ('node1_committed_during'); +INSERT INTO t1 VALUES ('node1_committed_during'); +INSERT INTO t1 VALUES ('node1_committed_during'); +COMMIT; +START TRANSACTION; +INSERT INTO t1 VALUES ('node1_to_be_committed_after'); +INSERT INTO t1 VALUES ('node1_to_be_committed_after'); +INSERT INTO t1 VALUES ('node1_to_be_committed_after'); +INSERT INTO t1 VALUES ('node1_to_be_committed_after'); +INSERT INTO t1 VALUES ('node1_to_be_committed_after'); +SET AUTOCOMMIT=OFF; +START TRANSACTION; +INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after'); +INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after'); +INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after'); +INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after'); +INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after'); +Starting server ... +SET AUTOCOMMIT=OFF; +START TRANSACTION; +INSERT INTO t1 VALUES ('node2_committed_after'); +INSERT INTO t1 VALUES ('node2_committed_after'); +INSERT INTO t1 VALUES ('node2_committed_after'); +INSERT INTO t1 VALUES ('node2_committed_after'); +INSERT INTO t1 VALUES ('node2_committed_after'); +COMMIT; +INSERT INTO t1 VALUES ('node1_to_be_committed_after'); +INSERT INTO t1 VALUES ('node1_to_be_committed_after'); +INSERT INTO t1 VALUES ('node1_to_be_committed_after'); +INSERT INTO t1 VALUES ('node1_to_be_committed_after'); +INSERT INTO t1 VALUES ('node1_to_be_committed_after'); +COMMIT; +SET AUTOCOMMIT=OFF; +START TRANSACTION; +INSERT INTO t1 VALUES ('node1_committed_after'); +INSERT INTO t1 VALUES ('node1_committed_after'); +INSERT INTO t1 VALUES ('node1_committed_after'); +INSERT INTO t1 VALUES ('node1_committed_after'); +INSERT INTO t1 VALUES ('node1_committed_after'); +COMMIT; +INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after'); +INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after'); +INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after'); +INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after'); +INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after'); +ROLLBACK; +SELECT COUNT(*) = 35 FROM t1; +COUNT(*) = 35 +1 +SELECT COUNT(*) = 0 FROM (SELECT COUNT(*) AS c, f1 FROM t1 GROUP BY f1 HAVING c NOT IN (5, 10)) AS a1; +COUNT(*) = 0 +1 +COMMIT; +SET AUTOCOMMIT=ON; +SELECT COUNT(*) = 35 FROM t1; +COUNT(*) = 35 +1 +SELECT COUNT(*) = 0 FROM (SELECT COUNT(*) AS c, f1 FROM t1 GROUP BY f1 HAVING c NOT IN (5, 10)) AS a1; +COUNT(*) = 0 +1 +DROP TABLE t1; +COMMIT; +SET AUTOCOMMIT=ON; +Performing State Transfer on a server that starts from a clean var directory +This is accomplished by shutting down node #2 and removing its var directory before restarting it +CREATE TABLE t1 (f1 CHAR(255)) ENGINE=InnoDB; +SET AUTOCOMMIT=OFF; +START TRANSACTION; +INSERT INTO t1 VALUES ('node1_committed_before'); +INSERT INTO t1 VALUES ('node1_committed_before'); +INSERT INTO t1 VALUES ('node1_committed_before'); +INSERT INTO t1 VALUES ('node1_committed_before'); +INSERT INTO t1 VALUES ('node1_committed_before'); +COMMIT; +SET AUTOCOMMIT=OFF; +START TRANSACTION; +INSERT INTO t1 VALUES ('node2_committed_before'); +INSERT INTO t1 VALUES ('node2_committed_before'); +INSERT INTO t1 VALUES ('node2_committed_before'); +INSERT INTO t1 VALUES ('node2_committed_before'); +INSERT INTO t1 VALUES ('node2_committed_before'); +COMMIT; +Shutting down server ... +Cleaning var directory ... +SET AUTOCOMMIT=OFF; +START TRANSACTION; +INSERT INTO t1 VALUES ('node1_committed_during'); +INSERT INTO t1 VALUES ('node1_committed_during'); +INSERT INTO t1 VALUES ('node1_committed_during'); +INSERT INTO t1 VALUES ('node1_committed_during'); +INSERT INTO t1 VALUES ('node1_committed_during'); +COMMIT; +START TRANSACTION; +INSERT INTO t1 VALUES ('node1_to_be_committed_after'); +INSERT INTO t1 VALUES ('node1_to_be_committed_after'); +INSERT INTO t1 VALUES ('node1_to_be_committed_after'); +INSERT INTO t1 VALUES ('node1_to_be_committed_after'); +INSERT INTO t1 VALUES ('node1_to_be_committed_after'); +SET AUTOCOMMIT=OFF; +START TRANSACTION; +INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after'); +INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after'); +INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after'); +INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after'); +INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after'); +Starting server ... +SET AUTOCOMMIT=OFF; +START TRANSACTION; +INSERT INTO t1 VALUES ('node2_committed_after'); +INSERT INTO t1 VALUES ('node2_committed_after'); +INSERT INTO t1 VALUES ('node2_committed_after'); +INSERT INTO t1 VALUES ('node2_committed_after'); +INSERT INTO t1 VALUES ('node2_committed_after'); +COMMIT; +INSERT INTO t1 VALUES ('node1_to_be_committed_after'); +INSERT INTO t1 VALUES ('node1_to_be_committed_after'); +INSERT INTO t1 VALUES ('node1_to_be_committed_after'); +INSERT INTO t1 VALUES ('node1_to_be_committed_after'); +INSERT INTO t1 VALUES ('node1_to_be_committed_after'); +COMMIT; +SET AUTOCOMMIT=OFF; +START TRANSACTION; +INSERT INTO t1 VALUES ('node1_committed_after'); +INSERT INTO t1 VALUES ('node1_committed_after'); +INSERT INTO t1 VALUES ('node1_committed_after'); +INSERT INTO t1 VALUES ('node1_committed_after'); +INSERT INTO t1 VALUES ('node1_committed_after'); +COMMIT; +INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after'); +INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after'); +INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after'); +INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after'); +INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after'); +ROLLBACK; +SELECT COUNT(*) = 35 FROM t1; +COUNT(*) = 35 +1 +SELECT COUNT(*) = 0 FROM (SELECT COUNT(*) AS c, f1 FROM t1 GROUP BY f1 HAVING c NOT IN (5, 10)) AS a1; +COUNT(*) = 0 +1 +COMMIT; +SET AUTOCOMMIT=ON; +SELECT COUNT(*) = 35 FROM t1; +COUNT(*) = 35 +1 +SELECT COUNT(*) = 0 FROM (SELECT COUNT(*) AS c, f1 FROM t1 GROUP BY f1 HAVING c NOT IN (5, 10)) AS a1; +COUNT(*) = 0 +1 +DROP TABLE t1; +COMMIT; +SET AUTOCOMMIT=ON; +Performing State Transfer on a server that has been killed and restarted +CREATE TABLE t1 (f1 CHAR(255)) ENGINE=InnoDB; +SET AUTOCOMMIT=OFF; +START TRANSACTION; +INSERT INTO t1 VALUES ('node1_committed_before'); +INSERT INTO t1 VALUES ('node1_committed_before'); +INSERT INTO t1 VALUES ('node1_committed_before'); +INSERT INTO t1 VALUES ('node1_committed_before'); +INSERT INTO t1 VALUES ('node1_committed_before'); +COMMIT; +SET AUTOCOMMIT=OFF; +START TRANSACTION; +INSERT INTO t1 VALUES ('node2_committed_before'); +INSERT INTO t1 VALUES ('node2_committed_before'); +INSERT INTO t1 VALUES ('node2_committed_before'); +INSERT INTO t1 VALUES ('node2_committed_before'); +INSERT INTO t1 VALUES ('node2_committed_before'); +COMMIT; +Killing server ... +SET AUTOCOMMIT=OFF; +START TRANSACTION; +INSERT INTO t1 VALUES ('node1_committed_during'); +INSERT INTO t1 VALUES ('node1_committed_during'); +INSERT INTO t1 VALUES ('node1_committed_during'); +INSERT INTO t1 VALUES ('node1_committed_during'); +INSERT INTO t1 VALUES ('node1_committed_during'); +COMMIT; +START TRANSACTION; +INSERT INTO t1 VALUES ('node1_to_be_committed_after'); +INSERT INTO t1 VALUES ('node1_to_be_committed_after'); +INSERT INTO t1 VALUES ('node1_to_be_committed_after'); +INSERT INTO t1 VALUES ('node1_to_be_committed_after'); +INSERT INTO t1 VALUES ('node1_to_be_committed_after'); +SET AUTOCOMMIT=OFF; +START TRANSACTION; +INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after'); +INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after'); +INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after'); +INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after'); +INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after'); +Performing --wsrep-recover ... +Starting server ... +Using --wsrep-start-position when starting mysqld ... +SET AUTOCOMMIT=OFF; +START TRANSACTION; +INSERT INTO t1 VALUES ('node2_committed_after'); +INSERT INTO t1 VALUES ('node2_committed_after'); +INSERT INTO t1 VALUES ('node2_committed_after'); +INSERT INTO t1 VALUES ('node2_committed_after'); +INSERT INTO t1 VALUES ('node2_committed_after'); +COMMIT; +INSERT INTO t1 VALUES ('node1_to_be_committed_after'); +INSERT INTO t1 VALUES ('node1_to_be_committed_after'); +INSERT INTO t1 VALUES ('node1_to_be_committed_after'); +INSERT INTO t1 VALUES ('node1_to_be_committed_after'); +INSERT INTO t1 VALUES ('node1_to_be_committed_after'); +COMMIT; +SET AUTOCOMMIT=OFF; +START TRANSACTION; +INSERT INTO t1 VALUES ('node1_committed_after'); +INSERT INTO t1 VALUES ('node1_committed_after'); +INSERT INTO t1 VALUES ('node1_committed_after'); +INSERT INTO t1 VALUES ('node1_committed_after'); +INSERT INTO t1 VALUES ('node1_committed_after'); +COMMIT; +INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after'); +INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after'); +INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after'); +INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after'); +INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after'); +ROLLBACK; +SELECT COUNT(*) = 35 FROM t1; +COUNT(*) = 35 +1 +SELECT COUNT(*) = 0 FROM (SELECT COUNT(*) AS c, f1 FROM t1 GROUP BY f1 HAVING c NOT IN (5, 10)) AS a1; +COUNT(*) = 0 +1 +COMMIT; +SET AUTOCOMMIT=ON; +SELECT COUNT(*) = 35 FROM t1; +COUNT(*) = 35 +1 +SELECT COUNT(*) = 0 FROM (SELECT COUNT(*) AS c, f1 FROM t1 GROUP BY f1 HAVING c NOT IN (5, 10)) AS a1; +COUNT(*) = 0 +1 +DROP TABLE t1; +COMMIT; +SET AUTOCOMMIT=ON; diff --git a/mysql-test/suite/galera/r/galera_sst_mysqldump,debug.rdiff b/mysql-test/suite/galera/r/galera_sst_mysqldump,debug.rdiff new file mode 100644 index 000000000..a7ed54af8 --- /dev/null +++ b/mysql-test/suite/galera/r/galera_sst_mysqldump,debug.rdiff @@ -0,0 +1,106 @@ +--- galera_sst_mysqldump.reject ++++ galera_sst_mysqldump.result +@@ -354,6 +354,103 @@ + DROP TABLE t1; + COMMIT; + SET AUTOCOMMIT=ON; ++Performing State Transfer on a server that has been killed and restarted ++while a DDL was in progress on it ++CREATE TABLE t1 (f1 CHAR(255)) ENGINE=InnoDB; ++SET AUTOCOMMIT=OFF; ++START TRANSACTION; ++INSERT INTO t1 VALUES ('node1_committed_before'); ++INSERT INTO t1 VALUES ('node1_committed_before'); ++INSERT INTO t1 VALUES ('node1_committed_before'); ++INSERT INTO t1 VALUES ('node1_committed_before'); ++INSERT INTO t1 VALUES ('node1_committed_before'); ++START TRANSACTION; ++INSERT INTO t1 VALUES ('node2_committed_before'); ++INSERT INTO t1 VALUES ('node2_committed_before'); ++INSERT INTO t1 VALUES ('node2_committed_before'); ++INSERT INTO t1 VALUES ('node2_committed_before'); ++INSERT INTO t1 VALUES ('node2_committed_before'); ++COMMIT; ++SET GLOBAL debug_dbug = 'd,sync.alter_opened_table'; ++ALTER TABLE t1 ADD COLUMN f2 INTEGER; ++SET wsrep_sync_wait = 0; ++Killing server ... ++SET AUTOCOMMIT=OFF; ++START TRANSACTION; ++INSERT INTO t1 (f1) VALUES ('node1_committed_during'); ++INSERT INTO t1 (f1) VALUES ('node1_committed_during'); ++INSERT INTO t1 (f1) VALUES ('node1_committed_during'); ++INSERT INTO t1 (f1) VALUES ('node1_committed_during'); ++INSERT INTO t1 (f1) VALUES ('node1_committed_during'); ++COMMIT; ++START TRANSACTION; ++INSERT INTO t1 (f1) VALUES ('node1_to_be_committed_after'); ++INSERT INTO t1 (f1) VALUES ('node1_to_be_committed_after'); ++INSERT INTO t1 (f1) VALUES ('node1_to_be_committed_after'); ++INSERT INTO t1 (f1) VALUES ('node1_to_be_committed_after'); ++INSERT INTO t1 (f1) VALUES ('node1_to_be_committed_after'); ++SET AUTOCOMMIT=OFF; ++START TRANSACTION; ++INSERT INTO t1 (f1) VALUES ('node1_to_be_rollbacked_after'); ++INSERT INTO t1 (f1) VALUES ('node1_to_be_rollbacked_after'); ++INSERT INTO t1 (f1) VALUES ('node1_to_be_rollbacked_after'); ++INSERT INTO t1 (f1) VALUES ('node1_to_be_rollbacked_after'); ++INSERT INTO t1 (f1) VALUES ('node1_to_be_rollbacked_after'); ++Performing --wsrep-recover ... ++Starting server ... ++Using --wsrep-start-position when starting mysqld ... ++SET AUTOCOMMIT=OFF; ++START TRANSACTION; ++INSERT INTO t1 (f1) VALUES ('node2_committed_after'); ++INSERT INTO t1 (f1) VALUES ('node2_committed_after'); ++INSERT INTO t1 (f1) VALUES ('node2_committed_after'); ++INSERT INTO t1 (f1) VALUES ('node2_committed_after'); ++INSERT INTO t1 (f1) VALUES ('node2_committed_after'); ++COMMIT; ++INSERT INTO t1 (f1) VALUES ('node1_to_be_committed_after'); ++INSERT INTO t1 (f1) VALUES ('node1_to_be_committed_after'); ++INSERT INTO t1 (f1) VALUES ('node1_to_be_committed_after'); ++INSERT INTO t1 (f1) VALUES ('node1_to_be_committed_after'); ++INSERT INTO t1 (f1) VALUES ('node1_to_be_committed_after'); ++COMMIT; ++SET AUTOCOMMIT=OFF; ++START TRANSACTION; ++INSERT INTO t1 (f1) VALUES ('node1_committed_after'); ++INSERT INTO t1 (f1) VALUES ('node1_committed_after'); ++INSERT INTO t1 (f1) VALUES ('node1_committed_after'); ++INSERT INTO t1 (f1) VALUES ('node1_committed_after'); ++INSERT INTO t1 (f1) VALUES ('node1_committed_after'); ++COMMIT; ++INSERT INTO t1 (f1) VALUES ('node1_to_be_rollbacked_after'); ++INSERT INTO t1 (f1) VALUES ('node1_to_be_rollbacked_after'); ++INSERT INTO t1 (f1) VALUES ('node1_to_be_rollbacked_after'); ++INSERT INTO t1 (f1) VALUES ('node1_to_be_rollbacked_after'); ++INSERT INTO t1 (f1) VALUES ('node1_to_be_rollbacked_after'); ++ROLLBACK; ++SELECT COUNT(*) = 2 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 't1'; ++COUNT(*) = 2 ++1 ++SELECT COUNT(*) = 35 FROM t1; ++COUNT(*) = 35 ++1 ++SELECT COUNT(*) = 0 FROM (SELECT COUNT(*) AS c, f1 FROM t1 GROUP BY f1 HAVING c NOT IN (5, 10)) AS a1; ++COUNT(*) = 0 ++1 ++COMMIT; ++SET AUTOCOMMIT=ON; ++SELECT COUNT(*) = 2 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 't1'; ++COUNT(*) = 2 ++1 ++SELECT COUNT(*) = 35 FROM t1; ++COUNT(*) = 35 ++1 ++SELECT COUNT(*) = 0 FROM (SELECT COUNT(*) AS c, f1 FROM t1 GROUP BY f1 HAVING c NOT IN (5, 10)) AS a1; ++COUNT(*) = 0 ++1 ++DROP TABLE t1; ++COMMIT; ++SET AUTOCOMMIT=ON; ++SET GLOBAL debug_dbug = $debug_orig; + CALL mtr.add_suppression("Slave SQL: Error 'The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement' on query"); + DROP USER sst; + CALL mtr.add_suppression("Slave SQL: Error 'The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement' on query"); diff --git a/mysql-test/suite/galera/r/galera_sst_mysqldump.result b/mysql-test/suite/galera/r/galera_sst_mysqldump.result index 5c0d9a45d..2369c1d6d 100644 --- a/mysql-test/suite/galera/r/galera_sst_mysqldump.result +++ b/mysql-test/suite/galera/r/galera_sst_mysqldump.result @@ -1,4 +1,6 @@ Setting SST method to mysqldump ... +call mtr.add_suppression("WSREP: wsrep_sst_method is set to 'mysqldump' yet mysqld bind_address is set to '127.0.0.1'"); +call mtr.add_suppression("Failed to load slave replication state from table mysql.gtid_slave_pos"); CREATE USER 'sst'; GRANT ALL PRIVILEGES ON *.* TO 'sst'; SET GLOBAL wsrep_sst_auth = 'sst:'; @@ -352,102 +354,6 @@ COUNT(*) = 0 DROP TABLE t1; COMMIT; SET AUTOCOMMIT=ON; -Performing State Transfer on a server that has been killed and restarted -while a DDL was in progress on it -CREATE TABLE t1 (f1 CHAR(255)) ENGINE=InnoDB; -SET AUTOCOMMIT=OFF; -START TRANSACTION; -INSERT INTO t1 VALUES ('node1_committed_before'); -INSERT INTO t1 VALUES ('node1_committed_before'); -INSERT INTO t1 VALUES ('node1_committed_before'); -INSERT INTO t1 VALUES ('node1_committed_before'); -INSERT INTO t1 VALUES ('node1_committed_before'); -START TRANSACTION; -INSERT INTO t1 VALUES ('node2_committed_before'); -INSERT INTO t1 VALUES ('node2_committed_before'); -INSERT INTO t1 VALUES ('node2_committed_before'); -INSERT INTO t1 VALUES ('node2_committed_before'); -INSERT INTO t1 VALUES ('node2_committed_before'); -COMMIT; -SET GLOBAL debug = 'd,sync.alter_opened_table'; -ALTER TABLE t1 ADD COLUMN f2 INTEGER; -SET wsrep_sync_wait = 0; -Killing server ... -SET AUTOCOMMIT=OFF; -START TRANSACTION; -INSERT INTO t1 (f1) VALUES ('node1_committed_during'); -INSERT INTO t1 (f1) VALUES ('node1_committed_during'); -INSERT INTO t1 (f1) VALUES ('node1_committed_during'); -INSERT INTO t1 (f1) VALUES ('node1_committed_during'); -INSERT INTO t1 (f1) VALUES ('node1_committed_during'); -COMMIT; -START TRANSACTION; -INSERT INTO t1 (f1) VALUES ('node1_to_be_committed_after'); -INSERT INTO t1 (f1) VALUES ('node1_to_be_committed_after'); -INSERT INTO t1 (f1) VALUES ('node1_to_be_committed_after'); -INSERT INTO t1 (f1) VALUES ('node1_to_be_committed_after'); -INSERT INTO t1 (f1) VALUES ('node1_to_be_committed_after'); -SET AUTOCOMMIT=OFF; -START TRANSACTION; -INSERT INTO t1 (f1) VALUES ('node1_to_be_rollbacked_after'); -INSERT INTO t1 (f1) VALUES ('node1_to_be_rollbacked_after'); -INSERT INTO t1 (f1) VALUES ('node1_to_be_rollbacked_after'); -INSERT INTO t1 (f1) VALUES ('node1_to_be_rollbacked_after'); -INSERT INTO t1 (f1) VALUES ('node1_to_be_rollbacked_after'); -Performing --wsrep-recover ... -Starting server ... -Using --wsrep-start-position when starting mysqld ... -SET AUTOCOMMIT=OFF; -START TRANSACTION; -INSERT INTO t1 (f1) VALUES ('node2_committed_after'); -INSERT INTO t1 (f1) VALUES ('node2_committed_after'); -INSERT INTO t1 (f1) VALUES ('node2_committed_after'); -INSERT INTO t1 (f1) VALUES ('node2_committed_after'); -INSERT INTO t1 (f1) VALUES ('node2_committed_after'); -COMMIT; -INSERT INTO t1 (f1) VALUES ('node1_to_be_committed_after'); -INSERT INTO t1 (f1) VALUES ('node1_to_be_committed_after'); -INSERT INTO t1 (f1) VALUES ('node1_to_be_committed_after'); -INSERT INTO t1 (f1) VALUES ('node1_to_be_committed_after'); -INSERT INTO t1 (f1) VALUES ('node1_to_be_committed_after'); -COMMIT; -SET AUTOCOMMIT=OFF; -START TRANSACTION; -INSERT INTO t1 (f1) VALUES ('node1_committed_after'); -INSERT INTO t1 (f1) VALUES ('node1_committed_after'); -INSERT INTO t1 (f1) VALUES ('node1_committed_after'); -INSERT INTO t1 (f1) VALUES ('node1_committed_after'); -INSERT INTO t1 (f1) VALUES ('node1_committed_after'); -COMMIT; -INSERT INTO t1 (f1) VALUES ('node1_to_be_rollbacked_after'); -INSERT INTO t1 (f1) VALUES ('node1_to_be_rollbacked_after'); -INSERT INTO t1 (f1) VALUES ('node1_to_be_rollbacked_after'); -INSERT INTO t1 (f1) VALUES ('node1_to_be_rollbacked_after'); -INSERT INTO t1 (f1) VALUES ('node1_to_be_rollbacked_after'); -ROLLBACK; -SELECT COUNT(*) = 2 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 't1'; -COUNT(*) = 2 -1 -SELECT COUNT(*) = 35 FROM t1; -COUNT(*) = 35 -1 -SELECT COUNT(*) = 0 FROM (SELECT COUNT(*) AS c, f1 FROM t1 GROUP BY f1 HAVING c NOT IN (5, 10)) AS a1; -COUNT(*) = 0 -1 -COMMIT; -SET AUTOCOMMIT=ON; -SELECT COUNT(*) = 2 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 't1'; -COUNT(*) = 2 -1 -SELECT COUNT(*) = 35 FROM t1; -COUNT(*) = 35 -1 -SELECT COUNT(*) = 0 FROM (SELECT COUNT(*) AS c, f1 FROM t1 GROUP BY f1 HAVING c NOT IN (5, 10)) AS a1; -COUNT(*) = 0 -1 -DROP TABLE t1; -COMMIT; -SET AUTOCOMMIT=ON; CALL mtr.add_suppression("Slave SQL: Error 'The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement' on query"); DROP USER sst; CALL mtr.add_suppression("Slave SQL: Error 'The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement' on query"); diff --git a/mysql-test/suite/galera/r/galera_sst_mysqldump_with_key.result b/mysql-test/suite/galera/r/galera_sst_mysqldump_with_key.result index 227e1c154..074481afc 100644 --- a/mysql-test/suite/galera/r/galera_sst_mysqldump_with_key.result +++ b/mysql-test/suite/galera/r/galera_sst_mysqldump_with_key.result @@ -1,4 +1,6 @@ Setting SST method to mysqldump ... +call mtr.add_suppression("WSREP: wsrep_sst_method is set to 'mysqldump' yet mysqld bind_address is set to '127.0.0.1'"); +call mtr.add_suppression("Failed to load slave replication state from table mysql.gtid_slave_pos"); CREATE USER 'sst'; GRANT ALL PRIVILEGES ON *.* TO 'sst'; SET GLOBAL wsrep_sst_auth = 'sst:'; @@ -105,5 +107,3 @@ CALL mtr.add_suppression("Can't open and lock privilege tables"); CALL mtr.add_suppression("Info table is not ready to be used"); CALL mtr.add_suppression("Native table .* has the wrong structure"); DROP USER sslsst; -SET GLOBAL general_log = ON; -SET GLOBAL slow_query_log = ON; diff --git a/mysql-test/suite/galera/r/galera_sst_rsync,debug.rdiff b/mysql-test/suite/galera/r/galera_sst_rsync,debug.rdiff new file mode 100644 index 000000000..323a0a92a --- /dev/null +++ b/mysql-test/suite/galera/r/galera_sst_rsync,debug.rdiff @@ -0,0 +1,103 @@ +--- galera_sst_rsync.reject ++++ galera_sst_rsync.result +@@ -260,3 +260,100 @@ + DROP TABLE t1; + COMMIT; + SET AUTOCOMMIT=ON; ++Performing State Transfer on a server that has been killed and restarted ++while a DDL was in progress on it ++CREATE TABLE t1 (f1 CHAR(255)) ENGINE=InnoDB; ++SET AUTOCOMMIT=OFF; ++START TRANSACTION; ++INSERT INTO t1 VALUES ('node1_committed_before'); ++INSERT INTO t1 VALUES ('node1_committed_before'); ++INSERT INTO t1 VALUES ('node1_committed_before'); ++INSERT INTO t1 VALUES ('node1_committed_before'); ++INSERT INTO t1 VALUES ('node1_committed_before'); ++START TRANSACTION; ++INSERT INTO t1 VALUES ('node2_committed_before'); ++INSERT INTO t1 VALUES ('node2_committed_before'); ++INSERT INTO t1 VALUES ('node2_committed_before'); ++INSERT INTO t1 VALUES ('node2_committed_before'); ++INSERT INTO t1 VALUES ('node2_committed_before'); ++COMMIT; ++SET GLOBAL debug_dbug = 'd,sync.alter_opened_table'; ++ALTER TABLE t1 ADD COLUMN f2 INTEGER; ++SET wsrep_sync_wait = 0; ++Killing server ... ++SET AUTOCOMMIT=OFF; ++START TRANSACTION; ++INSERT INTO t1 (f1) VALUES ('node1_committed_during'); ++INSERT INTO t1 (f1) VALUES ('node1_committed_during'); ++INSERT INTO t1 (f1) VALUES ('node1_committed_during'); ++INSERT INTO t1 (f1) VALUES ('node1_committed_during'); ++INSERT INTO t1 (f1) VALUES ('node1_committed_during'); ++COMMIT; ++START TRANSACTION; ++INSERT INTO t1 (f1) VALUES ('node1_to_be_committed_after'); ++INSERT INTO t1 (f1) VALUES ('node1_to_be_committed_after'); ++INSERT INTO t1 (f1) VALUES ('node1_to_be_committed_after'); ++INSERT INTO t1 (f1) VALUES ('node1_to_be_committed_after'); ++INSERT INTO t1 (f1) VALUES ('node1_to_be_committed_after'); ++SET AUTOCOMMIT=OFF; ++START TRANSACTION; ++INSERT INTO t1 (f1) VALUES ('node1_to_be_rollbacked_after'); ++INSERT INTO t1 (f1) VALUES ('node1_to_be_rollbacked_after'); ++INSERT INTO t1 (f1) VALUES ('node1_to_be_rollbacked_after'); ++INSERT INTO t1 (f1) VALUES ('node1_to_be_rollbacked_after'); ++INSERT INTO t1 (f1) VALUES ('node1_to_be_rollbacked_after'); ++Performing --wsrep-recover ... ++Starting server ... ++Using --wsrep-start-position when starting mysqld ... ++SET AUTOCOMMIT=OFF; ++START TRANSACTION; ++INSERT INTO t1 (f1) VALUES ('node2_committed_after'); ++INSERT INTO t1 (f1) VALUES ('node2_committed_after'); ++INSERT INTO t1 (f1) VALUES ('node2_committed_after'); ++INSERT INTO t1 (f1) VALUES ('node2_committed_after'); ++INSERT INTO t1 (f1) VALUES ('node2_committed_after'); ++COMMIT; ++INSERT INTO t1 (f1) VALUES ('node1_to_be_committed_after'); ++INSERT INTO t1 (f1) VALUES ('node1_to_be_committed_after'); ++INSERT INTO t1 (f1) VALUES ('node1_to_be_committed_after'); ++INSERT INTO t1 (f1) VALUES ('node1_to_be_committed_after'); ++INSERT INTO t1 (f1) VALUES ('node1_to_be_committed_after'); ++COMMIT; ++SET AUTOCOMMIT=OFF; ++START TRANSACTION; ++INSERT INTO t1 (f1) VALUES ('node1_committed_after'); ++INSERT INTO t1 (f1) VALUES ('node1_committed_after'); ++INSERT INTO t1 (f1) VALUES ('node1_committed_after'); ++INSERT INTO t1 (f1) VALUES ('node1_committed_after'); ++INSERT INTO t1 (f1) VALUES ('node1_committed_after'); ++COMMIT; ++INSERT INTO t1 (f1) VALUES ('node1_to_be_rollbacked_after'); ++INSERT INTO t1 (f1) VALUES ('node1_to_be_rollbacked_after'); ++INSERT INTO t1 (f1) VALUES ('node1_to_be_rollbacked_after'); ++INSERT INTO t1 (f1) VALUES ('node1_to_be_rollbacked_after'); ++INSERT INTO t1 (f1) VALUES ('node1_to_be_rollbacked_after'); ++ROLLBACK; ++SELECT COUNT(*) = 2 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 't1'; ++COUNT(*) = 2 ++1 ++SELECT COUNT(*) = 35 FROM t1; ++COUNT(*) = 35 ++1 ++SELECT COUNT(*) = 0 FROM (SELECT COUNT(*) AS c, f1 FROM t1 GROUP BY f1 HAVING c NOT IN (5, 10)) AS a1; ++COUNT(*) = 0 ++1 ++COMMIT; ++SET AUTOCOMMIT=ON; ++SELECT COUNT(*) = 2 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 't1'; ++COUNT(*) = 2 ++1 ++SELECT COUNT(*) = 35 FROM t1; ++COUNT(*) = 35 ++1 ++SELECT COUNT(*) = 0 FROM (SELECT COUNT(*) AS c, f1 FROM t1 GROUP BY f1 HAVING c NOT IN (5, 10)) AS a1; ++COUNT(*) = 0 ++1 ++DROP TABLE t1; ++COMMIT; ++SET AUTOCOMMIT=ON; ++SET GLOBAL debug_dbug = $debug_orig; diff --git a/mysql-test/suite/galera/r/galera_sst_rsync.result b/mysql-test/suite/galera/r/galera_sst_rsync.result index df2d9190a..cec0f21ee 100644 --- a/mysql-test/suite/galera/r/galera_sst_rsync.result +++ b/mysql-test/suite/galera/r/galera_sst_rsync.result @@ -260,100 +260,3 @@ COUNT(*) = 0 DROP TABLE t1; COMMIT; SET AUTOCOMMIT=ON; -Performing State Transfer on a server that has been killed and restarted -while a DDL was in progress on it -CREATE TABLE t1 (f1 CHAR(255)) ENGINE=InnoDB; -SET AUTOCOMMIT=OFF; -START TRANSACTION; -INSERT INTO t1 VALUES ('node1_committed_before'); -INSERT INTO t1 VALUES ('node1_committed_before'); -INSERT INTO t1 VALUES ('node1_committed_before'); -INSERT INTO t1 VALUES ('node1_committed_before'); -INSERT INTO t1 VALUES ('node1_committed_before'); -START TRANSACTION; -INSERT INTO t1 VALUES ('node2_committed_before'); -INSERT INTO t1 VALUES ('node2_committed_before'); -INSERT INTO t1 VALUES ('node2_committed_before'); -INSERT INTO t1 VALUES ('node2_committed_before'); -INSERT INTO t1 VALUES ('node2_committed_before'); -COMMIT; -SET GLOBAL debug_dbug = 'd,sync.alter_opened_table'; -ALTER TABLE t1 ADD COLUMN f2 INTEGER; -SET wsrep_sync_wait = 0; -Killing server ... -SET AUTOCOMMIT=OFF; -START TRANSACTION; -INSERT INTO t1 (f1) VALUES ('node1_committed_during'); -INSERT INTO t1 (f1) VALUES ('node1_committed_during'); -INSERT INTO t1 (f1) VALUES ('node1_committed_during'); -INSERT INTO t1 (f1) VALUES ('node1_committed_during'); -INSERT INTO t1 (f1) VALUES ('node1_committed_during'); -COMMIT; -START TRANSACTION; -INSERT INTO t1 (f1) VALUES ('node1_to_be_committed_after'); -INSERT INTO t1 (f1) VALUES ('node1_to_be_committed_after'); -INSERT INTO t1 (f1) VALUES ('node1_to_be_committed_after'); -INSERT INTO t1 (f1) VALUES ('node1_to_be_committed_after'); -INSERT INTO t1 (f1) VALUES ('node1_to_be_committed_after'); -SET AUTOCOMMIT=OFF; -START TRANSACTION; -INSERT INTO t1 (f1) VALUES ('node1_to_be_rollbacked_after'); -INSERT INTO t1 (f1) VALUES ('node1_to_be_rollbacked_after'); -INSERT INTO t1 (f1) VALUES ('node1_to_be_rollbacked_after'); -INSERT INTO t1 (f1) VALUES ('node1_to_be_rollbacked_after'); -INSERT INTO t1 (f1) VALUES ('node1_to_be_rollbacked_after'); -Performing --wsrep-recover ... -Starting server ... -Using --wsrep-start-position when starting mysqld ... -SET AUTOCOMMIT=OFF; -START TRANSACTION; -INSERT INTO t1 (f1) VALUES ('node2_committed_after'); -INSERT INTO t1 (f1) VALUES ('node2_committed_after'); -INSERT INTO t1 (f1) VALUES ('node2_committed_after'); -INSERT INTO t1 (f1) VALUES ('node2_committed_after'); -INSERT INTO t1 (f1) VALUES ('node2_committed_after'); -COMMIT; -INSERT INTO t1 (f1) VALUES ('node1_to_be_committed_after'); -INSERT INTO t1 (f1) VALUES ('node1_to_be_committed_after'); -INSERT INTO t1 (f1) VALUES ('node1_to_be_committed_after'); -INSERT INTO t1 (f1) VALUES ('node1_to_be_committed_after'); -INSERT INTO t1 (f1) VALUES ('node1_to_be_committed_after'); -COMMIT; -SET AUTOCOMMIT=OFF; -START TRANSACTION; -INSERT INTO t1 (f1) VALUES ('node1_committed_after'); -INSERT INTO t1 (f1) VALUES ('node1_committed_after'); -INSERT INTO t1 (f1) VALUES ('node1_committed_after'); -INSERT INTO t1 (f1) VALUES ('node1_committed_after'); -INSERT INTO t1 (f1) VALUES ('node1_committed_after'); -COMMIT; -INSERT INTO t1 (f1) VALUES ('node1_to_be_rollbacked_after'); -INSERT INTO t1 (f1) VALUES ('node1_to_be_rollbacked_after'); -INSERT INTO t1 (f1) VALUES ('node1_to_be_rollbacked_after'); -INSERT INTO t1 (f1) VALUES ('node1_to_be_rollbacked_after'); -INSERT INTO t1 (f1) VALUES ('node1_to_be_rollbacked_after'); -ROLLBACK; -SELECT COUNT(*) = 2 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 't1'; -COUNT(*) = 2 -1 -SELECT COUNT(*) = 35 FROM t1; -COUNT(*) = 35 -1 -SELECT COUNT(*) = 0 FROM (SELECT COUNT(*) AS c, f1 FROM t1 GROUP BY f1 HAVING c NOT IN (5, 10)) AS a1; -COUNT(*) = 0 -1 -COMMIT; -SET AUTOCOMMIT=ON; -SELECT COUNT(*) = 2 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 't1'; -COUNT(*) = 2 -1 -SELECT COUNT(*) = 35 FROM t1; -COUNT(*) = 35 -1 -SELECT COUNT(*) = 0 FROM (SELECT COUNT(*) AS c, f1 FROM t1 GROUP BY f1 HAVING c NOT IN (5, 10)) AS a1; -COUNT(*) = 0 -1 -DROP TABLE t1; -COMMIT; -SET AUTOCOMMIT=ON; -SET GLOBAL debug_dbug = $debug_orig; diff --git a/mysql-test/suite/galera/r/galera_sst_xtrabackup-v2,debug.rdiff b/mysql-test/suite/galera/r/galera_sst_xtrabackup-v2,debug.rdiff new file mode 100644 index 000000000..2692482f4 --- /dev/null +++ b/mysql-test/suite/galera/r/galera_sst_xtrabackup-v2,debug.rdiff @@ -0,0 +1,103 @@ +--- galera_sst_xtrabackup-v2.reject ++++ galera_sst_xtrabackup-v2.result +@@ -260,3 +260,100 @@ + DROP TABLE t1; + COMMIT; + SET AUTOCOMMIT=ON; ++Performing State Transfer on a server that has been killed and restarted ++while a DDL was in progress on it ++CREATE TABLE t1 (f1 CHAR(255)) ENGINE=InnoDB; ++SET AUTOCOMMIT=OFF; ++START TRANSACTION; ++INSERT INTO t1 VALUES ('node1_committed_before'); ++INSERT INTO t1 VALUES ('node1_committed_before'); ++INSERT INTO t1 VALUES ('node1_committed_before'); ++INSERT INTO t1 VALUES ('node1_committed_before'); ++INSERT INTO t1 VALUES ('node1_committed_before'); ++START TRANSACTION; ++INSERT INTO t1 VALUES ('node2_committed_before'); ++INSERT INTO t1 VALUES ('node2_committed_before'); ++INSERT INTO t1 VALUES ('node2_committed_before'); ++INSERT INTO t1 VALUES ('node2_committed_before'); ++INSERT INTO t1 VALUES ('node2_committed_before'); ++COMMIT; ++SET GLOBAL debug_dbug = 'd,sync.alter_opened_table'; ++ALTER TABLE t1 ADD COLUMN f2 INTEGER; ++SET wsrep_sync_wait = 0; ++Killing server ... ++SET AUTOCOMMIT=OFF; ++START TRANSACTION; ++INSERT INTO t1 (f1) VALUES ('node1_committed_during'); ++INSERT INTO t1 (f1) VALUES ('node1_committed_during'); ++INSERT INTO t1 (f1) VALUES ('node1_committed_during'); ++INSERT INTO t1 (f1) VALUES ('node1_committed_during'); ++INSERT INTO t1 (f1) VALUES ('node1_committed_during'); ++COMMIT; ++START TRANSACTION; ++INSERT INTO t1 (f1) VALUES ('node1_to_be_committed_after'); ++INSERT INTO t1 (f1) VALUES ('node1_to_be_committed_after'); ++INSERT INTO t1 (f1) VALUES ('node1_to_be_committed_after'); ++INSERT INTO t1 (f1) VALUES ('node1_to_be_committed_after'); ++INSERT INTO t1 (f1) VALUES ('node1_to_be_committed_after'); ++SET AUTOCOMMIT=OFF; ++START TRANSACTION; ++INSERT INTO t1 (f1) VALUES ('node1_to_be_rollbacked_after'); ++INSERT INTO t1 (f1) VALUES ('node1_to_be_rollbacked_after'); ++INSERT INTO t1 (f1) VALUES ('node1_to_be_rollbacked_after'); ++INSERT INTO t1 (f1) VALUES ('node1_to_be_rollbacked_after'); ++INSERT INTO t1 (f1) VALUES ('node1_to_be_rollbacked_after'); ++Performing --wsrep-recover ... ++Starting server ... ++Using --wsrep-start-position when starting mysqld ... ++SET AUTOCOMMIT=OFF; ++START TRANSACTION; ++INSERT INTO t1 (f1) VALUES ('node2_committed_after'); ++INSERT INTO t1 (f1) VALUES ('node2_committed_after'); ++INSERT INTO t1 (f1) VALUES ('node2_committed_after'); ++INSERT INTO t1 (f1) VALUES ('node2_committed_after'); ++INSERT INTO t1 (f1) VALUES ('node2_committed_after'); ++COMMIT; ++INSERT INTO t1 (f1) VALUES ('node1_to_be_committed_after'); ++INSERT INTO t1 (f1) VALUES ('node1_to_be_committed_after'); ++INSERT INTO t1 (f1) VALUES ('node1_to_be_committed_after'); ++INSERT INTO t1 (f1) VALUES ('node1_to_be_committed_after'); ++INSERT INTO t1 (f1) VALUES ('node1_to_be_committed_after'); ++COMMIT; ++SET AUTOCOMMIT=OFF; ++START TRANSACTION; ++INSERT INTO t1 (f1) VALUES ('node1_committed_after'); ++INSERT INTO t1 (f1) VALUES ('node1_committed_after'); ++INSERT INTO t1 (f1) VALUES ('node1_committed_after'); ++INSERT INTO t1 (f1) VALUES ('node1_committed_after'); ++INSERT INTO t1 (f1) VALUES ('node1_committed_after'); ++COMMIT; ++INSERT INTO t1 (f1) VALUES ('node1_to_be_rollbacked_after'); ++INSERT INTO t1 (f1) VALUES ('node1_to_be_rollbacked_after'); ++INSERT INTO t1 (f1) VALUES ('node1_to_be_rollbacked_after'); ++INSERT INTO t1 (f1) VALUES ('node1_to_be_rollbacked_after'); ++INSERT INTO t1 (f1) VALUES ('node1_to_be_rollbacked_after'); ++ROLLBACK; ++SELECT COUNT(*) = 2 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 't1'; ++COUNT(*) = 2 ++1 ++SELECT COUNT(*) = 35 FROM t1; ++COUNT(*) = 35 ++1 ++SELECT COUNT(*) = 0 FROM (SELECT COUNT(*) AS c, f1 FROM t1 GROUP BY f1 HAVING c NOT IN (5, 10)) AS a1; ++COUNT(*) = 0 ++1 ++COMMIT; ++SET AUTOCOMMIT=ON; ++SELECT COUNT(*) = 2 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 't1'; ++COUNT(*) = 2 ++1 ++SELECT COUNT(*) = 35 FROM t1; ++COUNT(*) = 35 ++1 ++SELECT COUNT(*) = 0 FROM (SELECT COUNT(*) AS c, f1 FROM t1 GROUP BY f1 HAVING c NOT IN (5, 10)) AS a1; ++COUNT(*) = 0 ++1 ++DROP TABLE t1; ++COMMIT; ++SET AUTOCOMMIT=ON; ++SET GLOBAL debug_dbug = $debug_orig; diff --git a/mysql-test/suite/galera/r/galera_sst_xtrabackup-v2.result b/mysql-test/suite/galera/r/galera_sst_xtrabackup-v2.result index df2d9190a..cec0f21ee 100644 --- a/mysql-test/suite/galera/r/galera_sst_xtrabackup-v2.result +++ b/mysql-test/suite/galera/r/galera_sst_xtrabackup-v2.result @@ -260,100 +260,3 @@ COUNT(*) = 0 DROP TABLE t1; COMMIT; SET AUTOCOMMIT=ON; -Performing State Transfer on a server that has been killed and restarted -while a DDL was in progress on it -CREATE TABLE t1 (f1 CHAR(255)) ENGINE=InnoDB; -SET AUTOCOMMIT=OFF; -START TRANSACTION; -INSERT INTO t1 VALUES ('node1_committed_before'); -INSERT INTO t1 VALUES ('node1_committed_before'); -INSERT INTO t1 VALUES ('node1_committed_before'); -INSERT INTO t1 VALUES ('node1_committed_before'); -INSERT INTO t1 VALUES ('node1_committed_before'); -START TRANSACTION; -INSERT INTO t1 VALUES ('node2_committed_before'); -INSERT INTO t1 VALUES ('node2_committed_before'); -INSERT INTO t1 VALUES ('node2_committed_before'); -INSERT INTO t1 VALUES ('node2_committed_before'); -INSERT INTO t1 VALUES ('node2_committed_before'); -COMMIT; -SET GLOBAL debug_dbug = 'd,sync.alter_opened_table'; -ALTER TABLE t1 ADD COLUMN f2 INTEGER; -SET wsrep_sync_wait = 0; -Killing server ... -SET AUTOCOMMIT=OFF; -START TRANSACTION; -INSERT INTO t1 (f1) VALUES ('node1_committed_during'); -INSERT INTO t1 (f1) VALUES ('node1_committed_during'); -INSERT INTO t1 (f1) VALUES ('node1_committed_during'); -INSERT INTO t1 (f1) VALUES ('node1_committed_during'); -INSERT INTO t1 (f1) VALUES ('node1_committed_during'); -COMMIT; -START TRANSACTION; -INSERT INTO t1 (f1) VALUES ('node1_to_be_committed_after'); -INSERT INTO t1 (f1) VALUES ('node1_to_be_committed_after'); -INSERT INTO t1 (f1) VALUES ('node1_to_be_committed_after'); -INSERT INTO t1 (f1) VALUES ('node1_to_be_committed_after'); -INSERT INTO t1 (f1) VALUES ('node1_to_be_committed_after'); -SET AUTOCOMMIT=OFF; -START TRANSACTION; -INSERT INTO t1 (f1) VALUES ('node1_to_be_rollbacked_after'); -INSERT INTO t1 (f1) VALUES ('node1_to_be_rollbacked_after'); -INSERT INTO t1 (f1) VALUES ('node1_to_be_rollbacked_after'); -INSERT INTO t1 (f1) VALUES ('node1_to_be_rollbacked_after'); -INSERT INTO t1 (f1) VALUES ('node1_to_be_rollbacked_after'); -Performing --wsrep-recover ... -Starting server ... -Using --wsrep-start-position when starting mysqld ... -SET AUTOCOMMIT=OFF; -START TRANSACTION; -INSERT INTO t1 (f1) VALUES ('node2_committed_after'); -INSERT INTO t1 (f1) VALUES ('node2_committed_after'); -INSERT INTO t1 (f1) VALUES ('node2_committed_after'); -INSERT INTO t1 (f1) VALUES ('node2_committed_after'); -INSERT INTO t1 (f1) VALUES ('node2_committed_after'); -COMMIT; -INSERT INTO t1 (f1) VALUES ('node1_to_be_committed_after'); -INSERT INTO t1 (f1) VALUES ('node1_to_be_committed_after'); -INSERT INTO t1 (f1) VALUES ('node1_to_be_committed_after'); -INSERT INTO t1 (f1) VALUES ('node1_to_be_committed_after'); -INSERT INTO t1 (f1) VALUES ('node1_to_be_committed_after'); -COMMIT; -SET AUTOCOMMIT=OFF; -START TRANSACTION; -INSERT INTO t1 (f1) VALUES ('node1_committed_after'); -INSERT INTO t1 (f1) VALUES ('node1_committed_after'); -INSERT INTO t1 (f1) VALUES ('node1_committed_after'); -INSERT INTO t1 (f1) VALUES ('node1_committed_after'); -INSERT INTO t1 (f1) VALUES ('node1_committed_after'); -COMMIT; -INSERT INTO t1 (f1) VALUES ('node1_to_be_rollbacked_after'); -INSERT INTO t1 (f1) VALUES ('node1_to_be_rollbacked_after'); -INSERT INTO t1 (f1) VALUES ('node1_to_be_rollbacked_after'); -INSERT INTO t1 (f1) VALUES ('node1_to_be_rollbacked_after'); -INSERT INTO t1 (f1) VALUES ('node1_to_be_rollbacked_after'); -ROLLBACK; -SELECT COUNT(*) = 2 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 't1'; -COUNT(*) = 2 -1 -SELECT COUNT(*) = 35 FROM t1; -COUNT(*) = 35 -1 -SELECT COUNT(*) = 0 FROM (SELECT COUNT(*) AS c, f1 FROM t1 GROUP BY f1 HAVING c NOT IN (5, 10)) AS a1; -COUNT(*) = 0 -1 -COMMIT; -SET AUTOCOMMIT=ON; -SELECT COUNT(*) = 2 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 't1'; -COUNT(*) = 2 -1 -SELECT COUNT(*) = 35 FROM t1; -COUNT(*) = 35 -1 -SELECT COUNT(*) = 0 FROM (SELECT COUNT(*) AS c, f1 FROM t1 GROUP BY f1 HAVING c NOT IN (5, 10)) AS a1; -COUNT(*) = 0 -1 -DROP TABLE t1; -COMMIT; -SET AUTOCOMMIT=ON; -SET GLOBAL debug_dbug = $debug_orig; diff --git a/mysql-test/suite/galera/r/galera_suspend_slave.result b/mysql-test/suite/galera/r/galera_suspend_slave.result index 357a0d4f7..ebddb4c44 100644 --- a/mysql-test/suite/galera/r/galera_suspend_slave.result +++ b/mysql-test/suite/galera/r/galera_suspend_slave.result @@ -1,11 +1,11 @@ CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB; Suspending node_2 ... +SET SESSION wsrep_sync_wait = 0; INSERT INTO t1 VALUES (1); Got one of the listed errors Resuming node_2 ... -SET SESSION wsrep_sync_wait = 1; INSERT INTO t1 VALUES (1); -SET SESSION wsrep_sync_wait = 1; +SET SESSION wsrep_sync_wait = 0; SELECT COUNT(*) = 1 FROM t1; COUNT(*) = 1 1 diff --git a/mysql-test/suite/galera/r/galera_toi_ddl_fk_insert.result b/mysql-test/suite/galera/r/galera_toi_ddl_fk_insert.result index 81781fbea..1726bb644 100644 --- a/mysql-test/suite/galera/r/galera_toi_ddl_fk_insert.result +++ b/mysql-test/suite/galera/r/galera_toi_ddl_fk_insert.result @@ -9,7 +9,7 @@ CREATE TABLE child ( id INT PRIMARY KEY AUTO_INCREMENT, parent_id INT ) ENGINE=InnoDB; -INSERT INTO parent VALUES (DEFAULT, 0); +INSERT INTO parent VALUES (1, 0); INSERT INTO child (parent_id) SELECT 1 FROM ten AS a1, ten AS a2, ten AS a3, ten AS a4;; INSERT INTO parent (f2) SELECT 1 FROM ten AS a1, ten AS a2, ten AS a3, ten AS a4;; INSERT INTO parent (f2) SELECT 2 FROM ten AS a1, ten AS a2, ten AS a3, ten AS a4;; diff --git a/mysql-test/suite/galera/r/galera_var_auto_inc_control_on.result b/mysql-test/suite/galera/r/galera_var_auto_inc_control_on.result index c1bb06597..b9b00cfe1 100644 --- a/mysql-test/suite/galera/r/galera_var_auto_inc_control_on.result +++ b/mysql-test/suite/galera/r/galera_var_auto_inc_control_on.result @@ -2,16 +2,14 @@ CREATE TABLE t1 (f1 INTEGER AUTO_INCREMENT PRIMARY KEY, node VARCHAR(10)) ENGINE SELECT @@auto_increment_increment = (SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'); @@auto_increment_increment = (SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size') 1 -SELECT @@global.auto_increment_offset = (SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_index') + 1; -@@global.auto_increment_offset = (SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_index') + 1 +auto_increment_offset_differ 1 INSERT INTO t1 VALUES (DEFAULT, 'node1');; INSERT INTO t1 VALUES (DEFAULT, 'node2');; SELECT @@auto_increment_increment = (SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'); @@auto_increment_increment = (SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size') 1 -SELECT @@global.auto_increment_offset = (SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_index') + 1; -@@global.auto_increment_offset = (SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_index') + 1 +auto_increment_offset_differ 1 INSERT INTO t1 VALUES (DEFAULT, 'node2'), (DEFAULT, 'node2'), (DEFAULT, 'node2'), (DEFAULT, 'node2'), (DEFAULT, 'node2'), (DEFAULT, 'node2'), (DEFAULT, 'node2'), (DEFAULT, 'node2'), (DEFAULT, 'node2'), (DEFAULT, 'node2');; INSERT INTO t1 VALUES (DEFAULT, 'node1'), (DEFAULT, 'node1'), (DEFAULT, 'node1'), (DEFAULT, 'node1'), (DEFAULT, 'node1'), (DEFAULT, 'node1'), (DEFAULT, 'node1'), (DEFAULT, 'node1'), (DEFAULT, 'node1'), (DEFAULT, 'node1');; diff --git a/mysql-test/suite/galera/r/galera_var_cluster_address.result b/mysql-test/suite/galera/r/galera_var_cluster_address.result index 7c56e22ec..8245cdf60 100644 --- a/mysql-test/suite/galera/r/galera_var_cluster_address.result +++ b/mysql-test/suite/galera/r/galera_var_cluster_address.result @@ -1,7 +1,8 @@ SET GLOBAL wsrep_cluster_address = 'foo://'; SET SESSION wsrep_sync_wait=0; SELECT COUNT(*) > 0 FROM INFORMATION_SCHEMA.GLOBAL_STATUS; -ERROR 08S01: WSREP has not yet prepared node for application use +COUNT(*) > 0 +1 SHOW STATUS LIKE 'wsrep_ready'; Variable_name Value wsrep_ready OFF diff --git a/mysql-test/suite/galera/r/galera_var_dirty_reads.result b/mysql-test/suite/galera/r/galera_var_dirty_reads.result index f141b332b..5a108ddfc 100644 --- a/mysql-test/suite/galera/r/galera_var_dirty_reads.result +++ b/mysql-test/suite/galera/r/galera_var_dirty_reads.result @@ -33,11 +33,12 @@ SELECT 1; 1 1 USE information_schema; -ERROR 08S01: WSREP has not yet prepared node for application use SELECT * FROM information_schema.session_variables WHERE variable_name LIKE "wsrep_dirty_reads"; -ERROR 08S01: WSREP has not yet prepared node for application use +VARIABLE_NAME VARIABLE_VALUE +WSREP_DIRTY_READS OFF SELECT COUNT(*) >= 10 FROM performance_schema.events_statements_history; -ERROR 08S01: WSREP has not yet prepared node for application use +COUNT(*) >= 10 +1 USE test; SELECT * FROM t1; i diff --git a/mysql-test/suite/galera/r/galera_var_node_address.result b/mysql-test/suite/galera/r/galera_var_node_address.result index cf36e964f..a9c900d8b 100644 --- a/mysql-test/suite/galera/r/galera_var_node_address.result +++ b/mysql-test/suite/galera/r/galera_var_node_address.result @@ -1,5 +1,6 @@ call mtr.add_suppression("WSREP: Stray state UUID msg: .* current group state WAIT_STATE_UUID .*"); call mtr.add_suppression("WSREP: Protocol violation. JOIN message sender .* is not in state transfer (.*). Message ignored."); +call mtr.add_suppression("WSREP: Sending JOIN failed: -[0-9]+ (Transport endpoint is not connected). Will retry in new primary component."); SELECT VARIABLE_VALUE = 4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; VARIABLE_VALUE = 4 1 diff --git a/mysql-test/suite/galera/r/galera_var_reject_queries.result b/mysql-test/suite/galera/r/galera_var_reject_queries.result new file mode 100644 index 000000000..5958e6ae9 --- /dev/null +++ b/mysql-test/suite/galera/r/galera_var_reject_queries.result @@ -0,0 +1,21 @@ +CREATE TABLE t1 (f1 INTEGER); +SET SESSION wsrep_reject_queries = ALL; +ERROR HY000: Variable 'wsrep_reject_queries' is a GLOBAL variable and should be set with SET GLOBAL +SET GLOBAL wsrep_reject_queries = ALL; +SELECT * FROM t1; +ERROR 08S01: WSREP has not yet prepared node for application use +SET GLOBAL wsrep_reject_queries = ALL_KILL; +ERROR HY000: Lost connection to MySQL server during query +SELECT * FROM t1; +Got one of the listed errors +SELECT * FROM t1; +ERROR 08S01: WSREP has not yet prepared node for application use +SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +VARIABLE_VALUE = 2 +1 +INSERT INTO t1 VALUES (1); +SET GLOBAL wsrep_reject_queries = NONE; +SELECT COUNT(*) = 1 FROM t1; +COUNT(*) = 1 +1 +DROP TABLE t1; diff --git a/mysql-test/suite/galera/r/galera_var_retry_autocommit.result b/mysql-test/suite/galera/r/galera_var_retry_autocommit.result index f4d17ad9a..22a3105a5 100644 --- a/mysql-test/suite/galera/r/galera_var_retry_autocommit.result +++ b/mysql-test/suite/galera/r/galera_var_retry_autocommit.result @@ -1,32 +1,54 @@ -CREATE TABLE t1 (f1 INTEGER PRIMARY KEY, f2 INTEGER) ENGINE=InnoDB; -CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW SET NEW.f2 = SLEEP(5); +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB; SET SESSION wsrep_retry_autocommit = 0; -INSERT INTO t1 (f1) VALUES (1),(2);; +SET DEBUG_SYNC = 'wsrep_before_replication SIGNAL before_rep WAIT_FOR continue'; +INSERT INTO t1 (f1) VALUES (2); +SET DEBUG_SYNC = 'now WAIT_FOR before_rep'; TRUNCATE TABLE t1; ERROR 40001: Deadlock found when trying to get lock; try restarting transaction +SELECT COUNT(*) = 0 FROM t1; +COUNT(*) = 0 +1 +SET DEBUG_SYNC = 'RESET'; +DROP TABLE t1; +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB; SET SESSION wsrep_retry_autocommit = 1; -INSERT INTO t1 (f1) VALUES (3),(4);; -TRUNCATE TABLE t1; -SELECT * FROM test.t1; -f1 f2 -3 0 -4 0 -CREATE PROCEDURE repeated_truncate () -BEGIN -DECLARE i INT; -DECLARE CONTINUE HANDLER FOR SQLEXCEPTION BEGIN END; -SET i = 0; -WHILE i <= 1000 DO +SET DEBUG_SYNC = 'wsrep_before_replication SIGNAL before_rep WAIT_FOR continue'; +INSERT INTO t1 (f1) VALUES (2); +SET DEBUG_SYNC = 'now WAIT_FOR before_rep'; TRUNCATE TABLE t1; -SET i = i + 1; -END WHILE; -END| -CALL repeated_truncate(); +SELECT COUNT(*) = 1 FROM t1; +COUNT(*) = 1 +1 +SET DEBUG_SYNC = 'RESET'; +DROP TABLE t1; +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB; SET SESSION wsrep_retry_autocommit = 1; -INSERT INTO t1 (f1) VALUES (5),(6); +SET GLOBAL debug_dbug = '+d,sync.wsrep_retry_autocommit'; +SET DEBUG_SYNC = 'wsrep_before_replication SIGNAL before_rep WAIT_FOR continue EXECUTE 2'; +INSERT INTO t1 VALUES (2);; +SET DEBUG_SYNC = 'now WAIT_FOR before_rep'; +TRUNCATE TABLE t1; +SET DEBUG_SYNC = 'now WAIT_FOR wsrep_retry_autocommit_reached'; +SELECT COUNT(*) = 0 FROM t1; +COUNT(*) = 0 +1 +SET DEBUG_SYNC = 'now SIGNAL wsrep_retry_autocommit_continue WAIT_FOR before_rep'; +TRUNCATE TABLE t1; +SELECT COUNT(*) = 0 FROM t1; +COUNT(*) = 0 +1 ERROR 40001: Deadlock found when trying to get lock; try restarting transaction -SET SESSION wsrep_retry_autocommit = 1024; -INSERT INTO t1 (f1) VALUES (7),(8);; -include/diff_servers.inc [servers=1 2] +SET DEBUG_SYNC = 'RESET'; +SET GLOBAL debug_dbug = NULL; +DROP TABLE t1; +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB; +SET SESSION wsrep_retry_autocommit = 64; +SET GLOBAL debug_dbug = '+d,sync.wsrep_retry_autocommit'; +SET DEBUG_SYNC = 'wsrep_before_replication SIGNAL before_rep WAIT_FOR continue EXECUTE 64'; +INSERT INTO t1 VALUES (2); +SELECT COUNT(*) = 1 FROM t1; +COUNT(*) = 1 +1 +SET DEBUG_SYNC = 'RESET'; +SET GLOBAL debug_dbug = NULL; DROP TABLE t1; -DROP PROCEDURE repeated_truncate; diff --git a/mysql-test/suite/galera/r/galera_var_slave_threads.result b/mysql-test/suite/galera/r/galera_var_slave_threads.result index 2340d25d1..70f3b8ee2 100644 --- a/mysql-test/suite/galera/r/galera_var_slave_threads.result +++ b/mysql-test/suite/galera/r/galera_var_slave_threads.result @@ -1,6 +1,6 @@ -CALL mtr.add_suppression("WSREP: Refusing exit for the last slave thread."); CREATE TABLE t1 (f1 INT PRIMARY KEY) Engine=InnoDB; CREATE TABLE t2 (f1 INT AUTO_INCREMENT PRIMARY KEY) Engine=InnoDB; +CALL mtr.add_suppression("WSREP: Refusing exit for the last slave thread."); SET GLOBAL wsrep_slave_threads = 0; Warnings: Warning 1292 Truncated incorrect wsrep_slave_threads value: '0' @@ -22,9 +22,6 @@ INSERT INTO t1 VALUES (1); SELECT COUNT(*) = 1 FROM t1; COUNT(*) = 1 1 -SELECT COUNT(*) = @@wsrep_slave_threads + 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'system user'; -COUNT(*) = @@wsrep_slave_threads + 1 -1 SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'system user' AND STATE LIKE '%wsrep aborter%'; COUNT(*) = 1 1 @@ -96,9 +93,6 @@ INSERT INTO t2 VALUES (DEFAULT); SELECT COUNT(*) = 64 FROM t2; COUNT(*) = 64 1 -SELECT COUNT(*) = @@wsrep_slave_threads + 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'system user'; -COUNT(*) = @@wsrep_slave_threads + 1 -1 SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'system user' AND STATE LIKE '%wsrep aborter%'; COUNT(*) = 1 1 @@ -111,5 +105,13 @@ DROP TABLE t2; CREATE TABLE t1 (i INT AUTO_INCREMENT PRIMARY KEY) ENGINE=INNODB; SET GLOBAL wsrep_slave_threads = 4; SET GLOBAL wsrep_slave_threads = 1; +INSERT INTO t1 VALUES (DEFAULT); +INSERT INTO t1 VALUES (DEFAULT); +INSERT INTO t1 VALUES (DEFAULT); DROP TABLE t1; +SELECT NAME FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME LIKE 'test/t%'; +NAME +SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'system user' AND STATE LIKE '%wsrep aborter%'; +COUNT(*) = 1 +1 # End of tests diff --git a/mysql-test/suite/galera/r/galera_wsrep_desync_wsrep_on.result b/mysql-test/suite/galera/r/galera_wsrep_desync_wsrep_on.result index 06fc27ae7..5bde48748 100644 --- a/mysql-test/suite/galera/r/galera_wsrep_desync_wsrep_on.result +++ b/mysql-test/suite/galera/r/galera_wsrep_desync_wsrep_on.result @@ -2,6 +2,9 @@ CREATE TABLE ten (f1 INTEGER); INSERT INTO ten VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9); CREATE TABLE t1 (f1 INTEGER) Engine=InnoDB; INSERT INTO t1 (f1) SELECT 000000 + (10000 * a1.f1) + (1000 * a2.f1) + (100 * a3.f1) + (10 * a4.f1) + a5.f1 FROM ten AS a1, ten AS a2, ten AS a3, ten AS a4, ten AS a5; +SELECT COUNT(*) = 100000 FROM t1; +COUNT(*) = 100000 +1 SET GLOBAL wsrep_desync = TRUE; SET SESSION wsrep_on = FALSE; ALTER TABLE t1 ADD PRIMARY KEY (f1); diff --git a/mysql-test/suite/galera/r/have_wsrep_replicate_myisam.require b/mysql-test/suite/galera/r/have_wsrep_replicate_myisam.require new file mode 100644 index 000000000..c55610fd0 --- /dev/null +++ b/mysql-test/suite/galera/r/have_wsrep_replicate_myisam.require @@ -0,0 +1,2 @@ +Variable_name Value +wsrep_replicate_myisam ON diff --git a/mysql-test/suite/galera/r/lp1376747-2.result b/mysql-test/suite/galera/r/lp1376747-2.result index 3b8aee61e..0c91e10ac 100644 --- a/mysql-test/suite/galera/r/lp1376747-2.result +++ b/mysql-test/suite/galera/r/lp1376747-2.result @@ -1,5 +1,8 @@ CREATE TABLE t1 (id INT PRIMARY KEY) ENGINE=InnoDB; INSERT INTO t1 VALUES (1); +SELECT NAME FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME LIKE 'test/t%'; +NAME +test/t1 FLUSH TABLES t1 FOR EXPORT; ALTER TABLE t1 ADD COLUMN f2 INTEGER; INSERT INTO t1 VALUES (2,3); diff --git a/mysql-test/suite/galera/r/lp1376747.result b/mysql-test/suite/galera/r/lp1376747.result index 4617d5952..ec6c4a6e6 100644 --- a/mysql-test/suite/galera/r/lp1376747.result +++ b/mysql-test/suite/galera/r/lp1376747.result @@ -1,5 +1,8 @@ CREATE TABLE t1 (id INT PRIMARY KEY) ENGINE=InnoDB; INSERT INTO t1 VALUES (1); +SELECT NAME FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME LIKE 'test/t%'; +NAME +test/t1 FLUSH TABLES t1 WITH READ LOCK; ALTER TABLE t1 ADD COLUMN f2 INTEGER; INSERT INTO t1 VALUES (2,3); diff --git a/mysql-test/suite/galera/r/mysql-wsrep#33.result b/mysql-test/suite/galera/r/mysql-wsrep#33.result index fc647a200..3e8cfdb42 100644 --- a/mysql-test/suite/galera/r/mysql-wsrep#33.result +++ b/mysql-test/suite/galera/r/mysql-wsrep#33.result @@ -1,4 +1,6 @@ Setting SST method to mysqldump ... +call mtr.add_suppression("WSREP: wsrep_sst_method is set to 'mysqldump' yet mysqld bind_address is set to '127.0.0.1'"); +call mtr.add_suppression("Failed to load slave replication state from table mysql.gtid_slave_pos"); CREATE USER 'sst'; GRANT ALL PRIVILEGES ON *.* TO 'sst'; SET GLOBAL wsrep_sst_auth = 'sst:'; @@ -100,5 +102,4 @@ CALL mtr.add_suppression("Can't open and lock time zone table"); CALL mtr.add_suppression("Can't open and lock privilege tables"); CALL mtr.add_suppression("Info table is not ready to be used"); CALL mtr.add_suppression("Native table .* has the wrong structure"); -SET GLOBAL general_log = ON; -SET GLOBAL slow_query_log = ON; +Restarting server ... diff --git a/mysql-test/suite/galera/r/mysql-wsrep#90.result b/mysql-test/suite/galera/r/mysql-wsrep#90.result index da57b9d00..7ecaff770 100644 --- a/mysql-test/suite/galera/r/mysql-wsrep#90.result +++ b/mysql-test/suite/galera/r/mysql-wsrep#90.result @@ -12,6 +12,7 @@ SELECT COUNT(*) = 2 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 't1'; COUNT(*) = 2 1 DROP TABLE t1; +SET DEBUG_SYNC = 'RESET'; CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) Engine=InnoDB; SET GLOBAL wsrep_OSU_method = "TOI"; SET DEBUG_SYNC = 'alter_table_before_open_tables WAIT_FOR continue'; @@ -29,3 +30,4 @@ COUNT(*) = 2 INSERT INTO t1 VALUES (3,4); DROP TABLE t1; SET GLOBAL WSREP_OSU_METHOD = TOI; +SET DEBUG_SYNC = 'RESET'; diff --git a/mysql-test/suite/galera/r/pxc-421.result b/mysql-test/suite/galera/r/pxc-421.result index f5c0fabcd..1822201f3 100644 --- a/mysql-test/suite/galera/r/pxc-421.result +++ b/mysql-test/suite/galera/r/pxc-421.result @@ -6,7 +6,6 @@ set GLOBAL wsrep_slave_threads=16; SET GLOBAL wsrep_provider='none'; INSERT INTO t1 VALUES (2); INSERT INTO t1 VALUES (3); -set SESSION wsrep_sync_wait=0; INSERT INTO t1 VALUES (4); set GLOBAL wsrep_slave_threads=5; SELECT COUNT(*) = 5 FROM t1; @@ -26,7 +25,6 @@ SET GLOBAL wsrep_slave_threads = 1; SELECT COUNT(*) FROM t1; COUNT(*) 16 -SET GLOBAL auto_increment_offset = 2; SELECT COUNT(*) FROM t1; COUNT(*) 15 @@ -35,4 +33,3 @@ Variable_name Value wsrep_slave_threads 12 SET GLOBAL wsrep_slave_threads = 1; DROP TABLE t1; -SET GLOBAL auto_increment_offset = 1; diff --git a/mysql-test/suite/galera/suite.pm b/mysql-test/suite/galera/suite.pm index 361743f12..5cdb751a4 100644 --- a/mysql-test/suite/galera/suite.pm +++ b/mysql-test/suite/galera/suite.pm @@ -1,4 +1,4 @@ -package My::Suite::GALERA; +package My::Suite::Galera; use File::Basename; use My::Find; @@ -25,6 +25,10 @@ return "No scritps" unless $cpath; my ($epath) = grep { -f "$_/my_print_defaults"; } "$::bindir/extra", $::path_client_bindir; return "No my_print_defaults" unless $epath; +my ($bpath) = grep { -f "$_/mariabackup"; } "$::bindir/extra/mariabackup", $::path_client_bindir; + +sub which($) { return `sh -c "command -v $_[0]"` } + push @::global_suppressions, ( qr(WSREP: wsrep_sst_receive_address is set to '127.0.0.1), @@ -77,10 +81,30 @@ push @::global_suppressions, qr|WSREP: JOIN message from member .* in non-primary configuration. Ignored.|, ); - $ENV{PATH}="$epath:$ENV{PATH}"; $ENV{PATH}="$spath:$ENV{PATH}" unless $epath eq $spath; $ENV{PATH}="$cpath:$ENV{PATH}" unless $cpath eq $spath; +$ENV{PATH}="$bpath:$ENV{PATH}" unless $bpath eq $spath; -bless { }; +if (which(socat)) { + $ENV{MTR_GALERA_TFMT}='socat'; +} elsif (which(nc)) { + $ENV{MTR_GALERA_TFMT}='nc'; +} + +sub skip_combinations { + my %skip = (); + $skip{'include/have_xtrabackup.inc'} = 'Need innobackupex' + unless which(innobackupex); + $skip{'include/have_xtrabackup.inc'} = 'Need socat or nc' + unless $ENV{MTR_GALERA_TFMT}; + $skip{'include/have_mariabackup.inc'} = 'Need mariabackup' + unless which(mariabackup); + $skip{'include/have_mariabackup.inc'} = 'Need ss' + unless which(ss); + $skip{'include/have_mariabackup.inc'} = 'Need socat or nc' + unless $ENV{MTR_GALERA_TFMT}; + %skip; +} +bless { }; diff --git a/mysql-test/suite/galera/t/MW-284.test b/mysql-test/suite/galera/t/MW-284.test index 7add82f12..5e17baa1b 100644 --- a/mysql-test/suite/galera/t/MW-284.test +++ b/mysql-test/suite/galera/t/MW-284.test @@ -24,7 +24,6 @@ SET global wsrep_sync_wait=0; --connection node_3 START SLAVE; ---sleep 1 --let $slave_param= Slave_IO_Running --let $slave_param_value= Connecting --source include/wait_for_slave_param.inc @@ -38,6 +37,7 @@ SET GLOBAL wsrep_provider_options='gmcast.isolate=0'; --source include/wait_for_slave_to_start.inc --connection node_1 +--source include/galera_wait_ready.inc INSERT INTO t1 VALUES (1); --connection node_3 @@ -61,3 +61,10 @@ RESET SLAVE ALL; CALL mtr.add_suppression('failed registering on master'); CALL mtr.add_suppression('You need to use --log-bin to make --binlog-format work'); + +--connection node_1 +RESET MASTER; +CALL mtr.add_suppression('WSREP: Last Applied Action message in non-primary configuration from member'); + +--connection node_2 +CALL mtr.add_suppression('WSREP: Last Applied Action message in non-primary configuration from member'); \ No newline at end of file diff --git a/mysql-test/suite/galera/t/MW-286.test b/mysql-test/suite/galera/t/MW-286.test index 08deb317f..1b2e322f0 100644 --- a/mysql-test/suite/galera/t/MW-286.test +++ b/mysql-test/suite/galera/t/MW-286.test @@ -25,7 +25,6 @@ SET wsrep_on = FALSE; --error ER_QUERY_INTERRUPTED ALTER TABLE t1 ADD PRIMARY KEY (f1); -SET SESSION wsrep_sync_wait = 0; SET wsrep_on = TRUE; SET GLOBAL wsrep_desync = FALSE; diff --git a/mysql-test/suite/galera/t/MW-329.test b/mysql-test/suite/galera/t/MW-329.test index d9f9a7874..bf0458321 100644 --- a/mysql-test/suite/galera/t/MW-329.test +++ b/mysql-test/suite/galera/t/MW-329.test @@ -83,3 +83,5 @@ DROP TABLE t1; # Due to MW-330, Multiple "conflict state 3 after post commit" warnings if table is dropped while SP is running CALL mtr.add_suppression("conflict state 3 after post commit"); + +set global innodb_status_output=Default; \ No newline at end of file diff --git a/mysql-test/suite/galera/t/MW-336.test b/mysql-test/suite/galera/t/MW-336.test index 79d8951a8..9572489eb 100644 --- a/mysql-test/suite/galera/t/MW-336.test +++ b/mysql-test/suite/galera/t/MW-336.test @@ -10,20 +10,20 @@ CREATE TABLE t1 (f1 INTEGER) Engine=InnoDB; --connection node_1 SET GLOBAL wsrep_slave_threads = 10; SET GLOBAL wsrep_slave_threads = 1; +--let $wait_condition = SELECT COUNT(*) = 11 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'system user'; +--source include/wait_condition.inc --connection node_2 INSERT INTO t1 VALUES (1); --connection node_1 ---sleep 0.5 SET GLOBAL wsrep_slave_threads = 10; ---sleep 0.5 -SELECT COUNT(*) = 11 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'system user'; +--let $wait_condition = SELECT COUNT(*) = 11 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'system user'; +--source include/wait_condition.inc SET GLOBAL wsrep_slave_threads = 20; ---sleep 0.5 -SELECT COUNT(*) = 21 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'system user'; - +--let $wait_condition = SELECT COUNT(*) = 21 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'system user'; +--source include/wait_condition.inc SET GLOBAL wsrep_slave_threads = 1; @@ -40,6 +40,9 @@ INSERT INTO t1 VALUES (9); --connection node_1 +--let $wait_condition = SELECT COUNT(*) = 12 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'system user'; +--source include/wait_condition.inc + SET GLOBAL wsrep_slave_threads = 10; SET GLOBAL wsrep_slave_threads = 0; @@ -57,8 +60,8 @@ INSERT INTO t1 VALUES (19); INSERT INTO t1 VALUES (20); --connection node_1 ---sleep 0.5 -SELECT COUNT(*) = 2 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'system user'; +--let $wait_condition = SELECT COUNT(*) = 2 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'system user'; +--source include/wait_condition.inc SET GLOBAL wsrep_slave_threads = 1; DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/MW-416.test b/mysql-test/suite/galera/t/MW-416.test new file mode 100644 index 000000000..df4fa35ab --- /dev/null +++ b/mysql-test/suite/galera/t/MW-416.test @@ -0,0 +1,134 @@ +--source include/galera_cluster.inc +--source include/have_innodb.inc + +--source include/wait_until_ready.inc + +CREATE USER 'userMW416'@'localhost'; +GRANT SELECT, INSERT, UPDATE ON test.* TO 'userMW416'@'localhost'; + +SHOW GLOBAL STATUS LIKE 'wsrep_replicated'; + +--connect userMW416, localhost, userMW416,, test, $NODE_MYPORT_1 +--connection userMW416 + +# DDL + +--error 1044 +ALTER DATABASE db CHARACTER SET = utf8; +--error 1044 +ALTER EVENT ev1 RENAME TO ev2; +--error 1370 +ALTER FUNCTION fun1 COMMENT 'foo'; +#--error 1044,1227 +#ALTER INSTANCE ROTATE INNODB MASTER KEY; +--error 1044,1227 +ALTER LOGFILE GROUP lfg ADD UNDOFILE 'file' ENGINE=InnoDB; +--error 1044,1227,1370 +ALTER PROCEDURE proc1 COMMENT 'foo'; +--error 1044,1227,1370 +ALTER SERVER srv OPTIONS (USER 'sally'); +--error 1044,1142,1227,1370 +ALTER TABLE tbl DROP COLUMN col; +--error 1044,1227,1370 +ALTER TABLESPACE tblspc DROP DATAFILE 'file' ENGINE=innodb; +--error 1044,1142,1227,1370 +ALTER VIEW vw AS SELECT 1; + +--error 1044,1227,1370 +CREATE DATABASE db; +--error 1044,1227,1370 +CREATE EVENT ev1 ON SCHEDULE AT CURRENT_TIMESTAMP DO SELECT 1; +--error 1044,1227,1370 +CREATE FUNCTION fun1() RETURNS int RETURN(1); +--error 1044,1227,1370 +CREATE FUNCTION fun1 RETURNS STRING SONAME 'funlib.so'; +--error 1044,1227,1370 +CREATE PROCEDURE proc1() BEGIN END; +--error 1044,1142,1227,1370 +CREATE INDEX idx ON tbl(id); +--error 1044,1142,1227,1370 +CREATE LOGFILE GROUP lfg ADD UNDOFILE 'undofile' ENGINE innodb; +--error 1044,1142,1227,1370 +CREATE SERVER srv FOREIGN DATA WRAPPER 'fdw' OPTIONS (USER 'user'); +--error 1044,1142,1227,1370 +CREATE TABLE t (i int); +--error 1044,1142,1227,1370 +CREATE TABLESPACE tblspc ADD DATAFILE 'file' ENGINE=innodb; +--error 1044,1142,1227,1370 +CREATE TRIGGER trg BEFORE UPDATE ON t FOR EACH ROW BEGIN END; +--error 1044,1142,1227,1370 +CREATE VIEW vw AS SELECT 1; + + + +--error 1044,1142,1227,1370 +DROP DATABASE db; +--error 1044,1142,1227,1370 +DROP EVENT ev; +--error 1044,1142,1227,1370 +DROP FUNCTION fun1; +--error 1044,1142,1227,1370 +DROP INDEX idx ON t0; +--error 1044,1142,1227,1370,1064 +DROP LOGFILE GROUP lfg; +--error 1044,1142,1227,1370 +DROP PROCEDURE proc1; +--error 1044,1142,1227,1370 +DROP SERVEr srv; +--error 1044,1142,1227,1370 +DROP TABLE t0; +--error 1044,1142,1227,1370,1064 +DROP TABLESPACE tblspc; +--error 1044,1142,1227,1360,1370 +DROP TRIGGER trg; +--error 1044,1142,1227,1370 +DROP VIEW vw; + +--error 1044,1142,1227,1370 +RENAME TABLE t0 TO t1; + +--error 1044,1142,1227,1370 +TRUNCATE TABLE t0; + +# DCL + +# account management +--error 1044,1142,1227,1370,1064 +ALTER USER myuser PASSWORD EXPIRE; +--error 1044,1142,1227,1370 +CREATE USER myuser IDENTIFIED BY 'pass'; +--error 1044,1142,1227,1370 +DROP USER myuser; +--error 1044,1045,1142,1227,1370 +GRANT ALL ON *.* TO 'myuser'; +--error 1044,1142,1227,1370 +RENAME USER myuser TO mariauser; +--error 1044,1142,1227,1370 +REVOKE SELECT ON test FROM myuser; +--error 1044,1142,1227,1370,1698 +REVOKE ALL, GRANT OPTION FROM myuser; +--error 1044,1142,1227,1370,1698 +REVOKE PROXY ON myuser FROM myuser; + +# table maintenance +--error 1044,1142,1227,1370 +ANALYZE TABLE db.tbl; +--error 1044,1142,1227,1370 +CHECK TABLE db.tbl; +--error 1044,1142,1227,1370 +CHECKSUM TABLE db.tbl; +--error 1044,1142,1227,1370 +OPTIMIZE TABLE db.tbl; +--error 1044,1142,1227,1370 +REPAIR TABLE db.tbl; + +# plugin and user defined functions +--error 1044,1142,1227,1370 +INSTALL PLUGIN plg SONAME 'plg.so'; +--error 1044,1142,1227,1370 +UNINSTALL PLUGIN plg; + +--connection node_1 +DROP USER 'userMW416'@'localhost'; +SHOW DATABASES; +SHOW GLOBAL STATUS LIKE 'wsrep_replicated'; diff --git a/mysql-test/suite/galera/t/MW-44.test b/mysql-test/suite/galera/t/MW-44.test index 55a3fd57f..09f444fdf 100644 --- a/mysql-test/suite/galera/t/MW-44.test +++ b/mysql-test/suite/galera/t/MW-44.test @@ -6,12 +6,20 @@ --source include/have_innodb.inc --connection node_1 +SET GLOBAL general_log='OFF'; TRUNCATE TABLE mysql.general_log; +SELECT COUNT(*) from mysql.general_log; +SELECT * FROM mysql.general_log; --connection node_2 +SET GLOBAL general_log='OFF'; TRUNCATE TABLE mysql.general_log; +SELECT COUNT(*) from mysql.general_log; +SELECT * FROM mysql.general_log; --connection node_1 +SET GLOBAL general_log='ON'; +SELECT COUNT(*) from mysql.general_log; SET SESSION wsrep_osu_method=TOI; CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB; SET SESSION wsrep_osu_method=RSU; @@ -21,5 +29,7 @@ SET SESSION wsrep_osu_method=TOI; SELECT COUNT(*) = 2 FROM mysql.general_log WHERE argument LIKE 'CREATE%' OR argument LIKE 'ALTER%'; --connection node_2 +SET GLOBAL general_log='ON'; SELECT COUNT(*) = 0 FROM mysql.general_log WHERE argument NOT LIKE 'SELECT%'; DROP TABLE t1; + diff --git a/mysql-test/suite/galera/t/galera#500.test b/mysql-test/suite/galera/t/galera#500.test new file mode 100644 index 000000000..3c8490b69 --- /dev/null +++ b/mysql-test/suite/galera/t/galera#500.test @@ -0,0 +1,38 @@ +# +# The purpose of this test is to verify that if an exception is +# thrown from gcomm background thread, the provider terminates properly +# and wsrep_ready becomes 0. +# + +--source include/have_innodb.inc +--source include/galera_cluster.inc +--source include/galera_have_debug_sync.inc + +# Force node_2 gcomm background thread to terminate via exception. +--connection node_2 +--let $wsrep_cluster_address = `SELECT @@wsrep_cluster_address` +# Setting gmcast.isolate=2 will force gcomm background thread to +# throw exception. +SET SESSION wsrep_sync_wait = 0; +SET GLOBAL wsrep_provider_options="gmcast.isolate=2"; + +# Wait until wsrep_ready becomes 0. +--let $wait_condition = SELECT VARIABLE_VALUE = 0 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME ='wsrep_ready' +--source include/wait_condition.inc + +# Wait until node_1 ends up in non-prim and rebootstrap the cluster. +--connection node_1 +SET SESSION wsrep_sync_wait = 0; +--let $wait_condition = SELECT VARIABLE_VALUE = 1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME ='wsrep_cluster_size' +--source include/wait_condition.inc +SHOW STATUS LIKE 'wsrep_cluster_status'; +SET SESSION wsrep_sync_wait = default; +SET GLOBAL wsrep_provider_options="pc.bootstrap=1"; + +# Restart node_2 +--connection node_2 +SET SESSION wsrep_on=0; +--source include/restart_mysqld.inc + +--connection node_2 +CALL mtr.add_suppression("WSREP: exception from gcomm, backend must be restarted: Gcomm backend termination was requested by setting gmcast.isolate=2."); diff --git a/mysql-test/suite/galera/t/galera_as_master.test b/mysql-test/suite/galera/t/galera_as_master.test index 93f9224b2..49f3c9932 100644 --- a/mysql-test/suite/galera/t/galera_as_master.test +++ b/mysql-test/suite/galera/t/galera_as_master.test @@ -35,14 +35,14 @@ SELECT * FROM t3; SELECT * FROM t4; --connection node_3 -SHOW TABLES; - --let $wait_condition = SELECT COUNT(*) = 2 FROM t1; --source include/wait_condition.inc --let $wait_condition = SELECT COUNT(*) = 3 FROM t4; --source include/wait_condition.inc +SHOW TABLES; + SELECT * FROM t1; SELECT * FROM t4; @@ -63,3 +63,5 @@ RESET SLAVE ALL; CALL mtr.add_suppression('You need to use --log-bin to make --binlog-format work'); +--connection node_1 +RESET MASTER; diff --git a/mysql-test/suite/galera/t/galera_autoinc_sst_xtrabackup.test b/mysql-test/suite/galera/t/galera_autoinc_sst_xtrabackup.test index 30ce9bc4c..cd7621bfa 100644 --- a/mysql-test/suite/galera/t/galera_autoinc_sst_xtrabackup.test +++ b/mysql-test/suite/galera/t/galera_autoinc_sst_xtrabackup.test @@ -6,6 +6,7 @@ --source include/big_test.inc --source include/galera_cluster.inc --source include/have_innodb.inc +--source include/have_xtrabackup.inc --connection node_1 --let $connection_id = `SELECT CONNECTION_ID()` diff --git a/mysql-test/suite/galera/t/galera_bf_abort_for_update.test b/mysql-test/suite/galera/t/galera_bf_abort_for_update.test index 24c29778e..13e48f8f3 100644 --- a/mysql-test/suite/galera/t/galera_bf_abort_for_update.test +++ b/mysql-test/suite/galera/t/galera_bf_abort_for_update.test @@ -5,25 +5,52 @@ # Test a local transaction being aborted by a slave one while it is running a SELECT FOR UPDATE # -CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB; +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY, f2 INT) ENGINE=InnoDB; ---connection node_2 ---let $wsrep_local_bf_aborts_before = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_bf_aborts'` -SET AUTOCOMMIT=OFF; -START TRANSACTION; -INSERT INTO t1 VALUES (1); +INSERT INTO t1 VALUES (1, 10); + +# Test updating the PK --connection node_1 -INSERT INTO t1 VALUES (1); +--let $wsrep_local_bf_aborts_before = `SELECT variable_value FROM information_schema.global_status WHERE variable_name = 'wsrep_local_bf_aborts'` +BEGIN; +SELECT * FROM t1 FOR UPDATE; --connection node_2 +UPDATE t1 SET f1 = 2; + +--connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1 +--let $wait_condition = SELECT COUNT(*) FROM t1 WHERE f1 = 2 +--source include/wait_condition.inc + +--connection node_1 --error ER_LOCK_DEADLOCK +COMMIT; + +--disable_query_log +--eval SELECT variable_value - $wsrep_local_bf_aborts_before AS wsrep_local_bf_aborts_diff FROM information_schema.global_status WHERE variable_name = 'wsrep_local_bf_aborts' +--enable_query_log + +# Test updating non-indexed column + +--connection node_1 +--let $wsrep_local_bf_aborts_before = `SELECT variable_value FROM information_schema.global_status WHERE variable_name = 'wsrep_local_bf_aborts'` +BEGIN; SELECT * FROM t1 FOR UPDATE; ---let $wsrep_local_bf_aborts_after = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_bf_aborts'` +--connection node_2 +UPDATE t1 SET f2 = 20; + +--connection node_1a +--let $wait_condition = SELECT COUNT(*) FROM t1 WHERE f2 = 20 +--source include/wait_condition.inc + +--connection node_1 +--error ER_LOCK_DEADLOCK +COMMIT; --disable_query_log ---eval SELECT $wsrep_local_bf_aborts_after - $wsrep_local_bf_aborts_before = 1 AS wsrep_local_aborts_increment; +--eval SELECT variable_value - $wsrep_local_bf_aborts_before AS wsrep_local_bf_aborts_diff FROM information_schema.global_status WHERE variable_name = 'wsrep_local_bf_aborts' --enable_query_log DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/galera_concurrent_ctas.test b/mysql-test/suite/galera/t/galera_concurrent_ctas.test index f0dcf8e49..6c4e8be68 100644 --- a/mysql-test/suite/galera/t/galera_concurrent_ctas.test +++ b/mysql-test/suite/galera/t/galera_concurrent_ctas.test @@ -43,9 +43,9 @@ let $run=10; while($run) { --error 0,1 - exec $MYSQL --user=root --host=127.0.0.1 --port=$NODE_MYPORT_1 test - < $MYSQLTEST_VARDIR/tmp/galera_concurrent.sql & - $MYSQL --user=root --host=127.0.0.1 --port=$NODE_MYPORT_2 test + exec $MYSQL --user=root --host=127.0.0.1 --port=$NODE_MYPORT_1 test \ + < $MYSQLTEST_VARDIR/tmp/galera_concurrent.sql & \ + $MYSQL --user=root --host=127.0.0.1 --port=$NODE_MYPORT_2 test \ < $MYSQLTEST_VARDIR/tmp/galera_concurrent.sql; dec $run; } diff --git a/mysql-test/suite/galera/t/galera_defaults.test b/mysql-test/suite/galera/t/galera_defaults.test index 32fc24097..facc5180f 100644 --- a/mysql-test/suite/galera/t/galera_defaults.test +++ b/mysql-test/suite/galera/t/galera_defaults.test @@ -56,6 +56,7 @@ ORDER BY VARIABLE_NAME; $wsrep_provider_options =~ s/evs\.evict = .*?;/;/sgio; $wsrep_provider_options =~ s/signal = .*?;\s*//sgio; $wsrep_provider_options =~ s/dbug = .*?;\s*//sgio; + $wsrep_provider_options =~ s/repl.proto_max = .*?;\s*/;/sgio; print $wsrep_provider_options."\n"; EOF diff --git a/mysql-test/suite/galera/t/galera_encrypt_tmp_files.cnf b/mysql-test/suite/galera/t/galera_encrypt_tmp_files.cnf new file mode 100644 index 000000000..0f7f80b7d --- /dev/null +++ b/mysql-test/suite/galera/t/galera_encrypt_tmp_files.cnf @@ -0,0 +1,8 @@ +!include ../galera_2nodes.cnf +[mysqld] + +encrypt-tmp-files = 1 +plugin-load-add= @ENV.FILE_KEY_MANAGEMENT_SO +file-key-management +loose-file-key-management-filename= @ENV.MYSQL_TEST_DIR/std_data/keys.txt +log-bin diff --git a/mysql-test/suite/galera/t/galera_encrypt_tmp_files.test b/mysql-test/suite/galera/t/galera_encrypt_tmp_files.test new file mode 100644 index 000000000..c42c3dbd9 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_encrypt_tmp_files.test @@ -0,0 +1,57 @@ +# This file tests that mariadb cluster should not crash when encrypt_tmp_file +# is enabled + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +SELECT VARIABLE_VALUE = 'Synced' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment'; +SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; + +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) Engine=InnoDB; +INSERT INTO t1 VALUES (1); + +--connection node_2 +SELECT VARIABLE_VALUE = 'Synced' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment'; +SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; + +SELECT COUNT(*) = 1 FROM t1; + +DROP TABLE t1; + +--connection node_1 + +CREATE TABLE `t1` ( + `col1` int(11) NOT NULL, + `col2` varchar(64) NOT NULL DEFAULT '', + `col3` varchar(32) NOT NULL DEFAULT '0', + `col4` varchar(64) NOT NULL DEFAULT '', + `col5` tinyint(4) NOT NULL DEFAULT '0', + `col6` int(11) NOT NULL DEFAULT '0', + `col7` varchar(64) NOT NULL DEFAULT '', + `col8` tinyint(4) NOT NULL DEFAULT '0', + `col9` tinyint(4) NOT NULL DEFAULT '0', + `col10` text NOT NULL, + `col11` varchar(255) NOT NULL DEFAULT '', + `col12` tinyint(4) NOT NULL DEFAULT '1' +) ; + +#Although we just need $counter >= 907 for IO_CACHE to use +#encrypted temp file. Just on safe side I am using $counter +# = 1100 +--disable_query_log +--let $counter=1100 +--let $query= (1,'test','test','test',0,0,'-1',0,0,'','',-1) +while($counter) +{ + --let $query= $query ,(1,'test','test','test',0,0,'-1',0,0,'','',-1) + --dec $counter +} +--let $query= INSERT INTO t1 values $query ; +--eval $query +--enable_query_log +#INSERT INTO `t1` VALUE + +create table t2 (test int); +insert into t2 values (1); + +drop table t1,t2; diff --git a/mysql-test/suite/galera/t/galera_flush_local.opt b/mysql-test/suite/galera/t/galera_flush_local.opt index 5a1fb6748..a084db15c 100644 --- a/mysql-test/suite/galera/t/galera_flush_local.opt +++ b/mysql-test/suite/galera/t/galera_flush_local.opt @@ -1 +1,3 @@ ---query_cache_type=1 --query_cache_size=1000000 +--query_cache_type=1 +--query_cache_size=1000000 +--wsrep_replicate_myisam=ON diff --git a/mysql-test/suite/galera/t/galera_flush_local.test b/mysql-test/suite/galera/t/galera_flush_local.test index 768f4ea4f..24acd9ec4 100644 --- a/mysql-test/suite/galera/t/galera_flush_local.test +++ b/mysql-test/suite/galera/t/galera_flush_local.test @@ -5,6 +5,7 @@ --source include/galera_cluster.inc --source include/have_innodb.inc --source include/have_query_cache.inc +--source include/have_wsrep_replicate_myisam.inc --disable_warnings DROP TABLE IF EXISTS t1, t2, x1, x2; diff --git a/mysql-test/suite/galera/t/galera_gcache_recover_manytrx.test b/mysql-test/suite/galera/t/galera_gcache_recover_manytrx.test index 3bfcdc9f1..08165f30f 100644 --- a/mysql-test/suite/galera/t/galera_gcache_recover_manytrx.test +++ b/mysql-test/suite/galera/t/galera_gcache_recover_manytrx.test @@ -5,6 +5,7 @@ --source include/galera_cluster.inc --source include/big_test.inc +--source include/have_log_bin.inc SET SESSION wsrep_sync_wait = 0; CREATE TABLE t1 (f1 INTEGER PRIMARY KEY AUTO_INCREMENT, f2 LONGBLOB) ENGINE=InnoDB; @@ -93,6 +94,8 @@ END| DELIMITER ;| +--let $wsrep_last_committed_before = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.SESSION_STATUS WHERE VARIABLE_NAME = 'wsrep_last_committed'` + --connect node_1_insert_simple, 127.0.0.1, root, , test, $NODE_MYPORT_1 --connect node_1_insert_multi, 127.0.0.1, root, , test, $NODE_MYPORT_1 --connect node_1_insert_transaction, 127.0.0.1, root, , test, $NODE_MYPORT_1 @@ -124,6 +127,13 @@ DELIMITER ;| --connection node_2 SET SESSION wsrep_sync_wait = 0; + +# Make sure that node_2 is not killed while TOIs are applied. +# Otherwhise we risk that grastate file is marked unsafe, and +# as a consequence the node cannot rejoin with IST. +--let $wait_condition = SELECT VARIABLE_VALUE > $wsrep_last_committed_before FROM INFORMATION_SCHEMA.SESSION_STATUS WHERE VARIABLE_NAME = 'wsrep_last_committed' +--source include/wait_condition.inc + --source include/kill_galera.inc --sleep 10 @@ -172,9 +182,8 @@ SET SESSION wsrep_sync_wait = 0; --source include/start_mysqld.inc --connection node_1 ---source include/wait_until_connected_again.inc ---source include/galera_wait_ready.inc --let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc --let $diff_servers = 1 2 --source include/diff_servers.inc diff --git a/mysql-test/suite/galera/t/galera_gcs_fragment.test b/mysql-test/suite/galera/t/galera_gcs_fragment.test index ae1e0d8ba..80d3a5cb6 100644 --- a/mysql-test/suite/galera/t/galera_gcs_fragment.test +++ b/mysql-test/suite/galera/t/galera_gcs_fragment.test @@ -1,6 +1,12 @@ # Test fragmentation over configuration changes --source include/galera_cluster.inc --source include/have_innodb.inc +--source suite/galera/include/galera_have_debug_sync.inc + +# Save original auto_increment_offset values. +--let $node_1=node_1 +--let $node_2=node_2 +--source include/auto_increment_offset_save.inc # Prepare table CREATE TABLE t1 (f1 INT PRIMARY KEY, f2 TEXT); @@ -64,3 +70,5 @@ SELECT * FROM t1; --connection node_1 DROP TABLE t1; + +--source include/auto_increment_offset_restore.inc diff --git a/mysql-test/suite/galera/t/galera_gra_log.test b/mysql-test/suite/galera/t/galera_gra_log.test index 5329dc245..8b5aaaae5 100644 --- a/mysql-test/suite/galera/t/galera_gra_log.test +++ b/mysql-test/suite/galera/t/galera_gra_log.test @@ -17,21 +17,13 @@ CREATE TABLE t1 (f1 INTEGER); CREATE TABLE t1 (f1 INTEGER); --connection node_2 +SET SESSION wsrep_on=ON; SELECT COUNT(*) = 0 FROM t1; -# Compose a valid binlog from a header file and the GRA file - ---let $gra_binlog_file = $MYSQLTEST_VARDIR/tmp/gra.log ---exec rm -rf $gra_binlog_file - ---exec cp std_data/binlog-header.log $gra_binlog_file ---exec cat $MYSQLTEST_VARDIR/mysqld.2/data/GRA_*.log >> $gra_binlog_file +# Make sure the GRA file produced is readable and contains the failure -# Make sure the binlog thus produced is readable and contains the failure ---replace_regex /SET TIMESTAMP=[0-9]+/SET TIMESTAMP=/ /#[0-9]+ +[0-9]+:[0-9]+:[0-9]+// /pseudo_thread_id=[0-9]+/pseudo_thread_id=/ /thread_id=[0-9]+/thread_id=/ ---exec $MYSQL_BINLOG $gra_binlog_file - -SET SESSION wsrep_on=ON; +--replace_regex /SET TIMESTAMP=[0-9]+/SET TIMESTAMP=/ /pseudo_thread_id=[0-9]+/pseudo_thread_id=/ +--exec $MYSQL_BINLOG --short-form $MYSQLTEST_VARDIR/mysqld.2/data/GRA_*.log CALL mtr.add_suppression("Slave SQL: Error 'Table 't1' already exists' on query"); diff --git a/mysql-test/suite/galera/t/galera_gtid_slave.test b/mysql-test/suite/galera/t/galera_gtid_slave.test index 8ef87452a..19bfd8e17 100644 --- a/mysql-test/suite/galera/t/galera_gtid_slave.test +++ b/mysql-test/suite/galera/t/galera_gtid_slave.test @@ -38,7 +38,13 @@ SELECT @@global.gtid_binlog_state; --let $wait_condition = SELECT COUNT(*) = 1 FROM t1; --source include/wait_condition.inc ---sleep 1 + +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't2'; +--source include/wait_condition.inc + +--let $wait_condition = SELECT COUNT(*) = 2 FROM t2; +--source include/wait_condition.inc + INSERT INTO t1 VALUES(2); INSERT INTO t1 VALUES(3); SELECT @@global.gtid_binlog_state; @@ -52,14 +58,6 @@ SELECT @@global.gtid_binlog_state; --connection node_1 DROP TABLE t1,t2; -reset master; -# -# Unfortunately without the sleep below the following statement fails with "query returned no rows", which -# is difficult to understand given that it is an aggregate query. A "query execution was interrupted" -# warning is also reported by MTR, which is also weird. -# - ---sleep 1 --connection node_2 --let $wait_condition = SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1'; @@ -76,3 +74,6 @@ reset master; --connection node_3 reset master; + +--connection node_1 +reset master; diff --git a/mysql-test/suite/galera/t/galera_ist_mysqldump.test b/mysql-test/suite/galera/t/galera_ist_mysqldump.test index a9ff8c41f..f60d5549e 100644 --- a/mysql-test/suite/galera/t/galera_ist_mysqldump.test +++ b/mysql-test/suite/galera/t/galera_ist_mysqldump.test @@ -4,6 +4,10 @@ --source suite/galera/include/galera_sst_set_mysqldump.inc +--let $node_1=node_1 +--let $node_2=node_2 +--source include/auto_increment_offset_save.inc + # mysql-wsrep#33 - nnoDB: Failing assertion: xid_seqno > trx_sys_cur_xid_seqno in trx_sys_update_wsrep_checkpoint with mysqldump IST # --source suite/galera/include/galera_st_disconnect_slave.inc @@ -14,4 +18,5 @@ --source suite/galera/include/galera_st_kill_slave.inc --source suite/galera/include/galera_st_kill_slave_ddl.inc +--source include/auto_increment_offset_restore.inc --source suite/galera/include/galera_sst_restore.inc diff --git a/mysql-test/suite/galera/t/galera_ist_xtrabackup-v2.test b/mysql-test/suite/galera/t/galera_ist_xtrabackup-v2.test index 8b399e777..c44b06423 100644 --- a/mysql-test/suite/galera/t/galera_ist_xtrabackup-v2.test +++ b/mysql-test/suite/galera/t/galera_ist_xtrabackup-v2.test @@ -1,6 +1,7 @@ --source include/big_test.inc --source include/galera_cluster.inc --source include/have_innodb.inc +--source include/have_xtrabackup.inc --source suite/galera/include/galera_st_disconnect_slave.inc --source suite/galera/include/galera_st_shutdown_slave.inc diff --git a/mysql-test/suite/galera/t/galera_kill_nochanges.test b/mysql-test/suite/galera/t/galera_kill_nochanges.test index 1903df449..410637888 100644 --- a/mysql-test/suite/galera/t/galera_kill_nochanges.test +++ b/mysql-test/suite/galera/t/galera_kill_nochanges.test @@ -11,6 +11,14 @@ INSERT INTO t1 VALUES (1); --connection node_2 --source include/kill_galera.inc + +--connection node_1 +SET SESSION wsrep_sync_wait = 0; +--let $wait_condition = SELECT VARIABLE_VALUE = 'non-Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status' +--source include/wait_condition.inc +SET SESSION wsrep_sync_wait = DEFAULT; + +--connection node_2 --source include/start_mysqld.inc --let $galera_connection_name = node_2a diff --git a/mysql-test/suite/galera/t/galera_lock_table.test b/mysql-test/suite/galera/t/galera_lock_table.test index bd581842f..2745bfe5f 100644 --- a/mysql-test/suite/galera/t/galera_lock_table.test +++ b/mysql-test/suite/galera/t/galera_lock_table.test @@ -12,6 +12,13 @@ CREATE TABLE t1 (id INT PRIMARY KEY) ENGINE=InnoDB; CREATE TABLE t2 (id INT PRIMARY KEY) ENGINE=InnoDB; --connection node_2 + +# Wait until above DDL's are replicated +--let $wait_condition = SELECT COUNT(*) = 2 FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME LIKE 'test/t%'; +--source include/wait_condition.inc + +SELECT NAME FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME LIKE 'test/t%'; + LOCK TABLE t1 READ; --connection node_1 diff --git a/mysql-test/suite/galera/t/galera_many_tables_pk.test b/mysql-test/suite/galera/t/galera_many_tables_pk.test index 551307b12..73c5fc162 100644 --- a/mysql-test/suite/galera/t/galera_many_tables_pk.test +++ b/mysql-test/suite/galera/t/galera_many_tables_pk.test @@ -16,7 +16,7 @@ if (!`SELECT @@open_files_limit >= 1024`){ while ($count) { --disable_query_log - --let $ddl_var = `SELECT CONCAT("CREATE TABLE t", $count, " (f1 INTEGER AUTO_INCREMENT PRIMARY KEY) ENGINE=InnoDB")` + --let $ddl_var = `SELECT CONCAT("CREATE TABLE t", $count, " (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB")` --eval $ddl_var --enable_query_log --dec $count @@ -37,7 +37,7 @@ START TRANSACTION; while ($count) { --disable_query_log - --let $ddl_var = `SELECT CONCAT("INSERT INTO t", $count, " VALUES (DEFAULT)")` + --let $ddl_var = `SELECT CONCAT("INSERT INTO t", $count, " VALUES (1)")` --eval $ddl_var --enable_query_log --dec $count diff --git a/mysql-test/suite/galera/t/galera_mdev_15611.cnf b/mysql-test/suite/galera/t/galera_mdev_15611.cnf new file mode 100644 index 000000000..b6f601c56 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_mdev_15611.cnf @@ -0,0 +1,5 @@ +!include ../galera_2nodes.cnf +[mysqld.1] + +[mysqld.2] +wsrep_slave_threads=6 diff --git a/mysql-test/suite/galera/t/galera_mdev_15611.test b/mysql-test/suite/galera/t/galera_mdev_15611.test new file mode 100644 index 000000000..d32d7e752 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_mdev_15611.test @@ -0,0 +1,30 @@ +--source include/galera_cluster.inc +--source include/have_innodb.inc + +--connection node_1 +CREATE TABLE t1 ( + id int primary key +); + +CREATE TABLE t2 ( + id int primary key , + f_id int DEFAULT NULL, FOREIGN KEY(f_id) REFERENCES t1 (id) +); + +insert into t1 select 1; + +--disable_query_log +--let $count=200 +--echo #Running 200 insert in t2 table +while($count) +{ + #Repeatedly execute the following SQL until you generate thousands of data + --eval insert into t2 values ($count, 1); + --dec $count +} +--enable_query_log + +select count(*) from t2; +delete from t2; +delete from t1; +drop table t2,t1; diff --git a/mysql-test/suite/galera/t/galera_parallel_simple.test b/mysql-test/suite/galera/t/galera_parallel_simple.test index 41cd0c8e6..2cd840123 100644 --- a/mysql-test/suite/galera/t/galera_parallel_simple.test +++ b/mysql-test/suite/galera/t/galera_parallel_simple.test @@ -13,6 +13,13 @@ CREATE TABLE t2 (id INT) ENGINE=InnoDB; --connection node_2 SET GLOBAL wsrep_slave_threads = 2; + +# Wait until above DDL's are replicated +--let $wait_condition = SELECT COUNT(*) = 2 FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME LIKE 'test/t%'; +--source include/wait_condition.inc + +SELECT NAME FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME LIKE 'test/t%'; + LOCK TABLE t1 WRITE; --connection node_1 diff --git a/mysql-test/suite/galera/t/galera_pc_ignore_sb.test b/mysql-test/suite/galera/t/galera_pc_ignore_sb.test index 84fd3a918..f24ca5cd2 100644 --- a/mysql-test/suite/galera/t/galera_pc_ignore_sb.test +++ b/mysql-test/suite/galera/t/galera_pc_ignore_sb.test @@ -20,6 +20,9 @@ SET GLOBAL wsrep_provider_options = 'pc.ignore_sb=true'; --source include/kill_galera.inc --connection node_1 +--let $wait_condition = SELECT VARIABLE_VALUE = 1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size' +--source include/wait_condition.inc + CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB; INSERT INTO t1 VALUES (1); DROP TABLE t1; @@ -37,10 +40,8 @@ SET GLOBAL wsrep_cluster_address = ''; --connection node_2 --source include/start_mysqld.inc ---source include/wait_until_connected_again.inc # Restore original auto_increment_offset values. --source include/auto_increment_offset_restore.inc --source include/galera_end.inc - diff --git a/mysql-test/suite/galera/t/galera_schema_dirty_reads.test b/mysql-test/suite/galera/t/galera_schema_dirty_reads.test new file mode 100644 index 000000000..93e242446 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_schema_dirty_reads.test @@ -0,0 +1,13 @@ +# +# Dirty reads from INFORMATION_SCHEMA tables. +# +--source include/galera_cluster.inc +--source include/have_innodb.inc +--disable_info +USE information_schema; +SELECT * FROM SESSION_VARIABLES WHERE VARIABLE_NAME LIKE "wsrep_dirty_reads"; +SET GLOBAL wsrep_reject_queries=ALL; +SELECT * FROM SESSION_VARIABLES WHERE VARIABLE_NAME LIKE "wsrep_dirty_reads"; +SET GLOBAL wsrep_reject_queries=NONE; +SET SESSION wsrep_dirty_reads=TRUE; +SELECT * FROM SESSION_VARIABLES WHERE VARIABLE_NAME LIKE "wsrep_dirty_reads"; diff --git a/mysql-test/suite/galera/t/galera_sst_mariabackup.cnf b/mysql-test/suite/galera/t/galera_sst_mariabackup.cnf new file mode 100644 index 000000000..336296e9b --- /dev/null +++ b/mysql-test/suite/galera/t/galera_sst_mariabackup.cnf @@ -0,0 +1,16 @@ +!include ../galera_2nodes.cnf + +[mysqld] +wsrep_sst_method=mariabackup +wsrep_sst_auth="root:" +wsrep_debug=ON + +[mysqld.1] +wsrep_provider_options='base_port=@mysqld.1.#galera_port;gcache.size=1;pc.ignore_sb=true' + +[mysqld.2] +wsrep_provider_options='base_port=@mysqld.2.#galera_port;gcache.size=1;pc.ignore_sb=true' + +[sst] +transferfmt=@ENV.MTR_GALERA_TFMT +streamfmt=xbstream diff --git a/mysql-test/suite/galera/t/galera_sst_mariabackup.test b/mysql-test/suite/galera/t/galera_sst_mariabackup.test new file mode 100644 index 000000000..bcb9ade3a --- /dev/null +++ b/mysql-test/suite/galera/t/galera_sst_mariabackup.test @@ -0,0 +1,20 @@ +--source include/big_test.inc +--source include/galera_cluster.inc +--source include/have_innodb.inc +--source include/have_mariabackup.inc + +# Save original auto_increment_offset values. +--let $node_1=node_1 +--let $node_2=node_2 +--source include/auto_increment_offset_save.inc + +--source suite/galera/include/galera_st_shutdown_slave.inc +--source suite/galera/include/galera_st_clean_slave.inc + +--source suite/galera/include/galera_st_kill_slave.inc +--source suite/galera/include/galera_st_kill_slave_ddl.inc + +# Restore original auto_increment_offset values. +--source include/auto_increment_offset_restore.inc + +--source include/galera_end.inc diff --git a/mysql-test/suite/galera/t/galera_sst_mysqldump.test b/mysql-test/suite/galera/t/galera_sst_mysqldump.test index 0b7171597..835fac94a 100644 --- a/mysql-test/suite/galera/t/galera_sst_mysqldump.test +++ b/mysql-test/suite/galera/t/galera_sst_mysqldump.test @@ -1,9 +1,12 @@ --source include/big_test.inc --source include/galera_cluster.inc ---source include/have_innodb.inc --source suite/galera/include/galera_sst_set_mysqldump.inc +--let $node_1=node_1 +--let $node_2=node_2 +--source include/auto_increment_offset_save.inc + --source suite/galera/include/galera_st_disconnect_slave.inc # We set the required mysqldump SST options here so that they are used every time the server is restarted during the test @@ -15,4 +18,5 @@ --source suite/galera/include/galera_st_kill_slave.inc --source suite/galera/include/galera_st_kill_slave_ddl.inc +--source include/auto_increment_offset_restore.inc --source suite/galera/include/galera_sst_restore.inc diff --git a/mysql-test/suite/galera/t/galera_sst_mysqldump_with_key.cnf b/mysql-test/suite/galera/t/galera_sst_mysqldump_with_key.cnf index e108484b2..44e5573b3 100644 --- a/mysql-test/suite/galera/t/galera_sst_mysqldump_with_key.cnf +++ b/mysql-test/suite/galera/t/galera_sst_mysqldump_with_key.cnf @@ -12,10 +12,6 @@ wsrep_provider_options='base_port=@mysqld.2.#galera_port;gcache.size=1;pc.ignore [mysqld] wsrep_debug=ON -ssl-ca=@ENV.MYSQL_TEST_DIR/std_data/galera-cert.pem -ssl-cert=@ENV.MYSQL_TEST_DIR/std_data/galera-cert.pem -ssl-key=@ENV.MYSQL_TEST_DIR/std_data/galera-key.pem - [client] ssl-ca=@ENV.MYSQL_TEST_DIR/std_data/cacert.pem ssl-cert=@ENV.MYSQL_TEST_DIR/std_data/client-cert.pem diff --git a/mysql-test/suite/galera/t/galera_sst_mysqldump_with_key.test b/mysql-test/suite/galera/t/galera_sst_mysqldump_with_key.test index c813e0416..0dbc63b53 100644 --- a/mysql-test/suite/galera/t/galera_sst_mysqldump_with_key.test +++ b/mysql-test/suite/galera/t/galera_sst_mysqldump_with_key.test @@ -5,9 +5,12 @@ --source include/big_test.inc --source include/galera_cluster.inc --source include/have_innodb.inc ---source include/have_openssl.inc +--source include/have_ssl_communication.inc --source suite/galera/include/galera_sst_set_mysqldump.inc +--let $node_1=node_1 +--let $node_2=node_2 +--source include/auto_increment_offset_save.inc --connection node_1 CREATE USER sslsst; @@ -18,12 +21,7 @@ SET GLOBAL wsrep_sst_auth = 'sslsst:'; --source suite/galera/include/galera_st_disconnect_slave.inc +--source include/auto_increment_offset_restore.inc --source suite/galera/include/galera_sst_restore.inc -DROP USER sslsst; - ---connection node_2 -# We have to manually restore global_log and slow_query_log due to mysql-wsrep#108 -# Otherwise MTR's check_testcases complains -SET GLOBAL general_log = ON; -SET GLOBAL slow_query_log = ON; +DROP USER sslsst; diff --git a/mysql-test/suite/galera/t/galera_sst_rsync.test b/mysql-test/suite/galera/t/galera_sst_rsync.test index c6823795e..5c08707e8 100644 --- a/mysql-test/suite/galera/t/galera_sst_rsync.test +++ b/mysql-test/suite/galera/t/galera_sst_rsync.test @@ -1,9 +1,13 @@ --source include/big_test.inc --source include/galera_cluster.inc ---source include/have_innodb.inc + +--let $node_1=node_1 +--let $node_2=node_2 +--source include/auto_increment_offset_save.inc --source suite/galera/include/galera_st_shutdown_slave.inc --source suite/galera/include/galera_st_clean_slave.inc --source suite/galera/include/galera_st_kill_slave.inc --source suite/galera/include/galera_st_kill_slave_ddl.inc +--source include/auto_increment_offset_restore.inc diff --git a/mysql-test/suite/galera/t/galera_sst_xtrabackup-v2-options.cnf b/mysql-test/suite/galera/t/galera_sst_xtrabackup-v2-options.cnf index 31bd1af07..3abf2549a 100644 --- a/mysql-test/suite/galera/t/galera_sst_xtrabackup-v2-options.cnf +++ b/mysql-test/suite/galera/t/galera_sst_xtrabackup-v2-options.cnf @@ -8,7 +8,7 @@ wsrep_debug=ON [xtrabackup] backup-locks close-files -compact +#compact - disabled in xtrabackup 2.4, https://bugs.launchpad.net/percona-xtrabackup/+bug/1192834/comments/29 # compression requires qpress from the Percona repositories # compress # compress-threads=2 @@ -22,3 +22,4 @@ parallel=2 encrypt=1 encrypt-algo=AES256 encrypt-key=4FA92C5873672E20FB163A0BCB2BB4A4 +transferfmt=@ENV.MTR_GALERA_TFMT diff --git a/mysql-test/suite/galera/t/galera_sst_xtrabackup-v2-options.test b/mysql-test/suite/galera/t/galera_sst_xtrabackup-v2-options.test index 4573f1764..db2b706b6 100644 --- a/mysql-test/suite/galera/t/galera_sst_xtrabackup-v2-options.test +++ b/mysql-test/suite/galera/t/galera_sst_xtrabackup-v2-options.test @@ -3,9 +3,9 @@ # Initial SST happens via xtrabackup, so there is not much to do in the body of the test # ---source include/big_test.inc --source include/galera_cluster.inc --source include/have_innodb.inc +--source include/have_xtrabackup.inc SELECT 1; diff --git a/mysql-test/suite/galera/t/galera_sst_xtrabackup-v2.cnf b/mysql-test/suite/galera/t/galera_sst_xtrabackup-v2.cnf index 47cb3e022..0025b259e 100644 --- a/mysql-test/suite/galera/t/galera_sst_xtrabackup-v2.cnf +++ b/mysql-test/suite/galera/t/galera_sst_xtrabackup-v2.cnf @@ -11,3 +11,5 @@ wsrep_provider_options='base_port=@mysqld.1.#galera_port;gcache.size=1;pc.ignore [mysqld.2] wsrep_provider_options='base_port=@mysqld.2.#galera_port;gcache.size=1;pc.ignore_sb=true' +[sst] +transferfmt=@ENV.MTR_GALERA_TFMT diff --git a/mysql-test/suite/galera/t/galera_sst_xtrabackup-v2.test b/mysql-test/suite/galera/t/galera_sst_xtrabackup-v2.test index aac682217..c270e4d0b 100644 --- a/mysql-test/suite/galera/t/galera_sst_xtrabackup-v2.test +++ b/mysql-test/suite/galera/t/galera_sst_xtrabackup-v2.test @@ -1,6 +1,7 @@ --source include/big_test.inc --source include/galera_cluster.inc --source include/have_innodb.inc +--source include/have_xtrabackup.inc # Save original auto_increment_offset values. --let $node_1=node_1 diff --git a/mysql-test/suite/galera/t/galera_sst_xtrabackup-v2_encrypt_with_key.cnf b/mysql-test/suite/galera/t/galera_sst_xtrabackup-v2_encrypt_with_key.cnf index 969516f5f..63d05104a 100644 --- a/mysql-test/suite/galera/t/galera_sst_xtrabackup-v2_encrypt_with_key.cnf +++ b/mysql-test/suite/galera/t/galera_sst_xtrabackup-v2_encrypt_with_key.cnf @@ -9,3 +9,4 @@ wsrep_debug=ON tkey=@ENV.MYSQL_TEST_DIR/std_data/galera-key.pem tcert=@ENV.MYSQL_TEST_DIR/std_data/galera-cert.pem encrypt=3 +transferfmt=@ENV.MTR_GALERA_TFMT diff --git a/mysql-test/suite/galera/t/galera_sst_xtrabackup-v2_encrypt_with_key.test b/mysql-test/suite/galera/t/galera_sst_xtrabackup-v2_encrypt_with_key.test index 24d9589d1..2f685ca71 100644 --- a/mysql-test/suite/galera/t/galera_sst_xtrabackup-v2_encrypt_with_key.test +++ b/mysql-test/suite/galera/t/galera_sst_xtrabackup-v2_encrypt_with_key.test @@ -6,6 +6,7 @@ --source include/big_test.inc --source include/galera_cluster.inc --source include/have_innodb.inc +--source include/have_xtrabackup.inc SELECT 1; diff --git a/mysql-test/suite/galera/t/galera_suspend_slave.test b/mysql-test/suite/galera/t/galera_suspend_slave.test index aa4543cf8..6f0f80143 100644 --- a/mysql-test/suite/galera/t/galera_suspend_slave.test +++ b/mysql-test/suite/galera/t/galera_suspend_slave.test @@ -29,6 +29,11 @@ CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB; exit(0); EOF +SET SESSION wsrep_sync_wait = 0; + +--let $wait_condition = SELECT VARIABLE_VALUE = 1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc + --error ER_UNKNOWN_COM_ERROR,ER_LOCK_WAIT_TIMEOUT,ER_LOCK_DEADLOCK,ER_ERROR_DURING_COMMIT INSERT INTO t1 VALUES (1); @@ -41,8 +46,6 @@ INSERT INTO t1 VALUES (1); exit(0); EOF -SET SESSION wsrep_sync_wait = 1; ---sleep 10 --source include/wait_until_ready.inc INSERT INTO t1 VALUES (1); @@ -51,7 +54,7 @@ INSERT INTO t1 VALUES (1); --source include/galera_connect.inc --connection node_2a -SET SESSION wsrep_sync_wait = 1; +SET SESSION wsrep_sync_wait = 0; --source include/wait_until_ready.inc SELECT COUNT(*) = 1 FROM t1; diff --git a/mysql-test/suite/galera/t/galera_toi_ddl_fk_insert.test b/mysql-test/suite/galera/t/galera_toi_ddl_fk_insert.test index 1f4469387..9f161afc5 100644 --- a/mysql-test/suite/galera/t/galera_toi_ddl_fk_insert.test +++ b/mysql-test/suite/galera/t/galera_toi_ddl_fk_insert.test @@ -20,7 +20,7 @@ CREATE TABLE child ( parent_id INT ) ENGINE=InnoDB; -INSERT INTO parent VALUES (DEFAULT, 0); +INSERT INTO parent VALUES (1, 0); --connection node_2 --send INSERT INTO child (parent_id) SELECT 1 FROM ten AS a1, ten AS a2, ten AS a3, ten AS a4; diff --git a/mysql-test/suite/galera/t/galera_toi_ddl_nonconflicting.test b/mysql-test/suite/galera/t/galera_toi_ddl_nonconflicting.test index 821f7a6eb..dbd2510cb 100644 --- a/mysql-test/suite/galera/t/galera_toi_ddl_nonconflicting.test +++ b/mysql-test/suite/galera/t/galera_toi_ddl_nonconflicting.test @@ -17,12 +17,23 @@ CREATE TABLE t1 (f1 INTEGER PRIMARY KEY AUTO_INCREMENT, f2 INTEGER); --reap INSERT INTO t1 (f1, f2) VALUES (DEFAULT, 234); +--let $wait_condition = SELECT COUNT(*) = 3 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 't1'; +--source include/wait_condition.inc +--let $wait_condition = SELECT COUNT(*) = 2 FROM INFORMATION_SCHEMA.STATISTICS WHERE TABLE_NAME = 't1'; +--source include/wait_condition.inc + SELECT COUNT(*) = 3 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 't1'; SELECT COUNT(*) = 2 FROM INFORMATION_SCHEMA.STATISTICS WHERE TABLE_NAME = 't1'; SELECT COUNT(*) = 2 FROM t1; --connection node_1 --reap + +--let $wait_condition = SELECT COUNT(*) = 3 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 't1'; +--source include/wait_condition.inc +--let $wait_condition = SELECT COUNT(*) = 2 FROM INFORMATION_SCHEMA.STATISTICS WHERE TABLE_NAME = 't1'; +--source include/wait_condition.inc + SELECT COUNT(*) = 3 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 't1'; SELECT COUNT(*) = 2 FROM INFORMATION_SCHEMA.STATISTICS WHERE TABLE_NAME = 't1'; SELECT COUNT(*) = 2 FROM t1; diff --git a/mysql-test/suite/galera/t/galera_var_auto_inc_control_on.opt b/mysql-test/suite/galera/t/galera_var_auto_inc_control_on.opt new file mode 100644 index 000000000..0a0361088 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_var_auto_inc_control_on.opt @@ -0,0 +1 @@ +--wsrep-auto-increment-control=ON diff --git a/mysql-test/suite/galera/t/galera_var_auto_inc_control_on.test b/mysql-test/suite/galera/t/galera_var_auto_inc_control_on.test index d65a35be4..ee31be94e 100644 --- a/mysql-test/suite/galera/t/galera_var_auto_inc_control_on.test +++ b/mysql-test/suite/galera/t/galera_var_auto_inc_control_on.test @@ -9,13 +9,17 @@ CREATE TABLE t1 (f1 INTEGER AUTO_INCREMENT PRIMARY KEY, node VARCHAR(10)) ENGINE=InnoDB; +--let $auto_increment_offset_node_1 = `SELECT @@global.auto_increment_offset` # auto_increment_increment is equal to the number of nodes -# auto_increment_offset is equal to the ID of the node - SELECT @@auto_increment_increment = (SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'); -SELECT @@global.auto_increment_offset = (SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_index') + 1; + +--connection node_2 +--disable_query_log +--eval SELECT @@global.auto_increment_offset != $auto_increment_offset_node_1 AS auto_increment_offset_differ; +--enable_query_log # Expect no conflicts +--connection node_1 --send INSERT INTO t1 VALUES (DEFAULT, 'node1'); --connection node_2 @@ -27,10 +31,18 @@ SELECT @@global.auto_increment_offset = (SELECT VARIABLE_VALUE FROM INFORMATION_ --connection node_2 --reap +--let $auto_increment_offset_node_2 = `SELECT @@global.auto_increment_offset` +# auto_increment_increment is equal to the number of nodes SELECT @@auto_increment_increment = (SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'); -SELECT @@global.auto_increment_offset = (SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_index') + 1; + +--connection node_1 +--disable_query_log +--eval SELECT @@global.auto_increment_offset != $auto_increment_offset_node_2 AS auto_increment_offset_differ; +--enable_query_log + # Expect no conflicts +--connection node_2 --send INSERT INTO t1 VALUES (DEFAULT, 'node2'), (DEFAULT, 'node2'), (DEFAULT, 'node2'), (DEFAULT, 'node2'), (DEFAULT, 'node2'), (DEFAULT, 'node2'), (DEFAULT, 'node2'), (DEFAULT, 'node2'), (DEFAULT, 'node2'), (DEFAULT, 'node2'); --connection node_1 diff --git a/mysql-test/suite/galera/t/galera_var_cluster_address.test b/mysql-test/suite/galera/t/galera_var_cluster_address.test index 03706bbbb..6d99d35cd 100644 --- a/mysql-test/suite/galera/t/galera_var_cluster_address.test +++ b/mysql-test/suite/galera/t/galera_var_cluster_address.test @@ -24,7 +24,6 @@ SET GLOBAL wsrep_cluster_address = 'foo://'; SET SESSION wsrep_sync_wait=0; ---error ER_UNKNOWN_COM_ERROR SELECT COUNT(*) > 0 FROM INFORMATION_SCHEMA.GLOBAL_STATUS; # Must return 'OFF' diff --git a/mysql-test/suite/galera/t/galera_var_dirty_reads.test b/mysql-test/suite/galera/t/galera_var_dirty_reads.test index cba8488b8..1f01c4aac 100644 --- a/mysql-test/suite/galera/t/galera_var_dirty_reads.test +++ b/mysql-test/suite/galera/t/galera_var_dirty_reads.test @@ -4,6 +4,12 @@ --source include/galera_cluster.inc --source include/have_innodb.inc +--source include/have_perfschema.inc + +# Save original auto_increment_offset values. +--let $node_1=node_1 +--let $node_2=node_2 +--source include/auto_increment_offset_save.inc # Save original auto_increment_offset values. --let $node_1=node_1 @@ -49,13 +55,10 @@ SELECT i, variable_name, variable_value FROM t1, information_schema.session_vari SELECT 1; ---error ER_UNKNOWN_COM_ERROR USE information_schema; ---error ER_UNKNOWN_COM_ERROR SELECT * FROM information_schema.session_variables WHERE variable_name LIKE "wsrep_dirty_reads"; ---error ER_UNKNOWN_COM_ERROR SELECT COUNT(*) >= 10 FROM performance_schema.events_statements_history; --disable_query_log diff --git a/mysql-test/suite/galera/t/galera_var_node_address.test b/mysql-test/suite/galera/t/galera_var_node_address.test index 3353652d8..22e98e3aa 100644 --- a/mysql-test/suite/galera/t/galera_var_node_address.test +++ b/mysql-test/suite/galera/t/galera_var_node_address.test @@ -8,6 +8,7 @@ call mtr.add_suppression("WSREP: Stray state UUID msg: .* current group state WAIT_STATE_UUID .*"); call mtr.add_suppression("WSREP: Protocol violation. JOIN message sender .* is not in state transfer (.*). Message ignored."); +call mtr.add_suppression("WSREP: Sending JOIN failed: -[0-9]+ (Transport endpoint is not connected). Will retry in new primary component."); SELECT VARIABLE_VALUE = 4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; diff --git a/mysql-test/suite/galera/t/galera_var_reject_queries.test b/mysql-test/suite/galera/t/galera_var_reject_queries.test new file mode 100644 index 000000000..6859855c3 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_var_reject_queries.test @@ -0,0 +1,44 @@ +# +# Test wsrep_reject_queries +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +CREATE TABLE t1 (f1 INTEGER); + +--connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1 + +--connection node_1 +--error ER_GLOBAL_VARIABLE +SET SESSION wsrep_reject_queries = ALL; + +SET GLOBAL wsrep_reject_queries = ALL; + +--error ER_UNKNOWN_COM_ERROR +SELECT * FROM t1; + +# Lost connection +--error 2013 +SET GLOBAL wsrep_reject_queries = ALL_KILL; + +--connection node_1a +--error ER_CONNECTION_KILLED,2013,2006 +SELECT * FROM t1; + +--connect node_1b, 127.0.0.1, root, , test, $NODE_MYPORT_1 +--error ER_UNKNOWN_COM_ERROR +SELECT * FROM t1; + +# Confirm that replication continues + +--connection node_2 +SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +INSERT INTO t1 VALUES (1); + +--connect node_1c, 127.0.0.1, root, , test, $NODE_MYPORT_1 +SET GLOBAL wsrep_reject_queries = NONE; + +SELECT COUNT(*) = 1 FROM t1; + +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/galera_var_retry_autocommit.test b/mysql-test/suite/galera/t/galera_var_retry_autocommit.test index bf4da3234..142f02546 100644 --- a/mysql-test/suite/galera/t/galera_var_retry_autocommit.test +++ b/mysql-test/suite/galera/t/galera_var_retry_autocommit.test @@ -1,98 +1,141 @@ # -# Test that the wsrep_retry_autocommit variable is respected. We use an INSERT that -# proceeds very slowly due to extra SLEEP() in a trigger +# Test that the wsrep_retry_autocommit variable is respected. # --source include/galera_cluster.inc --source include/have_innodb.inc +--source include/have_debug_sync.inc ---connection node_1 -CREATE TABLE t1 (f1 INTEGER PRIMARY KEY, f2 INTEGER) ENGINE=InnoDB; -CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW SET NEW.f2 = SLEEP(5); +--connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1 # # With wsrep_retry_autocommit = 0, error is certain # --connection node_1 +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB; + SET SESSION wsrep_retry_autocommit = 0; ---send INSERT INTO t1 (f1) VALUES (1),(2); +SET DEBUG_SYNC = 'wsrep_before_replication SIGNAL before_rep WAIT_FOR continue'; +--send INSERT INTO t1 (f1) VALUES (2) + +--connection node_1a +SET DEBUG_SYNC = 'now WAIT_FOR before_rep'; --connection node_2 ---sleep 1 TRUNCATE TABLE t1; --connection node_1 --error ER_LOCK_DEADLOCK --reap +SELECT COUNT(*) = 0 FROM t1; + +SET DEBUG_SYNC = 'RESET'; +DROP TABLE t1; + # # With wsrep_retry_autocommit = 1, success against one TRUNCATE # --connection node_1 +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB; + SET SESSION wsrep_retry_autocommit = 1; ---send INSERT INTO t1 (f1) VALUES (3),(4); +SET DEBUG_SYNC = 'wsrep_before_replication SIGNAL before_rep WAIT_FOR continue'; +--send INSERT INTO t1 (f1) VALUES (2) + +--connection node_1a +SET DEBUG_SYNC = 'now WAIT_FOR before_rep'; --connection node_2 ---sleep 1 TRUNCATE TABLE t1; --connection node_1 ---error 0 --reap -SELECT * FROM test.t1; +SELECT COUNT(*) = 1 FROM t1; + +SET DEBUG_SYNC = 'RESET'; +DROP TABLE t1; + # -# With wsrep_retry_autocommit = 1, failure against multiple TRUNCATEs +# With wsrep_retry_autcommit = 1, failure against multiple TRUNCATEs # +--connection node_1 +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB; + +SET SESSION wsrep_retry_autocommit = 1; +SET GLOBAL debug_dbug = '+d,sync.wsrep_retry_autocommit'; +SET DEBUG_SYNC = 'wsrep_before_replication SIGNAL before_rep WAIT_FOR continue EXECUTE 2'; + +--send INSERT INTO t1 VALUES (2); + +--connection node_1a +SET DEBUG_SYNC = 'now WAIT_FOR before_rep'; + --connection node_2 -DELIMITER |; -CREATE PROCEDURE repeated_truncate () -BEGIN - DECLARE i INT; - DECLARE CONTINUE HANDLER FOR SQLEXCEPTION BEGIN END; - - SET i = 0; - WHILE i <= 1000 DO - TRUNCATE TABLE t1; - SET i = i + 1; - END WHILE; -END| -DELIMITER ;| - -# Begin streaming TRUNCATEs ---let $truncate_connection_id = `SELECT CONNECTION_ID()` ---send CALL repeated_truncate() +TRUNCATE TABLE t1; + +--connection node_1a +SET DEBUG_SYNC = 'now WAIT_FOR wsrep_retry_autocommit_reached'; +SELECT COUNT(*) = 0 FROM t1; +SET DEBUG_SYNC = 'now SIGNAL wsrep_retry_autocommit_continue WAIT_FOR before_rep'; + +--connection node_2 +TRUNCATE TABLE t1; + +--connection node_1a +SELECT COUNT(*) = 0 FROM t1; --connection node_1 -SET SESSION wsrep_retry_autocommit = 1; ---sleep 1 --error ER_LOCK_DEADLOCK -INSERT INTO t1 (f1) VALUES (5),(6); +--reap + +SET DEBUG_SYNC = 'RESET'; +SET GLOBAL debug_dbug = NULL; +DROP TABLE t1; + # -# With wsrep_retry_autocommit = 1024, success against multiple TRUNCATEs +# With wsrep_retry_autocommit = 64, success against 64 TRUNCATEs # --connection node_1 -SET SESSION wsrep_retry_autocommit = 1024; ---send INSERT INTO t1 (f1) VALUES (7),(8); +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB; ---sleep 6 +SET SESSION wsrep_retry_autocommit = 64; +SET GLOBAL debug_dbug = '+d,sync.wsrep_retry_autocommit'; +SET DEBUG_SYNC = 'wsrep_before_replication SIGNAL before_rep WAIT_FOR continue EXECUTE 64'; -# Once he stream of TRUNCATEs is complete ---connection node_2 ---reap +--send INSERT INTO t1 VALUES (2) + +--disable_query_log +--disable_result_log +--let $count = 64 +while ($count) +{ + --connection node_1a + SET DEBUG_SYNC = 'now WAIT_FOR before_rep'; + + --connection node_2 + TRUNCATE TABLE t1; + + --connection node_1a + SET DEBUG_SYNC = 'now WAIT_FOR wsrep_retry_autocommit_reached'; + SELECT COUNT(*) = 1 FROM t1; + SET DEBUG_SYNC = 'now SIGNAL wsrep_retry_autocommit_continue'; + + --dec $count +} +--enable_result_log +--enable_query_log -# the INSERT will eventually be sucessfull --connection node_1 ---error 0 --reap +SELECT COUNT(*) = 1 FROM t1; ---let $diff_servers = 1 2 ---source include/diff_servers.inc - +SET DEBUG_SYNC = 'RESET'; +SET GLOBAL debug_dbug = NULL; DROP TABLE t1; -DROP PROCEDURE repeated_truncate; diff --git a/mysql-test/suite/galera/t/galera_var_slave_threads.test b/mysql-test/suite/galera/t/galera_var_slave_threads.test index 5e56800c5..0afda948e 100644 --- a/mysql-test/suite/galera/t/galera_var_slave_threads.test +++ b/mysql-test/suite/galera/t/galera_var_slave_threads.test @@ -6,7 +6,6 @@ --source include/galera_cluster.inc --source include/have_innodb.inc -CALL mtr.add_suppression("WSREP: Refusing exit for the last slave thread."); --let $wsrep_slave_threads_orig = `SELECT @@wsrep_slave_threads` --connection node_1 @@ -14,7 +13,7 @@ CREATE TABLE t1 (f1 INT PRIMARY KEY) Engine=InnoDB; CREATE TABLE t2 (f1 INT AUTO_INCREMENT PRIMARY KEY) Engine=InnoDB; --connection node_2 - +CALL mtr.add_suppression("WSREP: Refusing exit for the last slave thread."); # Setting wsrep_slave_threads to zero triggers a warning SET GLOBAL wsrep_slave_threads = 0; SHOW WARNINGS; @@ -30,15 +29,14 @@ SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'system use # SET GLOBAL wsrep_slave_threads = 64; ---sleep 0.5 --connection node_1 INSERT INTO t1 VALUES (1); --connection node_2 SELECT COUNT(*) = 1 FROM t1; - -SELECT COUNT(*) = @@wsrep_slave_threads + 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'system user'; +--let $wait_condition = SELECT COUNT(*) = @@wsrep_slave_threads + 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'system user'; +--source include/wait_condition.inc SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'system user' AND STATE LIKE '%wsrep aborter%'; # @@ -59,8 +57,8 @@ while ($count) --connection node_2 SELECT COUNT(*) = 64 FROM t2; - -SELECT COUNT(*) = @@wsrep_slave_threads + 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'system user'; +--let $wait_condition = SELECT COUNT(*) = @@wsrep_slave_threads + 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'system user'; +--source include/wait_condition.inc SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'system user' AND STATE LIKE '%wsrep aborter%'; @@ -78,7 +76,30 @@ CREATE TABLE t1 (i INT AUTO_INCREMENT PRIMARY KEY) ENGINE=INNODB; --connection node_2 SET GLOBAL wsrep_slave_threads = 4; +--let $wait_condition = SELECT COUNT(*) = @@wsrep_slave_threads + 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'system user' +--source include/wait_condition.inc + SET GLOBAL wsrep_slave_threads = 1; + +--connection node_1 +INSERT INTO t1 VALUES (DEFAULT); +INSERT INTO t1 VALUES (DEFAULT); +INSERT INTO t1 VALUES (DEFAULT); DROP TABLE t1; +--connection node_2 + +# Wait until above DDL is replicated +--let $wait_condition = SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME LIKE 'test/t%'; +--source include/wait_condition.inc + +SELECT NAME FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME LIKE 'test/t%'; + +# +# make sure that we are left with exactly one applier thread before we leaving the test +# +--let $wait_condition = SELECT COUNT(*) = 2 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'system user' +--source include/wait_condition.inc +SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'system user' AND STATE LIKE '%wsrep aborter%'; + --echo # End of tests diff --git a/mysql-test/suite/galera/t/galera_wsrep_desync_wsrep_on.test b/mysql-test/suite/galera/t/galera_wsrep_desync_wsrep_on.test index 3c7988a49..ecf255f59 100644 --- a/mysql-test/suite/galera/t/galera_wsrep_desync_wsrep_on.test +++ b/mysql-test/suite/galera/t/galera_wsrep_desync_wsrep_on.test @@ -17,6 +17,8 @@ CREATE TABLE t1 (f1 INTEGER) Engine=InnoDB; INSERT INTO t1 (f1) SELECT 000000 + (10000 * a1.f1) + (1000 * a2.f1) + (100 * a3.f1) + (10 * a4.f1) + a5.f1 FROM ten AS a1, ten AS a2, ten AS a3, ten AS a4, ten AS a5; --connection node_2 +SELECT COUNT(*) = 100000 FROM t1; + SET GLOBAL wsrep_desync = TRUE; SET SESSION wsrep_on = FALSE; diff --git a/mysql-test/suite/galera/t/lp1376747-2.test b/mysql-test/suite/galera/t/lp1376747-2.test index 360681d76..c570dd7d1 100644 --- a/mysql-test/suite/galera/t/lp1376747-2.test +++ b/mysql-test/suite/galera/t/lp1376747-2.test @@ -5,6 +5,13 @@ CREATE TABLE t1 (id INT PRIMARY KEY) ENGINE=InnoDB; INSERT INTO t1 VALUES (1); --connection node_2 + +# Wait until above DDL's are replicated +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME LIKE 'test/t%'; +--source include/wait_condition.inc + +SELECT NAME FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME LIKE 'test/t%'; + FLUSH TABLES t1 FOR EXPORT; --connection node_1 diff --git a/mysql-test/suite/galera/t/lp1376747.test b/mysql-test/suite/galera/t/lp1376747.test index 769bb665c..7daa54468 100644 --- a/mysql-test/suite/galera/t/lp1376747.test +++ b/mysql-test/suite/galera/t/lp1376747.test @@ -5,6 +5,13 @@ CREATE TABLE t1 (id INT PRIMARY KEY) ENGINE=InnoDB; INSERT INTO t1 VALUES (1); --connection node_2 + +# Wait until above DDL's are replicated +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME LIKE 'test/t%'; +--source include/wait_condition.inc + +SELECT NAME FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME LIKE 'test/t%'; + FLUSH TABLES t1 WITH READ LOCK; --connection node_1 diff --git a/mysql-test/suite/galera/t/mysql-wsrep#33.test b/mysql-test/suite/galera/t/mysql-wsrep#33.test index acc7c7358..351e457f1 100644 --- a/mysql-test/suite/galera/t/mysql-wsrep#33.test +++ b/mysql-test/suite/galera/t/mysql-wsrep#33.test @@ -3,6 +3,9 @@ --source include/galera_cluster.inc --source include/have_innodb.inc +--let $node_1=node_1 +--let $node_2=node_2 +--source suite/galera/include/auto_increment_offset_save.inc --source suite/galera/include/galera_sst_set_mysqldump.inc --source suite/galera/include/galera_st_disconnect_slave.inc @@ -10,9 +13,8 @@ --source suite/galera/include/galera_sst_restore.inc --connection node_2 -# We have to manually restore global_log and slow_query_log due to mysql-wsrep#108 -# Otherwise MTR's check_testcases complains -SET GLOBAL general_log = ON; -SET GLOBAL slow_query_log = ON; +--echo Restarting server ... +--source include/restart_mysqld.inc +--source suite/galera/include/auto_increment_offset_restore.inc diff --git a/mysql-test/suite/galera/t/mysql-wsrep#90.test b/mysql-test/suite/galera/t/mysql-wsrep#90.test index 5af86fb28..11ef64165 100644 --- a/mysql-test/suite/galera/t/mysql-wsrep#90.test +++ b/mysql-test/suite/galera/t/mysql-wsrep#90.test @@ -31,6 +31,7 @@ SELECT COUNT(*) = 2 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 't1'; --connection node_1 DROP TABLE t1; +SET DEBUG_SYNC = 'RESET'; CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) Engine=InnoDB; @@ -63,3 +64,4 @@ INSERT INTO t1 VALUES (3,4); DROP TABLE t1; SET GLOBAL WSREP_OSU_METHOD = TOI; +SET DEBUG_SYNC = 'RESET'; diff --git a/mysql-test/suite/galera/t/pxc-421.test b/mysql-test/suite/galera/t/pxc-421.test index 381f9bb44..33a2b157f 100644 --- a/mysql-test/suite/galera/t/pxc-421.test +++ b/mysql-test/suite/galera/t/pxc-421.test @@ -6,6 +6,11 @@ --source include/galera_cluster.inc --source include/have_innodb.inc +# Save original auto_increment_offset values. +--let $node_1=node_1 +--let $node_2=node_2 +--source include/auto_increment_offset_save.inc + --connection node_1 --let $wsrep_slave_1 = `SELECT @@wsrep_slave_threads` set GLOBAL wsrep_slave_threads=26; @@ -31,9 +36,7 @@ INSERT INTO t1 VALUES (3); --eval SET GLOBAL wsrep_cluster_address = '$wsrep_cluster_address_orig'; --enable_query_log -set SESSION wsrep_sync_wait=0; --source include/wait_until_connected_again.inc ---source include/galera_wait_ready.inc INSERT INTO t1 VALUES (4); set GLOBAL wsrep_slave_threads=5; @@ -54,12 +57,11 @@ show global variables like 'wsrep_slave_threads'; --eval SET GLOBAL wsrep_slave_threads = $wsrep_slave_2 SELECT COUNT(*) FROM t1; -SET GLOBAL auto_increment_offset = 2; - --connection node_1 SELECT COUNT(*) FROM t1; show global variables like 'wsrep_slave_threads'; --eval SET GLOBAL wsrep_slave_threads = $wsrep_slave_1 DROP TABLE t1; -SET GLOBAL auto_increment_offset = 1; +--source include/auto_increment_offset_restore.inc + diff --git a/mysql-test/suite/galera_3nodes/r/galera_evs_suspect_timeout.result b/mysql-test/suite/galera_3nodes/r/galera_evs_suspect_timeout.result index 1464222a0..7e0d282ec 100644 --- a/mysql-test/suite/galera_3nodes/r/galera_evs_suspect_timeout.result +++ b/mysql-test/suite/galera_3nodes/r/galera_evs_suspect_timeout.result @@ -11,6 +11,7 @@ SET SESSION wsrep_sync_wait = 0; SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; VARIABLE_VALUE = 2 1 +SET SESSION wsrep_sync_wait = DEFAULT; SELECT COUNT(*) = 1 FROM t1; COUNT(*) = 1 1 diff --git a/mysql-test/suite/galera_3nodes/t/galera_evs_suspect_timeout.test b/mysql-test/suite/galera_3nodes/t/galera_evs_suspect_timeout.test index a87f19ac9..03236a3cb 100644 --- a/mysql-test/suite/galera_3nodes/t/galera_evs_suspect_timeout.test +++ b/mysql-test/suite/galera_3nodes/t/galera_evs_suspect_timeout.test @@ -50,6 +50,7 @@ SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_N --enable_query_log --source include/wait_until_connected_again.inc +SET SESSION wsrep_sync_wait = DEFAULT; SELECT COUNT(*) = 1 FROM t1; DROP TABLE t1; diff --git a/mysql-test/suite/galera_3nodes/t/galera_pc_weight.test b/mysql-test/suite/galera_3nodes/t/galera_pc_weight.test index c118b7481..d69881aa5 100644 --- a/mysql-test/suite/galera_3nodes/t/galera_pc_weight.test +++ b/mysql-test/suite/galera_3nodes/t/galera_pc_weight.test @@ -9,16 +9,12 @@ --connection node_1 SET GLOBAL wsrep_provider_options = 'pc.weight=3'; - ---source include/wait_until_connected_again.inc --source include/galera_suspend.inc --sleep 10 --connection node_2 # Do not wait for causality as we are no longer in the primary component SET SESSION wsrep_sync_wait=0; ---source include/wait_until_connected_again.inc - SET SESSION wsrep_on=OFF; --let $wait_condition = SELECT VARIABLE_VALUE = 'non-Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status' --source include/wait_condition.inc @@ -39,7 +35,6 @@ SHOW STATUS LIKE 'wsrep_local_state_comment'; --source include/galera_connect.inc --connection node_3 SET SESSION wsrep_sync_wait=0; ---source include/wait_until_connected_again.inc SHOW STATUS LIKE 'wsrep_cluster_size'; SHOW STATUS LIKE 'wsrep_cluster_status'; diff --git a/mysql-test/suite/handler/handler.inc b/mysql-test/suite/handler/handler.inc index c71dc53e5..25c72965c 100644 --- a/mysql-test/suite/handler/handler.inc +++ b/mysql-test/suite/handler/handler.inc @@ -377,7 +377,9 @@ send optimize table t1; # client 1 --echo proceed with the normal connection connection default; +--disable_ps_protocol handler t1 read next; +--enable_ps_protocol handler t1 close; # client 2 --echo read the result from the other connection diff --git a/mysql-test/suite/handler/interface.result b/mysql-test/suite/handler/interface.result index 89dec29f4..c9cffba33 100644 --- a/mysql-test/suite/handler/interface.result +++ b/mysql-test/suite/handler/interface.result @@ -269,7 +269,7 @@ handler t1 open; lock table t1 write; alter table t1 engine=csv; handler t1 read a next; -ERROR HY000: Storage engine CSV of the table `test`.`t1` doesn't have this option +Got one of the listed errors handler t1 close; unlock tables; drop table t1; diff --git a/mysql-test/suite/handler/interface.test b/mysql-test/suite/handler/interface.test index 2ef617c3c..06797ed69 100644 --- a/mysql-test/suite/handler/interface.test +++ b/mysql-test/suite/handler/interface.test @@ -326,7 +326,7 @@ let $wait_condition= info = "alter table t1 engine=csv"; --source include/wait_condition.inc connection default; ---error ER_ILLEGAL_HA +--error ER_ILLEGAL_HA,ER_KEY_DOES_NOT_EXITS handler t1 read a next; handler t1 close; connection con1; diff --git a/mysql-test/suite/handler/ps.result b/mysql-test/suite/handler/ps.result new file mode 100644 index 000000000..54685f915 --- /dev/null +++ b/mysql-test/suite/handler/ps.result @@ -0,0 +1,9 @@ +create table t1 (i int); +handler test.t1 open handler_a; +flush status; +handler handler_a read first; +i +show status like 'Com_stmt_prepare%'; +Variable_name Value +Com_stmt_prepare OK +drop table t1; diff --git a/mysql-test/suite/handler/ps.test b/mysql-test/suite/handler/ps.test new file mode 100644 index 000000000..68091190c --- /dev/null +++ b/mysql-test/suite/handler/ps.test @@ -0,0 +1,11 @@ +# +# MDEV-15729 Server crashes in Field::make_field upon HANDLER READ executed with PS protocol +# +create table t1 (i int); +handler test.t1 open handler_a; +flush status; +handler handler_a read first; +# handler...read must be prepared in --ps-protocol mode +--replace_result $PS_PROTOCOL OK +show status like 'Com_stmt_prepare%'; +drop table t1; diff --git a/mysql-test/suite/innodb/r/alter_partitioned_xa.result b/mysql-test/suite/innodb/r/alter_partitioned_xa.result new file mode 100644 index 000000000..4bce2f867 --- /dev/null +++ b/mysql-test/suite/innodb/r/alter_partitioned_xa.result @@ -0,0 +1,15 @@ +# +# MDEV-14693 XA: Assertion `!clust_index->online_log' failed +# in rollback_inplace_alter_table +# +CREATE TABLE t1 (a INT, b INT) ENGINE=InnoDB PARTITION BY HASH(a) PARTITIONS 2; +XA START 'xid'; +INSERT INTO t1 VALUES (1,10); +CREATE DATABASE IF NOT EXISTS db; +ERROR XAE07: XAER_RMFAIL: The command cannot be executed when global transaction is in the ACTIVE state +SET innodb_lock_wait_timeout= 1, lock_wait_timeout= 2; +ALTER TABLE t1 FORCE; +ERROR HY000: Lock wait timeout exceeded; try restarting transaction +XA END 'xid'; +XA ROLLBACK 'xid'; +DROP TABLE t1; diff --git a/mysql-test/suite/innodb/r/create-index-debug.result b/mysql-test/suite/innodb/r/create-index-debug.result index 99f6efe9b..9d266c68a 100644 --- a/mysql-test/suite/innodb/r/create-index-debug.result +++ b/mysql-test/suite/innodb/r/create-index-debug.result @@ -10,9 +10,6 @@ CHAR(255) NOT NULL, f13 CHAR(255) NOT NULL, f14 CHAR(255) NOT NULL,f15 CHAR(255) NOT NULL, f16 CHAR(255) NOT NULL, f17 CHAR(255) NOT NULL,f18 CHAR(255) NOT NULL) ENGINE=INNODB ROW_FORMAT=DYNAMIC; -Warnings: -Warning 1478 InnoDB: ROW_FORMAT=DYNAMIC requires innodb_file_format > Antelope. -Warning 1478 InnoDB: assuming ROW_FORMAT=COMPACT. INSERT INTO t1 VALUES('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r'); INSERT INTO t1 SELECT * FROM t1; diff --git a/mysql-test/suite/innodb/r/default_row_format_alter.result b/mysql-test/suite/innodb/r/default_row_format_alter.result new file mode 100644 index 000000000..1f4f78ee6 --- /dev/null +++ b/mysql-test/suite/innodb/r/default_row_format_alter.result @@ -0,0 +1,85 @@ +SET @row_format = @@GLOBAL.innodb_default_row_format; +#################################### +# Check if table rebuilding alter isn't affect if table is created +# with explicit row_format +CREATE TABLE t1 (a INT PRIMARY KEY, b TEXT) ROW_FORMAT=COMPACT ENGINE=INNODB; +INSERT INTO t1 VALUES (1, 'abc'); +SHOW TABLE STATUS LIKE 't1'; +Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment +t1 InnoDB # Compact # # # # # # NULL # NULL NULL latin1_swedish_ci NULL row_format=COMPACT +SET GLOBAL innodb_default_row_format=DYNAMIC; +ALTER TABLE t1 DROP PRIMARY KEY, ADD COLUMN c INT PRIMARY KEY; +# Here we expect COMPACT because it was explicitly specified at CREATE +SHOW TABLE STATUS LIKE 't1'; +Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment +t1 InnoDB # Compact # # # # # # NULL # NULL NULL latin1_swedish_ci NULL row_format=COMPACT +DROP TABLE t1; +#################################### +# Check if table rebuilding alter is affected when there is no +# row_format specified at CREATE TABLE. +SET GLOBAL innodb_default_row_format = COMPACT; +CREATE TABLE t1 (a INT PRIMARY KEY, b TEXT) ENGINE=INNODB; +INSERT INTO t1 VALUES (1, 'abc'); +SHOW TABLE STATUS LIKE 't1'; +Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment +t1 InnoDB # Compact # # # # # # NULL # NULL NULL latin1_swedish_ci NULL +SET GLOBAL innodb_default_row_format = DYNAMIC; +ALTER TABLE t1 DROP PRIMARY KEY, ADD COLUMN c INT PRIMARY KEY; +# Here we expect DYNAMIC because there is no explicit ROW_FORMAT and the +# default_row_format is changed to DYNAMIC just before ALTER +SHOW TABLE STATUS LIKE 't1'; +Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment +t1 InnoDB # Dynamic # # # # # # NULL # NULL NULL latin1_swedish_ci NULL +DROP TABLE t1; +#################################### +# Check the row_format effect on ALTER, ALGORITHM=COPY +SET GLOBAL innodb_default_row_format = REDUNDANT; +CREATE TABLE t1 (a INT PRIMARY KEY, b TEXT) ENGINE=INNODB; +INSERT INTO t1 VALUES (1, REPEAT('abc',1000)); +SHOW TABLE STATUS LIKE 't1'; +Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment +t1 InnoDB # Redundant # # # # # # NULL # NULL NULL latin1_swedish_ci NULL +SET GLOBAL innoDB_default_row_format = COMPACT; +ALTER TABLE t1 ADD COLUMN c2 BLOB, ALGORITHM=COPY; +# Because of ALGORITHM=COPY, there is TABLE REBUILD and the table isn't +# created with explicit row_format, so we expect ROW_FORMAT=COMPACT +SHOW TABLE STATUS LIKE 't1'; +Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment +t1 InnoDB # Compact # # # # # # NULL # NULL NULL latin1_swedish_ci NULL +DROP TABLE t1; + +################################### +# Check the row_format effect on ALTER, ALGORITH=COPY on +# create table with explicit row_format +CREATE TABLE t1 (a INT PRIMARY KEY, b TEXT) ROW_FORMAT=REDUNDANT ENGINE=INNODB; +INSERT INTO t1 VALUES (1, REPEAT('abc',1000)); +SHOW TABLE STATUS LIKE 't1'; +Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment +t1 InnoDB # Redundant # # # # # # NULL # NULL NULL latin1_swedish_ci NULL row_format=REDUNDANT +SET GLOBAL innoDB_default_row_format = COMPACT; +ALTER TABLE t1 ADD COLUMN c2 BLOB, ALGORITHM=COPY; +# Because of ALGORITHM=COPY, there is TABLE REBUILD and the table is +# created with explicit row_format, so we expect original +# ROW_FORMAT=REDUNDANT +SHOW TABLE STATUS LIKE 't1'; +Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment +t1 InnoDB # Redundant # # # # # # NULL # NULL NULL latin1_swedish_ci NULL row_format=REDUNDANT +DROP TABLE t1; + +################################## +# Check row_format on ALTER ALGORITHM=INPLACE +SET GLOBAL innodb_default_row_format=COMPACT; +CREATE TABLE t1 (a INT PRIMARY KEY, b TEXT, KEY k1(b(10))) ENGINE=INNODB; +INSERT INTO t1 VALUES (1, REPEAT('abc',1000)); +SHOW TABLE STATUS LIKE 't1'; +Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment +t1 InnoDB # Compact # # # # # # NULL # NULL NULL latin1_swedish_ci NULL +SET GLOBAL innodb_default_row_format=DYNAMIC; +ALTER TABLE t1 DROP INDEX k1; +# Because it is in-place operation, there is no rebuild, so the +# original format has to be retained. +SHOW TABLE STATUS LIKE 't1'; +Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment +t1 InnoDB # Compact # # # # # # NULL # NULL NULL latin1_swedish_ci NULL +DROP TABLE t1; +SET GLOBAL innodb_default_row_format = @row_format; diff --git a/mysql-test/suite/innodb/r/default_row_format_compatibility.result b/mysql-test/suite/innodb/r/default_row_format_compatibility.result new file mode 100644 index 000000000..6ba83f041 --- /dev/null +++ b/mysql-test/suite/innodb/r/default_row_format_compatibility.result @@ -0,0 +1,103 @@ +SET @row_format = @@GLOBAL.innodb_default_row_format; +SET @large_prefix = @@GLOBAL.innodb_large_prefix; +SET @file_format = @@GLOBAL.innodb_file_format; +SET GLOBAL innodb_file_format = barracuda; +# ########################################################### +# Check with Import/Export tablespace with Default_row_format +SET GLOBAL innodb_default_row_format=Compact; +SELECT @@innodb_default_row_format; +@@innodb_default_row_format +compact +SELECT @@innodb_file_per_table; +@@innodb_file_per_table +1 +CREATE TABLE tab(a INT) ENGINE=InnoDB; +SHOW TABLE STATUS LIKE 'tab'; +Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment +tab InnoDB # Compact # # # # # # NULL # NULL NULL latin1_swedish_ci NULL +INSERT INTO tab VALUES(1); +INSERT INTO tab VALUES(2); +SELECT * FROM tab; +a +1 +2 +FLUSH TABLE tab FOR EXPORT; +UNLOCK TABLES; +DROP TABLE tab; +SET GLOBAL innodb_default_row_format=Dynamic; +CREATE TABLE tab(a INT) ENGINE=InnoDB; +ALTER TABLE tab DISCARD TABLESPACE; +ALTER TABLE tab IMPORT TABLESPACE; +ERROR HY000: Schema mismatch (Table flags don't match, server table has 0x21 and the meta-data file has 0x1) +DROP TABLE tab; +SET GLOBAL innodb_default_row_format=Compact; +SELECT @@innodb_default_row_format; +@@innodb_default_row_format +compact +CREATE TABLE tab(a INT) ENGINE=InnoDB; +SHOW TABLE STATUS LIKE 'tab'; +Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment +tab InnoDB # Compact # # # # # # NULL # NULL NULL latin1_swedish_ci NULL +ALTER TABLE tab DISCARD TABLESPACE; +call mtr.add_suppression("InnoDB: Tried to read .* bytes at offset 0"); +ALTER TABLE tab IMPORT TABLESPACE; +ERROR HY000: Internal error: Cannot reset LSNs in table '"test"."tab"' : I/O error +ALTER TABLE tab IMPORT TABLESPACE; +SELECT * FROM tab; +a +1 +2 +DROP TABLE tab; +# ########################################################### +SET GLOBAL innodb_default_row_format=Dynamic; +SET GLOBAL innodb_large_prefix=ON; +SELECT @@innodb_default_row_format; +@@innodb_default_row_format +dynamic +CREATE TABLE tab(a INT PRIMARY KEY, b VARCHAR(5000), KEY idx1(b(3070))) ENGINE= InnoDB; +SHOW TABLE STATUS LIKE 'tab'; +Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment +tab InnoDB # Dynamic # # # # # # NULL # NULL NULL latin1_swedish_ci NULL +INSERT INTO tab(a,b) VALUES(1,'Check with max column size'); +SELECT * FROM tab; +a b +1 Check with max column size +SET GLOBAL innodb_default_row_format=COMPACT; +ALTER TABLE tab ROW_FORMAT=COMPACT; +ERROR HY000: Index column size too large. The maximum column size is 767 bytes. +DROP TABLE tab; +SET GLOBAL innodb_default_row_format=Default; +SELECT @@innodb_default_row_format; +@@innodb_default_row_format +compact +SET GLOBAL innodb_default_row_format=Dynamic; +SELECT @@innodb_default_row_format; +@@innodb_default_row_format +dynamic +CREATE TABLE tab(a INT PRIMARY KEY, b VARCHAR(5000), KEY idx1(b(767))) ENGINE= InnoDB; +SHOW TABLE STATUS LIKE 'tab'; +Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment +tab InnoDB # Dynamic # # # # # # NULL # NULL NULL latin1_swedish_ci NULL +INSERT INTO tab(a,b) VALUES(1,'Check with max column size'); +SELECT * FROM tab; +a b +1 Check with max column size +ALTER TABLE tab ROW_FORMAT=COMPACT; +SHOW TABLE STATUS LIKE 'tab'; +Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment +tab InnoDB # Compact # # # # # # NULL # NULL NULL latin1_swedish_ci NULL row_format=COMPACT +SELECT * FROM tab; +a b +1 Check with max column size +ALTER TABLE tab ROW_FORMAT=COMPRESSED; +SELECT * FROM tab; +a b +1 Check with max column size +ALTER TABLE tab ROW_FORMAT=Dynamic; +SHOW TABLE STATUS LIKE 'tab'; +Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment +tab InnoDB # Dynamic # # # # # # NULL # NULL NULL latin1_swedish_ci NULL row_format=DYNAMIC +DROP TABLE tab; +SET GLOBAL innodb_default_row_format = @row_format; +SET GLOBAL innodb_large_prefix = @large_prefix; +SET GLOBAL innodb_file_format = @file_format; diff --git a/mysql-test/suite/innodb/r/default_row_format_create,dynamic.rdiff b/mysql-test/suite/innodb/r/default_row_format_create,dynamic.rdiff new file mode 100644 index 000000000..bb23b7821 --- /dev/null +++ b/mysql-test/suite/innodb/r/default_row_format_create,dynamic.rdiff @@ -0,0 +1,11 @@ +--- default_row_format_create.result ++++ default_row_format_create,dynamic.result +@@ -1,7 +1,7 @@ + CREATE TABLE t1(c1 TEXT,c2 BLOB) ENGINE=InnoDB; + SHOW TABLE STATUS LIKE 't1'; + Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment +-t1 InnoDB # Compact # # # # # # NULL # NULL NULL latin1_swedish_ci NULL ++t1 InnoDB # Dynamic # # # # # # NULL # NULL NULL latin1_swedish_ci NULL + DROP TABLE t1; + CREATE TABLE t1(c1 TEXT,c2 BLOB) ENGINE=InnoDB ROW_FORMAT=DYNAMIC; + SHOW TABLE STATUS LIKE 't1'; diff --git a/mysql-test/suite/innodb/r/default_row_format_create,redundant.rdiff b/mysql-test/suite/innodb/r/default_row_format_create,redundant.rdiff new file mode 100644 index 000000000..35aa402ed --- /dev/null +++ b/mysql-test/suite/innodb/r/default_row_format_create,redundant.rdiff @@ -0,0 +1,11 @@ +--- default_row_format_create.result ++++ default_row_format_create,redundant.result +@@ -1,7 +1,7 @@ + CREATE TABLE t1(c1 TEXT,c2 BLOB) ENGINE=InnoDB; + SHOW TABLE STATUS LIKE 't1'; + Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment +-t1 InnoDB # Compact # # # # # # NULL # NULL NULL latin1_swedish_ci NULL ++t1 InnoDB # Redundant # # # # # # NULL # NULL NULL latin1_swedish_ci NULL + DROP TABLE t1; + CREATE TABLE t1(c1 TEXT,c2 BLOB) ENGINE=InnoDB ROW_FORMAT=DYNAMIC; + SHOW TABLE STATUS LIKE 't1'; diff --git a/mysql-test/suite/innodb/r/default_row_format_create.result b/mysql-test/suite/innodb/r/default_row_format_create.result new file mode 100644 index 000000000..4e90922d7 --- /dev/null +++ b/mysql-test/suite/innodb/r/default_row_format_create.result @@ -0,0 +1,31 @@ +CREATE TABLE t1(c1 TEXT,c2 BLOB) ENGINE=InnoDB; +SHOW TABLE STATUS LIKE 't1'; +Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment +t1 InnoDB # Compact # # # # # # NULL # NULL NULL latin1_swedish_ci NULL +DROP TABLE t1; +CREATE TABLE t1(c1 TEXT,c2 BLOB) ENGINE=InnoDB ROW_FORMAT=DYNAMIC; +SHOW TABLE STATUS LIKE 't1'; +Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment +t1 InnoDB # Dynamic # # # # # # NULL # NULL NULL latin1_swedish_ci NULL row_format=DYNAMIC +DROP TABLE t1; +CREATE TABLE t1(c1 TEXT,c2 BLOB) ENGINE=InnoDB ROW_FORMAT=COMPACT; +SHOW TABLE STATUS LIKE 't1'; +Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment +t1 InnoDB # Compact # # # # # # NULL # NULL NULL latin1_swedish_ci NULL row_format=COMPACT +DROP TABLE t1; +CREATE TABLE t1(c1 TEXT,c2 BLOB) ENGINE=InnoDB ROW_FORMAT=REDUNDANT; +SHOW TABLE STATUS LIKE 't1'; +Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment +t1 InnoDB # Redundant # # # # # # NULL # NULL NULL latin1_swedish_ci NULL row_format=REDUNDANT +DROP TABLE t1; +CREATE TABLE t1(c1 TEXT,c2 BLOB) ENGINE=InnoDB +ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=1; +Warnings: +Warning 1478 InnoDB: KEY_BLOCK_SIZE requires innodb_file_format > Antelope. +Warning 1478 InnoDB: ignoring KEY_BLOCK_SIZE=1. +Warning 1478 InnoDB: ROW_FORMAT=COMPRESSED requires innodb_file_format > Antelope. +Warning 1478 InnoDB: assuming ROW_FORMAT=COMPACT. +SHOW TABLE STATUS LIKE 't1'; +Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment +t1 InnoDB # Compact # # # # # # NULL # NULL NULL latin1_swedish_ci NULL row_format=COMPRESSED key_block_size=1 +DROP TABLE t1; diff --git a/mysql-test/suite/innodb/r/file_format_defaults.result b/mysql-test/suite/innodb/r/file_format_defaults.result new file mode 100644 index 000000000..981188f00 --- /dev/null +++ b/mysql-test/suite/innodb/r/file_format_defaults.result @@ -0,0 +1,56 @@ +SELECT @@innodb_strict_mode; +@@innodb_strict_mode +0 +SELECT @@innodb_file_per_table; +@@innodb_file_per_table +1 +SET @file_format = @@GLOBAL.innodb_file_format; +SET GLOBAL innodb_large_prefix=ON; +SET SQL_MODE=strict_all_tables; +CREATE TABLE tab0 (c1 VARCHAR(65530), KEY(c1(3073))) ENGINE=InnoDB ROW_FORMAT=COMPRESSED; +Warnings: +Warning 1071 Specified key was too long; max key length is 3072 bytes +SHOW CREATE TABLE tab0; +Table Create Table +tab0 CREATE TABLE `tab0` ( + `c1` varchar(65530) DEFAULT NULL, + KEY `c1` (`c1`(3072)) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=COMPRESSED +DROP TABLE tab0; +CREATE TABLE tab0 (c1 VARCHAR(65530), KEY(c1(3073))) ENGINE=InnoDB KEY_BLOCK_SIZE=2; +ERROR 42000: Row size too large (> 8126). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline. +SET GLOBAL innodb_file_format=Antelope; +CREATE TABLE tab0(c1 INT,c2 LONGBLOB ) ENGINE=InnoDB ROW_FORMAT=Dynamic; +DROP TABLE tab0; +SET GLOBAL innodb_file_format=Default; +SELECT @@innodb_file_format; +@@innodb_file_format +Antelope +SET GLOBAL innodb_strict_mode=OFF; +SET GLOBAL innodb_strict_mode=Default; +SELECT @@innodb_strict_mode; +@@innodb_strict_mode +0 +SET GLOBAL innodb_large_prefix=OFF; +SELECT @@innodb_large_prefix; +@@innodb_large_prefix +0 +SET GLOBAL innodb_large_prefix=Default; +SELECT @@innodb_large_prefix; +@@innodb_large_prefix +0 +SET GLOBAL innodb_file_format_max=Default; +SELECT @@innodb_file_format_max; +@@innodb_file_format_max +Antelope +CREATE TABLE tab1(c1 int ) ENGINE=InnoDB ROW_FORMAT=COMPRESSED; +Warnings: +Warning 1478 InnoDB: ROW_FORMAT=COMPRESSED requires innodb_file_format > Antelope. +Warning 1478 InnoDB: assuming ROW_FORMAT=COMPACT. +SELECT @@innodb_file_format_max; +@@innodb_file_format_max +Antelope +SET GLOBAL innodb_file_format_max=Default; +SET GLOBAL innodb_large_prefix=off; +SET GLOBAL innodb_file_format = @file_format; +DROP TABLE tab1; diff --git a/mysql-test/suite/innodb/r/innodb-alter-nullable.result b/mysql-test/suite/innodb/r/innodb-alter-nullable.result index e9711b2ac..2769bfdf1 100644 --- a/mysql-test/suite/innodb/r/innodb-alter-nullable.result +++ b/mysql-test/suite/innodb/r/innodb-alter-nullable.result @@ -51,3 +51,7 @@ WHERE NAME='test/t'; TABLE_ID NAME FLAG N_COLS SPACE FILE_FORMAT ROW_FORMAT ZIP_PAGE_SIZE # test/t 1 6 # Antelope Compact 0 DROP TABLE t; +CREATE TABLE t1(c1 INT) ENGINE=InnoDB; +ALTER TABLE t1 ADD CONSTRAINT UNIQUE KEY i1(c1); +ALTER TABLE t1 CHANGE c1 c1 INT NOT NULL,ADD KEY(c1); +DROP TABLE t1; diff --git a/mysql-test/suite/innodb/r/innodb-alter.result b/mysql-test/suite/innodb/r/innodb-alter.result index fadbcce33..d41df53e5 100644 --- a/mysql-test/suite/innodb/r/innodb-alter.result +++ b/mysql-test/suite/innodb/r/innodb-alter.result @@ -859,3 +859,32 @@ DROP TABLE dest_db.t1; DROP TABLE source_db.t1; DROP DATABASE source_db; DROP DATABASE dest_db; +# +# BUG #26334149 MYSQL CRASHES WHEN FULL TEXT INDEXES IBD FILES ARE +# ORPHANED DUE TO RENAME TABLE +# +CREATE DATABASE db1; +USE db1; +CREATE TABLE notes ( +id int(11) NOT NULL AUTO_INCREMENT, +body text COLLATE utf8_unicode_ci, +PRIMARY KEY (id) +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 +COLLATE=utf8_unicode_ci +ROW_FORMAT=COMPRESSED; +Warnings: +Warning 1478 InnoDB: ROW_FORMAT=COMPRESSED requires innodb_file_format > Antelope. +Warning 1478 InnoDB: assuming ROW_FORMAT=COMPACT. +ALTER TABLE notes ADD FULLTEXT INDEX index_ft_body (body(255)); +Warnings: +Warning 1478 InnoDB: ROW_FORMAT=COMPRESSED requires innodb_file_format > Antelope. +Warning 1478 InnoDB: assuming ROW_FORMAT=COMPACT. +Warning 124 InnoDB rebuilding table to add column FTS_DOC_ID +DROP INDEX index_ft_body ON notes; +Warnings: +Warning 1478 InnoDB: ROW_FORMAT=COMPRESSED requires innodb_file_format > Antelope. +Warning 1478 InnoDB: assuming ROW_FORMAT=COMPACT. +CREATE DATABASE db2; +RENAME TABLE db1.notes TO db2.notes; +DROP DATABASE db1; +DROP DATABASE db2; diff --git a/mysql-test/suite/innodb/r/innodb-blob.result b/mysql-test/suite/innodb/r/innodb-blob.result index eca779724..5d2101d8e 100644 --- a/mysql-test/suite/innodb/r/innodb-blob.result +++ b/mysql-test/suite/innodb/r/innodb-blob.result @@ -1,3 +1,4 @@ +FLUSH TABLES; CREATE TABLE t1 (a INT PRIMARY KEY, b TEXT) ENGINE=InnoDB; CREATE TABLE t2 (a INT PRIMARY KEY) ENGINE=InnoDB; CREATE TABLE t3 (a INT PRIMARY KEY, b TEXT, c TEXT) ENGINE=InnoDB; diff --git a/mysql-test/suite/innodb/r/innodb-page_compression_default.result b/mysql-test/suite/innodb/r/innodb-page_compression_default.result index 18f7fb5e0..19d0a875c 100644 --- a/mysql-test/suite/innodb/r/innodb-page_compression_default.result +++ b/mysql-test/suite/innodb/r/innodb-page_compression_default.result @@ -1,4 +1,3 @@ -call mtr.add_suppression("InnoDB: Compression failed for space [0-9]+ name test/innodb_page_compressed[0-9] len [0-9]+ err 2 write_size [0-9]+."); set global innodb_file_format = `Barracuda`; set global innodb_file_per_table = on; create table innodb_normal (c1 int not null auto_increment primary key, b char(200)) engine=innodb; diff --git a/mysql-test/suite/innodb/r/innodb-page_compression_snappy.result b/mysql-test/suite/innodb/r/innodb-page_compression_snappy.result index 74cfa9bce..824b671ee 100644 --- a/mysql-test/suite/innodb/r/innodb-page_compression_snappy.result +++ b/mysql-test/suite/innodb/r/innodb-page_compression_snappy.result @@ -1,4 +1,3 @@ -call mtr.add_suppression("InnoDB: Compression failed for space [0-9]+ name test/innodb_page_compressed[0-9] len [0-9]+ err 2 write_size [0-9]+."); set global innodb_compression_algorithm = snappy; set global innodb_file_format = `Barracuda`; set global innodb_file_per_table = on; diff --git a/mysql-test/suite/innodb/r/innodb_bug27216817.result b/mysql-test/suite/innodb/r/innodb_bug27216817.result new file mode 100644 index 000000000..0210ced9f --- /dev/null +++ b/mysql-test/suite/innodb/r/innodb_bug27216817.result @@ -0,0 +1,24 @@ +create table t1 (a int not null, b int not null) engine=innodb; +insert t1 values (1,2),(3,4); +lock table t1 write, t1 tr read; +flush status; +alter table t1 add primary key (b); +show status like 'Handler_read_rnd_next'; +Variable_name Value +Handler_read_rnd_next 0 +unlock tables; +alter table t1 drop primary key; +lock table t1 write; +flush status; +alter table t1 add primary key (b); +show status like 'Handler_read_rnd_next'; +Variable_name Value +Handler_read_rnd_next 0 +unlock tables; +alter table t1 drop primary key; +flush status; +alter table t1 add primary key (b); +show status like 'Handler_read_rnd_next'; +Variable_name Value +Handler_read_rnd_next 0 +drop table t1; diff --git a/mysql-test/suite/innodb/r/innodb_bug54044.result b/mysql-test/suite/innodb/r/innodb_bug54044.result index 7d6133adb..29b0127f2 100644 --- a/mysql-test/suite/innodb/r/innodb_bug54044.result +++ b/mysql-test/suite/innodb/r/innodb_bug54044.result @@ -16,9 +16,3 @@ tmp CREATE TABLE `tmp` ( `NULL` binary(0) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 DROP TABLE tmp; -CREATE TABLE t1 (a VARCHAR(3)) ENGINE=InnoDB; -INSERT INTO t1 VALUES ('foo'),('bar'); -FLUSH TABLES; -CREATE TEMPORARY TABLE tmp ENGINE=InnoDB AS SELECT VALUES(a) FROM t1; -ERROR HY000: Can't create table `test`.`tmp` (errno: -1 "Internal error < 0 (Not system error)") -DROP TABLE t1; diff --git a/mysql-test/suite/innodb/r/innodb_defragment_small.result b/mysql-test/suite/innodb/r/innodb_defragment_small.result index 3f594f79e..07e58f442 100644 --- a/mysql-test/suite/innodb/r/innodb_defragment_small.result +++ b/mysql-test/suite/innodb/r/innodb_defragment_small.result @@ -1,6 +1,13 @@ SET @innodb_defragment_orig=@@GLOBAL.innodb_defragment; +SET @innodb_optimize_fulltext_orig=@@GLOBAL.innodb_optimize_fulltext_only; SET GLOBAL innodb_defragment = 1; -CREATE TABLE t1 (a INT PRIMARY KEY, b VARCHAR(256), KEY(a, b)) ENGINE=INNODB; +SET GLOBAL innodb_optimize_fulltext_only = 0; +# +# MDEV-12198 innodb_defragment=1 crashes server on +# OPTIMIZE TABLE when FULLTEXT index exists +# +CREATE TABLE t1 (a INT PRIMARY KEY, b VARCHAR(256), +KEY(a, b), FULLTEXT KEY(b)) ENGINE=INNODB; OPTIMIZE TABLE t1; Table Op Msg_type Msg_text test.t1 optimize status OK @@ -11,14 +18,18 @@ INSERT INTO t1 VALUES (400000, REPEAT('A', 256)); OPTIMIZE TABLE t1; Table Op Msg_type Msg_text test.t1 optimize status OK -DROP TABLE t1; # -# MDEV-12198 innodb_defragment=1 crashes server on -# OPTIMIZE TABLE when FULLTEXT index exists +# MDEV-15824 innodb_defragment=ON trumps +# innodb_optimize_fulltext_only=ON in OPTIMIZE TABLE # -CREATE TABLE t1 (c TEXT, FULLTEXT KEY (c)) ENGINE=InnoDB; +SET GLOBAL innodb_optimize_fulltext_only = 1; +OPTIMIZE TABLE t1; +Table Op Msg_type Msg_text +test.t1 optimize status OK +SET GLOBAL innodb_defragment = 0; OPTIMIZE TABLE t1; Table Op Msg_type Msg_text test.t1 optimize status OK DROP TABLE t1; SET GLOBAL innodb_defragment = @innodb_defragment_orig; +SET GLOBAL innodb_optimize_fulltext_only = @innodb_optimize_fulltext_orig; diff --git a/mysql-test/suite/innodb/r/lock_deleted.result b/mysql-test/suite/innodb/r/lock_deleted.result new file mode 100644 index 000000000..d949ac945 --- /dev/null +++ b/mysql-test/suite/innodb/r/lock_deleted.result @@ -0,0 +1,40 @@ +START TRANSACTION WITH CONSISTENT SNAPSHOT; +CREATE TABLE t1(a INT PRIMARY KEY, b INT UNIQUE) ENGINE=InnoDB; +INSERT INTO t1 VALUES(1,1); +DELETE FROM t1; +SET DEBUG_SYNC='row_ins_sec_index_unique SIGNAL inserted WAIT_FOR locked'; +BEGIN; +INSERT INTO t1 VALUES(1,1); +SET DEBUG_SYNC='now WAIT_FOR inserted'; +SET DEBUG_SYNC='innodb_row_search_for_mysql_exit SIGNAL locked'; +SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED; +BEGIN; +DELETE FROM t1 WHERE b=1; +COMMIT; +SET DEBUG_SYNC='RESET'; +ROLLBACK; +SET DEBUG_SYNC='row_ins_sec_index_unique SIGNAL inserted WAIT_FOR locked'; +BEGIN; +INSERT INTO t1 VALUES(1,1); +SET DEBUG_SYNC='now WAIT_FOR inserted'; +SET DEBUG_SYNC='innodb_row_search_for_mysql_exit SIGNAL locked'; +SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; +BEGIN; +DELETE FROM t1 WHERE b=1; +COMMIT; +SET DEBUG_SYNC='RESET'; +ROLLBACK; +SET DEBUG_SYNC='row_ins_sec_index_unique SIGNAL inserted WAIT_FOR locked'; +BEGIN; +SET innodb_lock_wait_timeout=1; +INSERT INTO t1 VALUES(1,1); +SET DEBUG_SYNC='now WAIT_FOR inserted'; +SET DEBUG_SYNC='innodb_row_search_for_mysql_exit SIGNAL locked'; +SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ; +BEGIN; +DELETE FROM t1 WHERE b=1; +ERROR HY000: Lock wait timeout exceeded; try restarting transaction +COMMIT; +SET DEBUG_SYNC='RESET'; +COMMIT; +DROP TABLE t1; diff --git a/mysql-test/suite/innodb/r/mvcc.result b/mysql-test/suite/innodb/r/mvcc.result new file mode 100644 index 000000000..6bbabc8d8 --- /dev/null +++ b/mysql-test/suite/innodb/r/mvcc.result @@ -0,0 +1,26 @@ +SET @save_per_table= @@GLOBAL.innodb_file_per_table; +SET GLOBAL innodb_file_per_table= 1; +# +# MDEV-15249 Crash in MVCC read after IMPORT TABLESPACE +# +CREATE TABLE t1 (a INT PRIMARY KEY) ENGINE=InnoDB; +INSERT INTO t1 VALUES(0); +FLUSH TABLES t1 WITH READ LOCK; +UNLOCK TABLES; +START TRANSACTION WITH CONSISTENT SNAPSHOT; +ALTER TABLE t1 FORCE, ALGORITHM=COPY; +SELECT * FROM t1; +ERROR HY000: Table definition has changed, please retry transaction +COMMIT; +START TRANSACTION WITH CONSISTENT SNAPSHOT; +ALTER TABLE t1 DISCARD TABLESPACE; +ALTER TABLE t1 IMPORT TABLESPACE; +# FIXME: Block this with ER_TABLE_DEF_CHANGED +SELECT * FROM t1; +a +COMMIT; +SELECT * FROM t1; +a +0 +DROP TABLE t1; +SET GLOBAL innodb_file_per_table= @save_per_table; diff --git a/mysql-test/suite/innodb/r/read_only_recover_committed.result b/mysql-test/suite/innodb/r/read_only_recover_committed.result new file mode 100644 index 000000000..593bcae40 --- /dev/null +++ b/mysql-test/suite/innodb/r/read_only_recover_committed.result @@ -0,0 +1,43 @@ +CREATE TABLE t(a INT PRIMARY KEY) ENGINE=InnoDB; +INSERT INTO t VALUES(1); +BEGIN; +INSERT INTO t VALUES(2); +DELETE FROM t WHERE a=2; +# Normal MariaDB shutdown would roll back the above transaction. +# We want the transaction to remain open, so we will kill the server +# after ensuring that any non-transactional files are clean. +FLUSH TABLES; +# Create another transaction that will be recovered as COMMITTED. +BEGIN; +SET DEBUG_SYNC='after_trx_committed_in_memory SIGNAL committed WAIT_FOR ever'; +COMMIT; +SET DEBUG_SYNC='now WAIT_FOR committed'; +# Ensure that the above incomplete transactions become durable. +SET GLOBAL innodb_flush_log_at_trx_commit=1; +BEGIN; +INSERT INTO t VALUES(-10000); +ROLLBACK; +SELECT * FROM t; +a +1 +SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; +SELECT * FROM t; +a +1 +UPDATE t SET a=3 WHERE a=1; +ERROR HY000: Table 't' is read only +# Starting with MariaDB 10.2, innodb_read_only implies READ UNCOMMITTED. +# In earlier versions, this would return the last committed version +# (empty table)! +SELECT * FROM t; +a +1 +SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; +SELECT * FROM t; +a +1 +SELECT * FROM t; +a +1 +DROP TABLE t; +NOT FOUND /Rolled back recovered transaction [^0]/ in mysqld.1.err diff --git a/mysql-test/suite/innodb/r/recovery_shutdown.result b/mysql-test/suite/innodb/r/recovery_shutdown.result index 861461dd0..47398c1ca 100644 --- a/mysql-test/suite/innodb/r/recovery_shutdown.result +++ b/mysql-test/suite/innodb/r/recovery_shutdown.result @@ -52,5 +52,5 @@ INSERT INTO t1(a) SELECT NULL FROM t1; INSERT INTO t1(a) SELECT NULL FROM t1; SET GLOBAL innodb_flush_log_at_trx_commit=1; CREATE TABLE u(a SERIAL) ENGINE=INNODB; -# Kill and restart +FLUSH TABLES; DROP TABLE t,u; diff --git a/mysql-test/suite/innodb/r/rename_table.result b/mysql-test/suite/innodb/r/rename_table.result new file mode 100644 index 000000000..49ce32540 --- /dev/null +++ b/mysql-test/suite/innodb/r/rename_table.result @@ -0,0 +1,5 @@ +call mtr.add_suppression("InnoDB: (Operating system error|The error means|Cannot rename file)"); +CREATE TABLE t1 (a INT) ENGINE=InnoDB; +RENAME TABLE t1 TO non_existing_db.t1; +ERROR HY000: Error on rename of '**path-to-t1**' to '**path-to-non-existing-db-t1**' (errno: -1 "Internal error < 0 (Not system error)") +DROP TABLE t1; diff --git a/mysql-test/suite/innodb/r/restart.result b/mysql-test/suite/innodb/r/restart.result new file mode 100644 index 000000000..5ebd6753e --- /dev/null +++ b/mysql-test/suite/innodb/r/restart.result @@ -0,0 +1,26 @@ +SET GLOBAL innodb_file_format=Barracuda; +SET GLOBAL innodb_file_per_table=1; +# +# MDEV-15333 MariaDB (still) slow start +# +# FIXME: Unlike MySQL, maybe MariaDB should not read the .ibd files +# of tables with .isl file or DATA DIRECTORY attribute. +call mtr.add_suppression("\\[ERROR\\] InnoDB: Invalid flags 0x7a207879 in tablespace 2048948345"); +call mtr.add_suppression("\\[ERROR\\] InnoDB: Error invalid tablespace flags in file '.*td\\.ibd'"); +CREATE TABLE tr(a INT)ENGINE=InnoDB ROW_FORMAT=REDUNDANT; +CREATE TABLE tc(a INT)ENGINE=InnoDB ROW_FORMAT=COMPACT +PAGE_COMPRESSED=1 PAGE_COMPRESSION_LEVEL=9; +CREATE TABLE td(a INT)ENGINE=InnoDB ROW_FORMAT=DYNAMIC +STATS_PERSISTENT=0 DATA DIRECTORY='MYSQL_TMP_DIR'; +SELECT COUNT(*) FROM INFORMATION_SCHEMA.ENGINES +WHERE engine = 'innodb' +AND support IN ('YES', 'DEFAULT', 'ENABLED'); +COUNT(*) +1 +SELECT * FROM tr; +a +SELECT * FROM tc; +a +SELECT * FROM td; +a +DROP TABLE tr,tc,td; diff --git a/mysql-test/suite/innodb/t/alter_partitioned_xa.test b/mysql-test/suite/innodb/t/alter_partitioned_xa.test new file mode 100644 index 000000000..f0883802c --- /dev/null +++ b/mysql-test/suite/innodb/t/alter_partitioned_xa.test @@ -0,0 +1,31 @@ +--source include/have_innodb.inc +--source include/have_partition.inc + +--echo # +--echo # MDEV-14693 XA: Assertion `!clust_index->online_log' failed +--echo # in rollback_inplace_alter_table +--echo # + +# A bug in meta-data locking (MDL) for XA transactions causes +# a bug in InnoDB error handling for ALTER TABLE to be triggered. +CREATE TABLE t1 (a INT, b INT) ENGINE=InnoDB PARTITION BY HASH(a) PARTITIONS 2; +XA START 'xid'; +INSERT INTO t1 VALUES (1,10); +# XA bug: The following releases the MDL on t1! +--error ER_XAER_RMFAIL +CREATE DATABASE IF NOT EXISTS db; + +--connect (con1,localhost,root,,test) +SET innodb_lock_wait_timeout= 1, lock_wait_timeout= 2; +# Here, innodb_lock_wait_timeout would be exceeded, causing the operation +# to roll back when InnoDB is attempting to commit. +# (Instead, lock_wait_timeout should be exceeded!) +--error ER_LOCK_WAIT_TIMEOUT +ALTER TABLE t1 FORCE; + +# Cleanup +--disconnect con1 +--connection default +XA END 'xid'; +XA ROLLBACK 'xid'; +DROP TABLE t1; diff --git a/mysql-test/suite/innodb/t/default_row_format_alter.test b/mysql-test/suite/innodb/t/default_row_format_alter.test new file mode 100644 index 000000000..03e6ec380 --- /dev/null +++ b/mysql-test/suite/innodb/t/default_row_format_alter.test @@ -0,0 +1,98 @@ +--source include/have_innodb.inc + +SET @row_format = @@GLOBAL.innodb_default_row_format; + +--echo #################################### +--echo # Check if table rebuilding alter isn't affect if table is created +--echo # with explicit row_format +eval CREATE TABLE t1 (a INT PRIMARY KEY, b TEXT) ROW_FORMAT=COMPACT ENGINE=INNODB; +INSERT INTO t1 VALUES (1, 'abc'); +--replace_column 3 # 5 # 6 # 7 # 8 # 9 # 10 # 12 # +SHOW TABLE STATUS LIKE 't1'; + +SET GLOBAL innodb_default_row_format=DYNAMIC; +ALTER TABLE t1 DROP PRIMARY KEY, ADD COLUMN c INT PRIMARY KEY; + +--echo # Here we expect COMPACT because it was explicitly specified at CREATE +--replace_column 3 # 5 # 6 # 7 # 8 # 9 # 10 # 12 # +SHOW TABLE STATUS LIKE 't1'; +DROP TABLE t1; + +--echo #################################### +--echo # Check if table rebuilding alter is affected when there is no +--echo # row_format specified at CREATE TABLE. +SET GLOBAL innodb_default_row_format = COMPACT; +eval CREATE TABLE t1 (a INT PRIMARY KEY, b TEXT) ENGINE=INNODB; +INSERT INTO t1 VALUES (1, 'abc'); + +--replace_column 3 # 5 # 6 # 7 # 8 # 9 # 10 # 12 # +SHOW TABLE STATUS LIKE 't1'; + +SET GLOBAL innodb_default_row_format = DYNAMIC; +ALTER TABLE t1 DROP PRIMARY KEY, ADD COLUMN c INT PRIMARY KEY; + +--echo # Here we expect DYNAMIC because there is no explicit ROW_FORMAT and the +--echo # default_row_format is changed to DYNAMIC just before ALTER +--replace_column 3 # 5 # 6 # 7 # 8 # 9 # 10 # 12 # +SHOW TABLE STATUS LIKE 't1'; +DROP TABLE t1; + +--echo #################################### +--echo # Check the row_format effect on ALTER, ALGORITHM=COPY +SET GLOBAL innodb_default_row_format = REDUNDANT; +eval CREATE TABLE t1 (a INT PRIMARY KEY, b TEXT) ENGINE=INNODB; +INSERT INTO t1 VALUES (1, REPEAT('abc',1000)); + +--replace_column 3 # 5 # 6 # 7 # 8 # 9 # 10 # 12 # +SHOW TABLE STATUS LIKE 't1'; + +SET GLOBAL innoDB_default_row_format = COMPACT; +ALTER TABLE t1 ADD COLUMN c2 BLOB, ALGORITHM=COPY; + +--echo # Because of ALGORITHM=COPY, there is TABLE REBUILD and the table isn't +--echo # created with explicit row_format, so we expect ROW_FORMAT=COMPACT +--replace_column 3 # 5 # 6 # 7 # 8 # 9 # 10 # 12 # +SHOW TABLE STATUS LIKE 't1'; +DROP TABLE t1; + +--echo +--echo ################################### +--echo # Check the row_format effect on ALTER, ALGORITH=COPY on +--echo # create table with explicit row_format +eval CREATE TABLE t1 (a INT PRIMARY KEY, b TEXT) ROW_FORMAT=REDUNDANT ENGINE=INNODB; +INSERT INTO t1 VALUES (1, REPEAT('abc',1000)); + +--replace_column 3 # 5 # 6 # 7 # 8 # 9 # 10 # 12 # +SHOW TABLE STATUS LIKE 't1'; + +SET GLOBAL innoDB_default_row_format = COMPACT; +ALTER TABLE t1 ADD COLUMN c2 BLOB, ALGORITHM=COPY; + +--echo # Because of ALGORITHM=COPY, there is TABLE REBUILD and the table is +--echo # created with explicit row_format, so we expect original +--echo # ROW_FORMAT=REDUNDANT +--replace_column 3 # 5 # 6 # 7 # 8 # 9 # 10 # 12 # +SHOW TABLE STATUS LIKE 't1'; +DROP TABLE t1; + +--echo +--echo ################################## +--echo # Check row_format on ALTER ALGORITHM=INPLACE +SET GLOBAL innodb_default_row_format=COMPACT; + +eval CREATE TABLE t1 (a INT PRIMARY KEY, b TEXT, KEY k1(b(10))) ENGINE=INNODB; +INSERT INTO t1 VALUES (1, REPEAT('abc',1000)); + +--replace_column 3 # 5 # 6 # 7 # 8 # 9 # 10 # 12 # +SHOW TABLE STATUS LIKE 't1'; + +SET GLOBAL innodb_default_row_format=DYNAMIC; +ALTER TABLE t1 DROP INDEX k1; + +--echo # Because it is in-place operation, there is no rebuild, so the +--echo # original format has to be retained. +--replace_column 3 # 5 # 6 # 7 # 8 # 9 # 10 # 12 # +SHOW TABLE STATUS LIKE 't1'; +DROP TABLE t1; + +SET GLOBAL innodb_default_row_format = @row_format; diff --git a/mysql-test/suite/innodb/t/default_row_format_compatibility.test b/mysql-test/suite/innodb/t/default_row_format_compatibility.test new file mode 100644 index 000000000..0f433b1fc --- /dev/null +++ b/mysql-test/suite/innodb/t/default_row_format_compatibility.test @@ -0,0 +1,174 @@ +--source include/have_innodb.inc + +SET @row_format = @@GLOBAL.innodb_default_row_format; +SET @large_prefix = @@GLOBAL.innodb_large_prefix; +SET @file_format = @@GLOBAL.innodb_file_format; +SET GLOBAL innodb_file_format = barracuda; + +# set the variables +let $MYSQLD_DATADIR = `SELECT @@datadir`; + +--echo # ########################################################### +--echo # Check with Import/Export tablespace with Default_row_format + +# Set row_format=Compact +SET GLOBAL innodb_default_row_format=Compact; + +# Check row_format=Compact +SELECT @@innodb_default_row_format; + +# Check file_per_table=1 +SELECT @@innodb_file_per_table; + +CREATE TABLE tab(a INT) ENGINE=InnoDB; +--replace_column 3 # 5 # 6 # 7 # 8 # 9 # 10 # 12 # +SHOW TABLE STATUS LIKE 'tab'; + +INSERT INTO tab VALUES(1); +INSERT INTO tab VALUES(2); + +# Check the rows +SELECT * FROM tab; + +FLUSH TABLE tab FOR EXPORT; + +# Take the backup of the ibd and cfg files +--copy_file $MYSQLD_DATADIR/test/tab.cfg $MYSQLD_DATADIR/tab.cfg +--copy_file $MYSQLD_DATADIR/test/tab.ibd $MYSQLD_DATADIR/tab.ibd + +UNLOCK TABLES; + +# Cleanup +DROP TABLE tab; + +# Set the default_row_format=Dynamic +SET GLOBAL innodb_default_row_format=Dynamic; + +CREATE TABLE tab(a INT) ENGINE=InnoDB; + +# Remove the *.ibd file +ALTER TABLE tab DISCARD TABLESPACE; + +# Move the *.ibd,*.cfg file into orginal location +--move_file $MYSQLD_DATADIR/tab.cfg $MYSQLD_DATADIR/test/tab.cfg +--move_file $MYSQLD_DATADIR/tab.ibd $MYSQLD_DATADIR/test/tab.ibd + +--error ER_TABLE_SCHEMA_MISMATCH +ALTER TABLE tab IMPORT TABLESPACE; + +# Take the backup of the ibd and cfg files +--copy_file $MYSQLD_DATADIR/test/tab.cfg $MYSQLD_DATADIR/tab.cfg +--copy_file $MYSQLD_DATADIR/test/tab.ibd $MYSQLD_DATADIR/tab.ibd + +# Cleanup +DROP TABLE tab; + +# Remove orphan files +--remove_file $MYSQLD_DATADIR/test/tab.cfg +--remove_file $MYSQLD_DATADIR/test/tab.ibd + +# Set the default_row_format=Compact +SET GLOBAL innodb_default_row_format=Compact; + +# Check row_format=Compact +SELECT @@innodb_default_row_format; + +CREATE TABLE tab(a INT) ENGINE=InnoDB; +--replace_column 3 # 5 # 6 # 7 # 8 # 9 # 10 # 12 # +SHOW TABLE STATUS LIKE 'tab'; + +# Remove the *.ibd file +ALTER TABLE tab DISCARD TABLESPACE; + +# Move the *ibd,*.cfg file into orginal location +--copy_file $MYSQLD_DATADIR/tab.cfg $MYSQLD_DATADIR/test/tab.ibd +--move_file $MYSQLD_DATADIR/tab.cfg $MYSQLD_DATADIR/test/tab.cfg + +call mtr.add_suppression("InnoDB: Tried to read .* bytes at offset 0"); + +--error ER_INTERNAL_ERROR +ALTER TABLE tab IMPORT TABLESPACE; +--remove_file $MYSQLD_DATADIR/test/tab.ibd +--move_file $MYSQLD_DATADIR/tab.ibd $MYSQLD_DATADIR/test/tab.ibd + +# Check import is successful (because same row_format) +ALTER TABLE tab IMPORT TABLESPACE; + +# Check the rows +SELECT * FROM tab; + +# Cleanup +DROP TABLE tab; + +--echo # ########################################################### +# Check when Index Column size (3070 bytes) is too long, Change row_format +# Check when Index Column size (767 bytes), Change row_format +# Dynamic to Compact to Dynamic + +# Set the default_row_format=Dynamic +SET GLOBAL innodb_default_row_format=Dynamic; +SET GLOBAL innodb_large_prefix=ON; + +SELECT @@innodb_default_row_format; + +CREATE TABLE tab(a INT PRIMARY KEY, b VARCHAR(5000), KEY idx1(b(3070))) ENGINE= InnoDB; +--replace_column 3 # 5 # 6 # 7 # 8 # 9 # 10 # 12 # +SHOW TABLE STATUS LIKE 'tab'; + +INSERT INTO tab(a,b) VALUES(1,'Check with max column size'); + +# Check by SELECT, no errors +SELECT * FROM tab; + +# Change row_format to Compact +SET GLOBAL innodb_default_row_format=COMPACT; + +# Check error ERROR 1709 (HY000): Index column size too large +-- error ER_INDEX_COLUMN_TOO_LONG +ALTER TABLE tab ROW_FORMAT=COMPACT; + +# Cleanup +DROP TABLE tab; + +# Change the default_row_format to default +SET GLOBAL innodb_default_row_format=Default; +SELECT @@innodb_default_row_format; +SET GLOBAL innodb_default_row_format=Dynamic; + +# Change row_format to Dynamic +SELECT @@innodb_default_row_format; + +CREATE TABLE tab(a INT PRIMARY KEY, b VARCHAR(5000), KEY idx1(b(767))) ENGINE= InnoDB; +--replace_column 3 # 5 # 6 # 7 # 8 # 9 # 10 # 12 # +SHOW TABLE STATUS LIKE 'tab'; + +INSERT INTO tab(a,b) VALUES(1,'Check with max column size'); + +# Check by SELECT, no errors +SELECT * FROM tab; + +# Check no errors because Compact allows 767 bytes +ALTER TABLE tab ROW_FORMAT=COMPACT; +--replace_column 3 # 5 # 6 # 7 # 8 # 9 # 10 # 12 # +SHOW TABLE STATUS LIKE 'tab'; + +# Check by SELECT, no errors +SELECT * FROM tab; + +# Check no errors +ALTER TABLE tab ROW_FORMAT=COMPRESSED; + +# Check by SELECT, no errors +SELECT * FROM tab; + +# Check no errors +ALTER TABLE tab ROW_FORMAT=Dynamic; +--replace_column 3 # 5 # 6 # 7 # 8 # 9 # 10 # 12 # +SHOW TABLE STATUS LIKE 'tab'; + +# Cleanup +DROP TABLE tab; + +SET GLOBAL innodb_default_row_format = @row_format; +SET GLOBAL innodb_large_prefix = @large_prefix; +SET GLOBAL innodb_file_format = @file_format; diff --git a/mysql-test/suite/innodb/t/default_row_format_create.test b/mysql-test/suite/innodb/t/default_row_format_create.test new file mode 100644 index 000000000..e0981abf7 --- /dev/null +++ b/mysql-test/suite/innodb/t/default_row_format_create.test @@ -0,0 +1,28 @@ +--source include/have_innodb.inc +--source include/innodb_row_format.inc + +CREATE TABLE t1(c1 TEXT,c2 BLOB) ENGINE=InnoDB; +--replace_column 3 # 5 # 6 # 7 # 8 # 9 # 10 # 12 # +SHOW TABLE STATUS LIKE 't1'; +DROP TABLE t1; + +CREATE TABLE t1(c1 TEXT,c2 BLOB) ENGINE=InnoDB ROW_FORMAT=DYNAMIC; +--replace_column 3 # 5 # 6 # 7 # 8 # 9 # 10 # 12 # +SHOW TABLE STATUS LIKE 't1'; +DROP TABLE t1; + +CREATE TABLE t1(c1 TEXT,c2 BLOB) ENGINE=InnoDB ROW_FORMAT=COMPACT; +--replace_column 3 # 5 # 6 # 7 # 8 # 9 # 10 # 12 # +SHOW TABLE STATUS LIKE 't1'; +DROP TABLE t1; + +CREATE TABLE t1(c1 TEXT,c2 BLOB) ENGINE=InnoDB ROW_FORMAT=REDUNDANT; +--replace_column 3 # 5 # 6 # 7 # 8 # 9 # 10 # 12 # +SHOW TABLE STATUS LIKE 't1'; +DROP TABLE t1; + +CREATE TABLE t1(c1 TEXT,c2 BLOB) ENGINE=InnoDB +ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=1; +--replace_column 3 # 5 # 6 # 7 # 8 # 9 # 10 # 12 # +SHOW TABLE STATUS LIKE 't1'; +DROP TABLE t1; diff --git a/mysql-test/suite/innodb/t/file_format_defaults-master.opt b/mysql-test/suite/innodb/t/file_format_defaults-master.opt new file mode 100644 index 000000000..202ecee6d --- /dev/null +++ b/mysql-test/suite/innodb/t/file_format_defaults-master.opt @@ -0,0 +1 @@ +--innodb_large_prefix=OFF --innodb_file_format=barracuda --innodb-file-format-check=off --innodb-file-format-max=antelope diff --git a/mysql-test/suite/innodb/t/file_format_defaults.test b/mysql-test/suite/innodb/t/file_format_defaults.test new file mode 100644 index 000000000..c16ca068e --- /dev/null +++ b/mysql-test/suite/innodb/t/file_format_defaults.test @@ -0,0 +1,73 @@ +#*********************************************************** +# WL#7703: +# Check the max key length 3072 when innodb_large_prefix=ON +# Check boundary value of max key length 3073 +# When innodb_file_format=Antelope, compress DDLs fails +# Check file_format_max becomes Barracuda on DDL operation +# on compression table. +#*********************************************************** +-- source include/have_innodb.inc +-- source include/have_innodb_16k.inc + +# Check some default settings +SELECT @@innodb_strict_mode; + +SELECT @@innodb_file_per_table; + +SET @file_format = @@GLOBAL.innodb_file_format; + +SET GLOBAL innodb_large_prefix=ON; +SET SQL_MODE=strict_all_tables; + +CREATE TABLE tab0 (c1 VARCHAR(65530), KEY(c1(3073))) ENGINE=InnoDB ROW_FORMAT=COMPRESSED; +SHOW CREATE TABLE tab0; +DROP TABLE tab0; + +--error ER_TOO_BIG_ROWSIZE +CREATE TABLE tab0 (c1 VARCHAR(65530), KEY(c1(3073))) ENGINE=InnoDB KEY_BLOCK_SIZE=2; + +SET GLOBAL innodb_file_format=Antelope; + +# WL#8307 Make ROW_FORMAT=DYNAMIC the default +# will allow ROW_FORMAT=DYNAMIC even if innodb_file_format=Antelope. +CREATE TABLE tab0(c1 INT,c2 LONGBLOB ) ENGINE=InnoDB ROW_FORMAT=Dynamic; +DROP TABLE tab0; + +SET GLOBAL innodb_file_format=Default; + +SELECT @@innodb_file_format; + +SET GLOBAL innodb_strict_mode=OFF; + +# Check with default value +SET GLOBAL innodb_strict_mode=Default; + +SELECT @@innodb_strict_mode; + +SET GLOBAL innodb_large_prefix=OFF; + +SELECT @@innodb_large_prefix; + +SET GLOBAL innodb_large_prefix=Default; + +# Check with default value +SELECT @@innodb_large_prefix; + +SET GLOBAL innodb_file_format_max=Default; + +# Check with default value +SELECT @@innodb_file_format_max; + +CREATE TABLE tab1(c1 int ) ENGINE=InnoDB ROW_FORMAT=COMPRESSED; + +# Check file format changed to Barracuda, on DDL operation +SELECT @@innodb_file_format_max; + +SET GLOBAL innodb_file_format_max=Default; + +# Restore to the value that we explicitly used at startup. +SET GLOBAL innodb_large_prefix=off; + +SET GLOBAL innodb_file_format = @file_format; + +DROP TABLE tab1; diff --git a/mysql-test/suite/innodb/t/innodb-alter-nullable.test b/mysql-test/suite/innodb/t/innodb-alter-nullable.test index bb5cdee00..d039459f9 100644 --- a/mysql-test/suite/innodb/t/innodb-alter-nullable.test +++ b/mysql-test/suite/innodb/t/innodb-alter-nullable.test @@ -71,6 +71,11 @@ WHERE NAME='test/t'; DROP TABLE t; +CREATE TABLE t1(c1 INT) ENGINE=InnoDB; +ALTER TABLE t1 ADD CONSTRAINT UNIQUE KEY i1(c1); +ALTER TABLE t1 CHANGE c1 c1 INT NOT NULL,ADD KEY(c1); +DROP TABLE t1; + # Check that all connections opened by test cases in this file are really # gone so execution of other tests won't be affected by their presence. --source include/wait_until_count_sessions.inc diff --git a/mysql-test/suite/innodb/t/innodb-alter.test b/mysql-test/suite/innodb/t/innodb-alter.test index af7548270..0d3cc6f17 100644 --- a/mysql-test/suite/innodb/t/innodb-alter.test +++ b/mysql-test/suite/innodb/t/innodb-alter.test @@ -481,3 +481,24 @@ eval ALTER TABLE $source_db.t1 DROP INDEX index2, algorithm=inplace; eval DROP TABLE $source_db.t1; eval DROP DATABASE $source_db; eval DROP DATABASE $dest_db; + +--echo # +--echo # BUG #26334149 MYSQL CRASHES WHEN FULL TEXT INDEXES IBD FILES ARE +--echo # ORPHANED DUE TO RENAME TABLE +--echo # +CREATE DATABASE db1; USE db1; +CREATE TABLE notes ( + id int(11) NOT NULL AUTO_INCREMENT, + body text COLLATE utf8_unicode_ci, + PRIMARY KEY (id) + ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 +COLLATE=utf8_unicode_ci +ROW_FORMAT=COMPRESSED; + +ALTER TABLE notes ADD FULLTEXT INDEX index_ft_body (body(255)); +DROP INDEX index_ft_body ON notes; + +CREATE DATABASE db2; +RENAME TABLE db1.notes TO db2.notes; +DROP DATABASE db1; +DROP DATABASE db2; diff --git a/mysql-test/suite/innodb/t/innodb-blob.test b/mysql-test/suite/innodb/t/innodb-blob.test index 775d52c9c..17fd194db 100644 --- a/mysql-test/suite/innodb/t/innodb-blob.test +++ b/mysql-test/suite/innodb/t/innodb-blob.test @@ -5,12 +5,14 @@ --source include/have_innodb.inc --source include/have_innodb_16k.inc -# DEBUG_SYNC must be compiled in. +--source include/have_debug.inc --source include/have_debug_sync.inc # Embedded server does not support restarting --source include/not_embedded.inc +FLUSH TABLES; + CREATE TABLE t1 (a INT PRIMARY KEY, b TEXT) ENGINE=InnoDB; CREATE TABLE t2 (a INT PRIMARY KEY) ENGINE=InnoDB; CREATE TABLE t3 (a INT PRIMARY KEY, b TEXT, c TEXT) ENGINE=InnoDB; diff --git a/mysql-test/suite/innodb/t/innodb-mdev7046.test b/mysql-test/suite/innodb/t/innodb-mdev7046.test index b4085228e..85a257a17 100644 --- a/mysql-test/suite/innodb/t/innodb-mdev7046.test +++ b/mysql-test/suite/innodb/t/innodb-mdev7046.test @@ -9,9 +9,10 @@ # Ignore OS errors -call mtr.add_suppression("InnoDB: File ./test/t1*"); -call mtr.add_suppression("InnoDB: Error number*"); -call mtr.add_suppression("InnoDB: File ./test/t1#p#p1#sp#p1sp0.ibd: 'rename' returned OS error*"); +call mtr.add_suppression("InnoDB: File ./test/t1"); +call mtr.add_suppression("InnoDB: Error number"); +call mtr.add_suppression("InnoDB: Cannot rename file '.*/test/t1#[Pp]#p1#[Ss][Pp]#p1sp0\\.ibd' to"); +call mtr.add_suppression("InnoDB: Operating system error number .* in a file operation."); # MDEV-7046: MySQL#74480 - Failing assertion: os_file_status(newpath, &exists, &type) # after Operating system error number 36 in a file operation diff --git a/mysql-test/suite/innodb/t/innodb-page_compression_default.test b/mysql-test/suite/innodb/t/innodb-page_compression_default.test index 1cc6c9175..34b182948 100644 --- a/mysql-test/suite/innodb/t/innodb-page_compression_default.test +++ b/mysql-test/suite/innodb/t/innodb-page_compression_default.test @@ -1,8 +1,6 @@ --source include/have_innodb.inc --source include/not_embedded.inc -call mtr.add_suppression("InnoDB: Compression failed for space [0-9]+ name test/innodb_page_compressed[0-9] len [0-9]+ err 2 write_size [0-9]+."); - # All page compression test use the same --source include/innodb-page-compression.inc diff --git a/mysql-test/suite/innodb/t/innodb-page_compression_snappy.test b/mysql-test/suite/innodb/t/innodb-page_compression_snappy.test index 532ec294d..0186c24ef 100644 --- a/mysql-test/suite/innodb/t/innodb-page_compression_snappy.test +++ b/mysql-test/suite/innodb/t/innodb-page_compression_snappy.test @@ -2,8 +2,6 @@ -- source include/have_innodb_snappy.inc --source include/not_embedded.inc -call mtr.add_suppression("InnoDB: Compression failed for space [0-9]+ name test/innodb_page_compressed[0-9] len [0-9]+ err 2 write_size [0-9]+."); - # snappy set global innodb_compression_algorithm = snappy; diff --git a/mysql-test/suite/innodb/t/innodb_bug54044.test b/mysql-test/suite/innodb/t/innodb_bug54044.test index 61a09375a..cfc6f3c3f 100644 --- a/mysql-test/suite/innodb/t/innodb_bug54044.test +++ b/mysql-test/suite/innodb/t/innodb_bug54044.test @@ -16,13 +16,3 @@ CREATE TABLE tmp ENGINE = INNODB AS SELECT COALESCE(NULL, NULL, NULL), GREATEST(NULL, NULL), NULL; SHOW CREATE TABLE tmp; DROP TABLE tmp; - -# These 'create table' operations should fail because of -# using NULL datatype - -CREATE TABLE t1 (a VARCHAR(3)) ENGINE=InnoDB; -INSERT INTO t1 VALUES ('foo'),('bar'); -FLUSH TABLES; ---error 1005 -CREATE TEMPORARY TABLE tmp ENGINE=InnoDB AS SELECT VALUES(a) FROM t1; -DROP TABLE t1; diff --git a/mysql-test/suite/innodb/t/innodb_defragment_small.test b/mysql-test/suite/innodb/t/innodb_defragment_small.test index 454333d69..c52a58fc5 100644 --- a/mysql-test/suite/innodb/t/innodb_defragment_small.test +++ b/mysql-test/suite/innodb/t/innodb_defragment_small.test @@ -1,10 +1,17 @@ --source include/have_innodb.inc SET @innodb_defragment_orig=@@GLOBAL.innodb_defragment; +SET @innodb_optimize_fulltext_orig=@@GLOBAL.innodb_optimize_fulltext_only; SET GLOBAL innodb_defragment = 1; +SET GLOBAL innodb_optimize_fulltext_only = 0; -# Small tests copied from innodb.innodb_defragment -CREATE TABLE t1 (a INT PRIMARY KEY, b VARCHAR(256), KEY(a, b)) ENGINE=INNODB; +--echo # +--echo # MDEV-12198 innodb_defragment=1 crashes server on +--echo # OPTIMIZE TABLE when FULLTEXT index exists +--echo # + +CREATE TABLE t1 (a INT PRIMARY KEY, b VARCHAR(256), + KEY(a, b), FULLTEXT KEY(b)) ENGINE=INNODB; OPTIMIZE TABLE t1; INSERT INTO t1 VALUES (100000, REPEAT('A', 256)); @@ -13,16 +20,18 @@ INSERT INTO t1 VALUES (300000, REPEAT('A', 256)); INSERT INTO t1 VALUES (400000, REPEAT('A', 256)); OPTIMIZE TABLE t1; -DROP TABLE t1; --echo # ---echo # MDEV-12198 innodb_defragment=1 crashes server on ---echo # OPTIMIZE TABLE when FULLTEXT index exists +--echo # MDEV-15824 innodb_defragment=ON trumps +--echo # innodb_optimize_fulltext_only=ON in OPTIMIZE TABLE --echo # -CREATE TABLE t1 (c TEXT, FULLTEXT KEY (c)) ENGINE=InnoDB; - +SET GLOBAL innodb_optimize_fulltext_only = 1; OPTIMIZE TABLE t1; +SET GLOBAL innodb_defragment = 0; +OPTIMIZE TABLE t1; + DROP TABLE t1; SET GLOBAL innodb_defragment = @innodb_defragment_orig; +SET GLOBAL innodb_optimize_fulltext_only = @innodb_optimize_fulltext_orig; diff --git a/mysql-test/suite/innodb/t/lock_deleted.test b/mysql-test/suite/innodb/t/lock_deleted.test new file mode 100644 index 000000000..8dbad90d3 --- /dev/null +++ b/mysql-test/suite/innodb/t/lock_deleted.test @@ -0,0 +1,72 @@ +--source include/have_innodb.inc +--source include/have_debug.inc +--source include/have_debug_sync.inc + +--source include/count_sessions.inc + +connect(stop_purge, localhost, root,,); +START TRANSACTION WITH CONSISTENT SNAPSHOT; +connect(delete, localhost, root,,); +connection default; + +CREATE TABLE t1(a INT PRIMARY KEY, b INT UNIQUE) ENGINE=InnoDB; +INSERT INTO t1 VALUES(1,1); +DELETE FROM t1; + +let $i=2; +while ($i) { +let $iso= `SELECT CASE $i WHEN 1 THEN 'UNCOMMITTED' ELSE 'COMMITTED' END`; + +SET DEBUG_SYNC='row_ins_sec_index_unique SIGNAL inserted WAIT_FOR locked'; +BEGIN; +send INSERT INTO t1 VALUES(1,1); + +connection delete; +SET DEBUG_SYNC='now WAIT_FOR inserted'; +SET DEBUG_SYNC='innodb_row_search_for_mysql_exit SIGNAL locked'; +eval SET SESSION TRANSACTION ISOLATION LEVEL READ $iso; +BEGIN; +send DELETE FROM t1 WHERE b=1; + +connection default; +reap; +connection delete; +reap; +COMMIT; + +connection default; +SET DEBUG_SYNC='RESET'; +ROLLBACK; + +dec $i; +} + +SET DEBUG_SYNC='row_ins_sec_index_unique SIGNAL inserted WAIT_FOR locked'; +BEGIN; +SET innodb_lock_wait_timeout=1; +send INSERT INTO t1 VALUES(1,1); + +connection delete; +SET DEBUG_SYNC='now WAIT_FOR inserted'; +SET DEBUG_SYNC='innodb_row_search_for_mysql_exit SIGNAL locked'; +SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ; +BEGIN; +send DELETE FROM t1 WHERE b=1; + +connection default; +--error ER_LOCK_WAIT_TIMEOUT +reap; +COMMIT; +SET DEBUG_SYNC='RESET'; + +connection delete; +reap; +COMMIT; + +disconnect delete; +disconnect stop_purge; + +connection default; +DROP TABLE t1; + +--source include/wait_until_count_sessions.inc diff --git a/mysql-test/suite/innodb/t/log_file_size.test b/mysql-test/suite/innodb/t/log_file_size.test index 9cc7742f6..061bf35cc 100644 --- a/mysql-test/suite/innodb/t/log_file_size.test +++ b/mysql-test/suite/innodb/t/log_file_size.test @@ -26,7 +26,8 @@ call mtr.add_suppression("Plugin 'InnoDB' registration as a STORAGE ENGINE faile call mtr.add_suppression("InnoDB: Plugin initialization aborted"); call mtr.add_suppression("InnoDB: innodb_read_only prevents crash recovery"); call mtr.add_suppression("InnoDB: Are you sure you are using the right ib_logfiles"); -call mtr.add_suppression("InnoDB: Cannot create log files in read-only mode"); +call mtr.add_suppression("InnoDB: Cannot (create|resize) log files in read-only mode"); +call mtr.add_suppression("InnoDB: Can't initiate database recovery, running in read-only-mode"); call mtr.add_suppression("InnoDB: Only one log file found"); call mtr.add_suppression("InnoDB: Log file .*ib_logfile[01].* size"); call mtr.add_suppression("InnoDB: Unable to open .*ib_logfile0. to check native AIO read support"); diff --git a/mysql-test/suite/innodb/t/mvcc.test b/mysql-test/suite/innodb/t/mvcc.test new file mode 100644 index 000000000..bf76a5de7 --- /dev/null +++ b/mysql-test/suite/innodb/t/mvcc.test @@ -0,0 +1,52 @@ +--source include/have_innodb.inc + +SET @save_per_table= @@GLOBAL.innodb_file_per_table; +SET GLOBAL innodb_file_per_table= 1; + +let MYSQLD_DATADIR =`SELECT @@datadir`; + +--echo # +--echo # MDEV-15249 Crash in MVCC read after IMPORT TABLESPACE +--echo # + +CREATE TABLE t1 (a INT PRIMARY KEY) ENGINE=InnoDB; +INSERT INTO t1 VALUES(0); +FLUSH TABLES t1 WITH READ LOCK; +perl; +do "$ENV{MTR_SUITE_DIR}/include/innodb-util.pl"; +ib_backup_tablespace("test", "t1"); +EOF +UNLOCK TABLES; + +START TRANSACTION WITH CONSISTENT SNAPSHOT; + +connect (con1,localhost,root,,); +ALTER TABLE t1 FORCE, ALGORITHM=COPY; + +connection default; +--error ER_TABLE_DEF_CHANGED +SELECT * FROM t1; +COMMIT; +START TRANSACTION WITH CONSISTENT SNAPSHOT; + +connection con1; + +ALTER TABLE t1 DISCARD TABLESPACE; + +perl; +do "$ENV{MTR_SUITE_DIR}/include/innodb-util.pl"; +ib_restore_tablespace("test", "t1"); +EOF + +ALTER TABLE t1 IMPORT TABLESPACE; +disconnect con1; + +connection default; +--echo # FIXME: Block this with ER_TABLE_DEF_CHANGED +SELECT * FROM t1; +COMMIT; +SELECT * FROM t1; + +DROP TABLE t1; + +SET GLOBAL innodb_file_per_table= @save_per_table; diff --git a/mysql-test/suite/innodb/t/read_only_recover_committed.test b/mysql-test/suite/innodb/t/read_only_recover_committed.test new file mode 100644 index 000000000..402cbeba1 --- /dev/null +++ b/mysql-test/suite/innodb/t/read_only_recover_committed.test @@ -0,0 +1,68 @@ +--source include/have_innodb.inc +--source include/have_debug.inc +--source include/have_debug_sync.inc +# need to restart server +--source include/not_embedded.inc + +--connect(con1, localhost, root) +CREATE TABLE t(a INT PRIMARY KEY) ENGINE=InnoDB; +INSERT INTO t VALUES(1); +BEGIN; +# Generate insert_undo log. +INSERT INTO t VALUES(2); +# Generate update_undo log. +DELETE FROM t WHERE a=2; +--connect(con2, localhost, root) +--echo # Normal MariaDB shutdown would roll back the above transaction. +--echo # We want the transaction to remain open, so we will kill the server +--echo # after ensuring that any non-transactional files are clean. +FLUSH TABLES; +--echo # Create another transaction that will be recovered as COMMITTED. +BEGIN; +# Generate multiple pages of both insert_undo and update_undo, so that +# the state TRX_UNDO_CACHE will not be chosen. +--disable_query_log +let $n= 10000; +while ($n) { +dec $n; +eval INSERT INTO t VALUES(-$n); +eval DELETE FROM t WHERE a=-$n; +} +--enable_query_log +SET DEBUG_SYNC='after_trx_committed_in_memory SIGNAL committed WAIT_FOR ever'; +send COMMIT; + +connection default; +SET DEBUG_SYNC='now WAIT_FOR committed'; +--echo # Ensure that the above incomplete transactions become durable. +SET GLOBAL innodb_flush_log_at_trx_commit=1; +BEGIN; +INSERT INTO t VALUES(-10000); +ROLLBACK; +--let $restart_parameters= --innodb-force-recovery=3 +--let $shutdown_timeout= 0 +--source include/restart_mysqld.inc +--let $shutdown_timeout= 30 +--disconnect con1 +--disconnect con2 +SELECT * FROM t; +SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; +SELECT * FROM t; +# refused on MySQL 5.6, MariaDB 10.0, 10.1, but not MariaDB 10.2+ +--error ER_OPEN_AS_READONLY +UPDATE t SET a=3 WHERE a=1; +--let $restart_parameters= --innodb-read-only +--source include/restart_mysqld.inc +--echo # Starting with MariaDB 10.2, innodb_read_only implies READ UNCOMMITTED. +--echo # In earlier versions, this would return the last committed version +--echo # (empty table)! +SELECT * FROM t; +SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; +SELECT * FROM t; +--let $restart_parameters= +--source include/restart_mysqld.inc +SELECT * FROM t; +DROP TABLE t; +let SEARCH_FILE= $MYSQLTEST_VARDIR/log/mysqld.1.err; +--let SEARCH_PATTERN= Rolled back recovered transaction [^0] +--source include/search_pattern_in_file.inc diff --git a/mysql-test/suite/innodb/t/recovery_shutdown.test b/mysql-test/suite/innodb/t/recovery_shutdown.test index 28b80cd38..42d98ca34 100644 --- a/mysql-test/suite/innodb/t/recovery_shutdown.test +++ b/mysql-test/suite/innodb/t/recovery_shutdown.test @@ -41,7 +41,11 @@ INSERT INTO t1(a) SELECT NULL FROM t1; SET GLOBAL innodb_flush_log_at_trx_commit=1; CREATE TABLE u(a SERIAL) ENGINE=INNODB; ---source include/kill_and_restart_mysqld.inc +FLUSH TABLES; + +--let $shutdown_timeout=0 +--source include/restart_mysqld.inc +--let $shutdown_timeout=60 --source include/restart_mysqld.inc --disable_query_log diff --git a/mysql-test/suite/innodb/t/rename_table.test b/mysql-test/suite/innodb/t/rename_table.test new file mode 100644 index 000000000..695c0915d --- /dev/null +++ b/mysql-test/suite/innodb/t/rename_table.test @@ -0,0 +1,11 @@ +--source include/have_innodb.inc + +call mtr.add_suppression("InnoDB: (Operating system error|The error means|Cannot rename file)"); + +CREATE TABLE t1 (a INT) ENGINE=InnoDB; +--replace_regex /\'.*t1\' to/'**path-to-t1**' to/ /to \'.*non.*t1\'/to '**path-to-non-existing-db-t1**'/ +--error ER_ERROR_ON_RENAME +RENAME TABLE t1 TO non_existing_db.t1; + +# Cleanup +DROP TABLE t1; diff --git a/mysql-test/suite/innodb/t/restart.test b/mysql-test/suite/innodb/t/restart.test new file mode 100644 index 000000000..242a03400 --- /dev/null +++ b/mysql-test/suite/innodb/t/restart.test @@ -0,0 +1,78 @@ +--source include/innodb_page_size.inc +--source include/not_embedded.inc + +let datadir= `select @@datadir`; +let page_size= `select @@innodb_page_size`; + +SET GLOBAL innodb_file_format=Barracuda; +SET GLOBAL innodb_file_per_table=1; + +--echo # +--echo # MDEV-15333 MariaDB (still) slow start +--echo # + +# Ensure that on normal startup, no data files are read. +# Note: just like in MySQL, all .ibd files will still be +# opened at least once. + +--echo # FIXME: Unlike MySQL, maybe MariaDB should not read the .ibd files +--echo # of tables with .isl file or DATA DIRECTORY attribute. +call mtr.add_suppression("\\[ERROR\\] InnoDB: Invalid flags 0x7a207879 in tablespace 2048948345"); +call mtr.add_suppression("\\[ERROR\\] InnoDB: Error invalid tablespace flags in file '.*td\\.ibd'"); + +CREATE TABLE tr(a INT)ENGINE=InnoDB ROW_FORMAT=REDUNDANT; +CREATE TABLE tc(a INT)ENGINE=InnoDB ROW_FORMAT=COMPACT +PAGE_COMPRESSED=1 PAGE_COMPRESSION_LEVEL=9; +--replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR +eval CREATE TABLE td(a INT)ENGINE=InnoDB ROW_FORMAT=DYNAMIC +STATS_PERSISTENT=0 DATA DIRECTORY='$MYSQL_TMP_DIR'; + +--source include/shutdown_mysqld.inc + +--move_file $datadir/test/tr.ibd $datadir/test/tr0.ibd +--move_file $datadir/test/tc.ibd $datadir/test/tc0.ibd +--move_file $MYSQL_TMP_DIR/test/td.ibd $datadir/test/td0.ibd +# TODO: test that MariaDB does not even attempt to open the files +#--mkdir $datadir/test/tr.ibd +#--mkdir $datadir/test/tc.ibd +#--mkdir $MYSQL_TMP_DIR/test/td.ibd + +perl; +die unless open OUT, ">", "$ENV{datadir}/test/tr.ibd"; +print OUT "foo " x $ENV{page_size}; +close OUT or die; +die unless open OUT, ">", "$ENV{datadir}/test/tc.ibd"; +print OUT "bar " x $ENV{page_size}; +close OUT or die; +die unless open OUT, ">", "$ENV{MYSQL_TMP_DIR}/test/td.ibd"; +print OUT "xyz " x $ENV{page_size}; +close OUT or die; +EOF + +--let $restart_parameters= --skip-innodb-buffer-pool-load-at-startup +--source include/start_mysqld.inc +--let $restart_parameters= + +SELECT COUNT(*) FROM INFORMATION_SCHEMA.ENGINES +WHERE engine = 'innodb' +AND support IN ('YES', 'DEFAULT', 'ENABLED'); + +--source include/shutdown_mysqld.inc + +# TODO: test that MariaDB does not even attempt to open the files +#--rmdir $datadir/test/tr.ibd +#--rmdir $datadir/test/tc.ibd +#--rmdir $MYSQL_TMP_DIR/test/td.ibd +--remove_file $datadir/test/tr.ibd +--remove_file $datadir/test/tc.ibd +--remove_file $MYSQL_TMP_DIR/test/td.ibd + +--move_file $datadir/test/tr0.ibd $datadir/test/tr.ibd +--move_file $datadir/test/tc0.ibd $datadir/test/tc.ibd +--move_file $datadir/test/td0.ibd $MYSQL_TMP_DIR/test/td.ibd + +--source include/start_mysqld.inc +SELECT * FROM tr; +SELECT * FROM tc; +SELECT * FROM td; +DROP TABLE tr,tc,td; diff --git a/mysql-test/suite/innodb_fts/r/innodb-fts-basic.result b/mysql-test/suite/innodb_fts/r/basic.result similarity index 89% rename from mysql-test/suite/innodb_fts/r/innodb-fts-basic.result rename to mysql-test/suite/innodb_fts/r/basic.result index fe767476f..ae23b93dc 100644 --- a/mysql-test/suite/innodb_fts/r/innodb-fts-basic.result +++ b/mysql-test/suite/innodb_fts/r/basic.result @@ -257,3 +257,37 @@ WHERE MATCH (title,body) AGAINST ('"more test proximity"' IN BOOLEAN MODE); id title body drop table articles; +# +# Bug #22679185 INVALID INNODB FTS DOC ID DURING INSERT +# +create table t1 (f1 int not null primary key, f2 varchar(100), +FTS_DOC_ID bigint(20) unsigned not null, +unique key `FTS_DOC_ID_INDEX` (`FTS_DOC_ID`), +fulltext key (f2))engine=innodb; +insert into t1 values(1, "This is the first record", 20000); +insert into t1 values(2, "This is the second record", 40000); +select FTS_DOC_ID from t1; +FTS_DOC_ID +20000 +40000 +drop table t1; +create table t1 (f1 int not null primary key, f2 varchar(100), +FTS_DOC_ID bigint(20) unsigned not null auto_increment, +unique key `FTS_DOC_ID_INDEX` (`FTS_DOC_ID`), +fulltext key (f2))engine=innodb; +set auto_increment_increment = 65535; +insert into t1(f1, f2) values(1, "This is the first record"); +insert into t1(f1, f2) values(2, "This is the second record"); +insert into t1(f1, f2) values(3, "This is the third record"); +select FTS_DOC_ID from t1; +FTS_DOC_ID +1 +65536 +131071 +drop table t1; +call mtr.add_suppression("\\[ERROR\\] InnoDB: Doc ID 20030101000000 is too big. Its difference with largest used Doc ID 0 cannot exceed or equal to 65535"); +CREATE TABLE t1 (FTS_DOC_ID BIGINT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, +title VARCHAR(200), FULLTEXT(title)) ENGINE=InnoDB; +INSERT INTO t1 VALUES (NULL, NULL), (20030101000000, 20030102000000); +ERROR HY000: Invalid InnoDB FTS Doc ID +DROP TABLE t1; diff --git a/mysql-test/suite/innodb_fts/t/innodb-fts-basic.test b/mysql-test/suite/innodb_fts/t/basic.test similarity index 85% rename from mysql-test/suite/innodb_fts/t/innodb-fts-basic.test rename to mysql-test/suite/innodb_fts/t/basic.test index 095713130..58f36be08 100644 --- a/mysql-test/suite/innodb_fts/t/innodb-fts-basic.test +++ b/mysql-test/suite/innodb_fts/t/basic.test @@ -2,11 +2,6 @@ -- source include/have_innodb.inc -if (`select plugin_auth_version <= "5.6.10" from information_schema.plugins where plugin_name='innodb'`) -{ - --skip Not fixed in InnoDB 5.6.10 or earlier -} - # Create FTS table CREATE TABLE articles ( id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, @@ -226,3 +221,37 @@ SELECT * FROM articles AGAINST ('"more test proximity"' IN BOOLEAN MODE); drop table articles; + +--echo # +--echo # Bug #22679185 INVALID INNODB FTS DOC ID DURING INSERT +--echo # + +create table t1 (f1 int not null primary key, f2 varchar(100), + FTS_DOC_ID bigint(20) unsigned not null, + unique key `FTS_DOC_ID_INDEX` (`FTS_DOC_ID`), + fulltext key (f2))engine=innodb; + +insert into t1 values(1, "This is the first record", 20000); +insert into t1 values(2, "This is the second record", 40000); +select FTS_DOC_ID from t1; +drop table t1; + + +create table t1 (f1 int not null primary key, f2 varchar(100), + FTS_DOC_ID bigint(20) unsigned not null auto_increment, + unique key `FTS_DOC_ID_INDEX` (`FTS_DOC_ID`), + fulltext key (f2))engine=innodb; + +set auto_increment_increment = 65535; +insert into t1(f1, f2) values(1, "This is the first record"); +insert into t1(f1, f2) values(2, "This is the second record"); +insert into t1(f1, f2) values(3, "This is the third record"); +select FTS_DOC_ID from t1; +drop table t1; + +call mtr.add_suppression("\\[ERROR\\] InnoDB: Doc ID 20030101000000 is too big. Its difference with largest used Doc ID 0 cannot exceed or equal to 65535"); +CREATE TABLE t1 (FTS_DOC_ID BIGINT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, + title VARCHAR(200), FULLTEXT(title)) ENGINE=InnoDB; +--error 182 +INSERT INTO t1 VALUES (NULL, NULL), (20030101000000, 20030102000000); +DROP TABLE t1; diff --git a/mysql-test/suite/innodb_zip/r/innodb-create-options.result b/mysql-test/suite/innodb_zip/r/innodb-create-options.result index fe3d79922..e961d0ca7 100644 --- a/mysql-test/suite/innodb_zip/r/innodb-create-options.result +++ b/mysql-test/suite/innodb_zip/r/innodb-create-options.result @@ -282,12 +282,12 @@ Warning 1478 InnoDB: ROW_FORMAT=COMPRESSED requires innodb_file_format > Antelop Error 1005 Can't create table `test`.`t1` (errno: 140 "Wrong create options") Warning 1030 Got error 140 "Wrong create options" from storage engine InnoDB CREATE TABLE t1 ( i INT ) ROW_FORMAT=DYNAMIC; -ERROR HY000: Can't create table `test`.`t1` (errno: 140 "Wrong create options") SHOW WARNINGS; Level Code Message -Warning 1478 InnoDB: ROW_FORMAT=DYNAMIC requires innodb_file_format > Antelope. -Error 1005 Can't create table `test`.`t1` (errno: 140 "Wrong create options") -Warning 1030 Got error 140 "Wrong create options" from storage engine InnoDB +SELECT TABLE_NAME,ROW_FORMAT,CREATE_OPTIONS FROM information_schema.tables WHERE TABLE_NAME = 't1'; +TABLE_NAME ROW_FORMAT CREATE_OPTIONS +t1 Dynamic row_format=DYNAMIC +DROP TABLE t1; CREATE TABLE t1 ( i INT ) ROW_FORMAT=REDUNDANT; SHOW WARNINGS; Level Code Message @@ -318,13 +318,10 @@ Level Code Message Warning 1478 InnoDB: ROW_FORMAT=COMPRESSED requires innodb_file_format > Antelope. Error 1478 Table storage engine 'InnoDB' does not support the create option 'ROW_FORMAT' ALTER TABLE t1 ROW_FORMAT=DYNAMIC; -ERROR HY000: Table storage engine 'InnoDB' does not support the create option 'ROW_FORMAT' SHOW WARNINGS; Level Code Message -Warning 1478 InnoDB: ROW_FORMAT=DYNAMIC requires innodb_file_format > Antelope. -Error 1478 Table storage engine 'InnoDB' does not support the create option 'ROW_FORMAT' SET GLOBAL innodb_file_format=Barracuda; -DROP TABLE IF EXISTS t1; +DROP TABLE t1; CREATE TABLE t1 ( i INT ) ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=4; SET GLOBAL innodb_file_format=Antelope; ALTER TABLE t1 ADD COLUMN f1 INT; @@ -369,12 +366,12 @@ Warning 1478 InnoDB: ROW_FORMAT=COMPRESSED requires innodb_file_per_table. Error 1005 Can't create table `test`.`t1` (errno: 140 "Wrong create options") Warning 1030 Got error 140 "Wrong create options" from storage engine InnoDB CREATE TABLE t1 ( i INT ) ROW_FORMAT=DYNAMIC; -ERROR HY000: Can't create table `test`.`t1` (errno: 140 "Wrong create options") SHOW WARNINGS; Level Code Message -Warning 1478 InnoDB: ROW_FORMAT=DYNAMIC requires innodb_file_per_table. -Error 1005 Can't create table `test`.`t1` (errno: 140 "Wrong create options") -Warning 1030 Got error 140 "Wrong create options" from storage engine InnoDB +SELECT TABLE_NAME,ROW_FORMAT,CREATE_OPTIONS FROM information_schema.tables WHERE TABLE_NAME = 't1'; +TABLE_NAME ROW_FORMAT CREATE_OPTIONS +t1 Dynamic row_format=DYNAMIC +DROP TABLE t1; CREATE TABLE t1 ( i INT ) ROW_FORMAT=REDUNDANT; SHOW WARNINGS; Level Code Message @@ -405,11 +402,11 @@ Level Code Message Warning 1478 InnoDB: ROW_FORMAT=COMPRESSED requires innodb_file_per_table. Error 1478 Table storage engine 'InnoDB' does not support the create option 'ROW_FORMAT' ALTER TABLE t1 ROW_FORMAT=DYNAMIC; -ERROR HY000: Table storage engine 'InnoDB' does not support the create option 'ROW_FORMAT' SHOW WARNINGS; Level Code Message -Warning 1478 InnoDB: ROW_FORMAT=DYNAMIC requires innodb_file_per_table. -Error 1478 Table storage engine 'InnoDB' does not support the create option 'ROW_FORMAT' +SELECT TABLE_NAME,ROW_FORMAT,CREATE_OPTIONS FROM information_schema.tables WHERE TABLE_NAME = 't1'; +TABLE_NAME ROW_FORMAT CREATE_OPTIONS +t1 Dynamic row_format=DYNAMIC ALTER TABLE t1 ROW_FORMAT=COMPACT; SHOW WARNINGS; Level Code Message @@ -789,16 +786,11 @@ TABLE_NAME ROW_FORMAT CREATE_OPTIONS t1 Dynamic row_format=DYNAMIC SET GLOBAL innodb_file_format=Antelope; ALTER TABLE t1 ADD COLUMN f1 INT; -Warnings: -Warning 1478 InnoDB: ROW_FORMAT=DYNAMIC requires innodb_file_format > Antelope. -Warning 1478 InnoDB: assuming ROW_FORMAT=COMPACT. SHOW WARNINGS; Level Code Message -Warning 1478 InnoDB: ROW_FORMAT=DYNAMIC requires innodb_file_format > Antelope. -Warning 1478 InnoDB: assuming ROW_FORMAT=COMPACT. SELECT TABLE_NAME,ROW_FORMAT,CREATE_OPTIONS FROM information_schema.tables WHERE TABLE_NAME = 't1'; TABLE_NAME ROW_FORMAT CREATE_OPTIONS -t1 Compact row_format=DYNAMIC +t1 Dynamic row_format=DYNAMIC SET GLOBAL innodb_file_format=Barracuda; ALTER TABLE t1 ADD COLUMN f2 INT; SHOW WARNINGS; diff --git a/mysql-test/suite/innodb_zip/r/innodb-zip.result b/mysql-test/suite/innodb_zip/r/innodb-zip.result index 584a8a5d6..2695df641 100644 --- a/mysql-test/suite/innodb_zip/r/innodb-zip.result +++ b/mysql-test/suite/innodb_zip/r/innodb-zip.result @@ -22,9 +22,6 @@ Warning 1478 InnoDB: ignoring KEY_BLOCK_SIZE=4. Warning 1478 InnoDB: ROW_FORMAT=COMPRESSED requires innodb_file_per_table. Warning 1478 InnoDB: assuming ROW_FORMAT=COMPACT. create table t1(a int primary key) engine=innodb row_format=dynamic; -Warnings: -Warning 1478 InnoDB: ROW_FORMAT=DYNAMIC requires innodb_file_per_table. -Warning 1478 InnoDB: assuming ROW_FORMAT=COMPACT. create table t2(a int primary key) engine=innodb row_format=redundant; create table t3(a int primary key) engine=innodb row_format=compact; create table t4(a int primary key) engine=innodb key_block_size=9; @@ -75,7 +72,7 @@ SELECT table_schema, table_name, row_format, data_length, index_length FROM info table_schema table_name row_format data_length index_length mysqltest_innodb_zip t0 Compact {valid} 0 mysqltest_innodb_zip t00 Compact {valid} 0 -mysqltest_innodb_zip t1 Compact {valid} 0 +mysqltest_innodb_zip t1 Dynamic {valid} 0 mysqltest_innodb_zip t10 Dynamic {valid} 0 mysqltest_innodb_zip t11 Compressed 1024 0 mysqltest_innodb_zip t12 Compressed 1024 0 @@ -295,19 +292,16 @@ Warning 1478 InnoDB: ROW_FORMAT=COMPRESSED requires innodb_file_per_table. Error 1005 Can't create table `mysqltest_innodb_zip`.`t6` (errno: 140 "Wrong create options") Warning 1030 Got error 140 "Wrong create options" from storage engine InnoDB create table t7 (id int primary key) engine = innodb row_format = dynamic; -ERROR HY000: Can't create table `mysqltest_innodb_zip`.`t7` (errno: 140 "Wrong create options") show warnings; Level Code Message -Warning 1478 InnoDB: ROW_FORMAT=DYNAMIC requires innodb_file_per_table. -Error 1005 Can't create table `mysqltest_innodb_zip`.`t7` (errno: 140 "Wrong create options") -Warning 1030 Got error 140 "Wrong create options" from storage engine InnoDB create table t8 (id int primary key) engine = innodb row_format = compact; create table t9 (id int primary key) engine = innodb row_format = redundant; SELECT table_schema, table_name, row_format, data_length, index_length FROM information_schema.tables WHERE engine='innodb' AND table_schema != 'mysql'; table_schema table_name row_format data_length index_length +mysqltest_innodb_zip t7 Dynamic {valid} 0 mysqltest_innodb_zip t8 Compact {valid} 0 mysqltest_innodb_zip t9 Redundant {valid} 0 -drop table t8, t9; +drop table t7, t8, t9; set global innodb_file_per_table = on; set global innodb_file_format = `0`; create table t1 (id int primary key) engine = innodb key_block_size = 1; @@ -339,19 +333,16 @@ Warning 1478 InnoDB: ROW_FORMAT=COMPRESSED requires innodb_file_format > Antelop Error 1005 Can't create table `mysqltest_innodb_zip`.`t6` (errno: 140 "Wrong create options") Warning 1030 Got error 140 "Wrong create options" from storage engine InnoDB create table t7 (id int primary key) engine = innodb row_format = dynamic; -ERROR HY000: Can't create table `mysqltest_innodb_zip`.`t7` (errno: 140 "Wrong create options") show warnings; Level Code Message -Warning 1478 InnoDB: ROW_FORMAT=DYNAMIC requires innodb_file_format > Antelope. -Error 1005 Can't create table `mysqltest_innodb_zip`.`t7` (errno: 140 "Wrong create options") -Warning 1030 Got error 140 "Wrong create options" from storage engine InnoDB create table t8 (id int primary key) engine = innodb row_format = compact; create table t9 (id int primary key) engine = innodb row_format = redundant; SELECT table_schema, table_name, row_format, data_length, index_length FROM information_schema.tables WHERE engine='innodb' AND table_schema != 'mysql'; table_schema table_name row_format data_length index_length +mysqltest_innodb_zip t7 Dynamic {valid} 0 mysqltest_innodb_zip t8 Compact {valid} 0 mysqltest_innodb_zip t9 Redundant {valid} 0 -drop table t8, t9; +drop table t7, t8, t9; set global innodb_file_per_table=1; set global innodb_file_format=Antelope; set global innodb_file_per_table=on; diff --git a/mysql-test/suite/innodb_zip/t/innodb-create-options.test b/mysql-test/suite/innodb_zip/t/innodb-create-options.test index 53d739fec..282b588c8 100644 --- a/mysql-test/suite/innodb_zip/t/innodb-create-options.test +++ b/mysql-test/suite/innodb_zip/t/innodb-create-options.test @@ -244,10 +244,10 @@ CREATE TABLE t1 ( i INT ) ROW_FORMAT=COMPRESSED; --replace_regex / - .*[0-9]*[)]/)/ SHOW WARNINGS; --replace_regex / - .*[0-9]*[)]/)/ ---error ER_CANT_CREATE_TABLE CREATE TABLE t1 ( i INT ) ROW_FORMAT=DYNAMIC; ---replace_regex / - .*[0-9]*[)]/)/ SHOW WARNINGS; +SELECT TABLE_NAME,ROW_FORMAT,CREATE_OPTIONS FROM information_schema.tables WHERE TABLE_NAME = 't1'; +DROP TABLE t1; CREATE TABLE t1 ( i INT ) ROW_FORMAT=REDUNDANT; SHOW WARNINGS; SELECT TABLE_NAME,ROW_FORMAT,CREATE_OPTIONS FROM information_schema.tables WHERE TABLE_NAME = 't1'; @@ -264,11 +264,10 @@ SHOW WARNINGS; --error ER_ILLEGAL_HA_CREATE_OPTION ALTER TABLE t1 ROW_FORMAT=COMPRESSED; SHOW WARNINGS; ---error ER_ILLEGAL_HA_CREATE_OPTION ALTER TABLE t1 ROW_FORMAT=DYNAMIC; SHOW WARNINGS; SET GLOBAL innodb_file_format=Barracuda; -DROP TABLE IF EXISTS t1; +DROP TABLE t1; CREATE TABLE t1 ( i INT ) ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=4; SET GLOBAL innodb_file_format=Antelope; ALTER TABLE t1 ADD COLUMN f1 INT; @@ -296,11 +295,10 @@ SHOW WARNINGS; CREATE TABLE t1 ( i INT ) ROW_FORMAT=COMPRESSED; --replace_regex / - .*[0-9]*[)]/)/ SHOW WARNINGS; ---replace_regex / - .*[0-9]*[)]/)/ ---error ER_CANT_CREATE_TABLE CREATE TABLE t1 ( i INT ) ROW_FORMAT=DYNAMIC; ---replace_regex / - .*[0-9]*[)]/)/ SHOW WARNINGS; +SELECT TABLE_NAME,ROW_FORMAT,CREATE_OPTIONS FROM information_schema.tables WHERE TABLE_NAME = 't1'; +DROP TABLE t1; CREATE TABLE t1 ( i INT ) ROW_FORMAT=REDUNDANT; SHOW WARNINGS; SELECT TABLE_NAME,ROW_FORMAT,CREATE_OPTIONS FROM information_schema.tables WHERE TABLE_NAME = 't1'; @@ -317,9 +315,9 @@ SHOW WARNINGS; --error ER_ILLEGAL_HA_CREATE_OPTION ALTER TABLE t1 ROW_FORMAT=COMPRESSED; SHOW WARNINGS; ---error ER_ILLEGAL_HA_CREATE_OPTION ALTER TABLE t1 ROW_FORMAT=DYNAMIC; SHOW WARNINGS; +SELECT TABLE_NAME,ROW_FORMAT,CREATE_OPTIONS FROM information_schema.tables WHERE TABLE_NAME = 't1'; ALTER TABLE t1 ROW_FORMAT=COMPACT; SHOW WARNINGS; SELECT TABLE_NAME,ROW_FORMAT,CREATE_OPTIONS FROM information_schema.tables WHERE TABLE_NAME = 't1'; diff --git a/mysql-test/suite/innodb_zip/t/innodb-zip.test b/mysql-test/suite/innodb_zip/t/innodb-zip.test index e8ba98f14..e9bac78f9 100644 --- a/mysql-test/suite/innodb_zip/t/innodb-zip.test +++ b/mysql-test/suite/innodb_zip/t/innodb-zip.test @@ -275,16 +275,14 @@ create table t6 (id int primary key) engine = innodb row_format = compressed; --replace_regex / - .*[0-9]*[)]/)/ show warnings; --replace_regex / - .*[0-9]*[)]/)/ ---error ER_CANT_CREATE_TABLE create table t7 (id int primary key) engine = innodb row_format = dynamic; ---replace_regex / - .*[0-9]*[)]/)/ show warnings; create table t8 (id int primary key) engine = innodb row_format = compact; create table t9 (id int primary key) engine = innodb row_format = redundant; --replace_result 16384 {valid} 8192 {valid} 4096 {valid} --eval $query_i_s -drop table t8, t9; +drop table t7, t8, t9; #test valid values with innodb_file_format unset set global innodb_file_per_table = on; @@ -312,17 +310,14 @@ show warnings; create table t6 (id int primary key) engine = innodb row_format = compressed; --replace_regex / - .*[0-9]*[)]/)/ show warnings; ---replace_regex / - .*[0-9]*[)]/)/ ---error ER_CANT_CREATE_TABLE create table t7 (id int primary key) engine = innodb row_format = dynamic; ---replace_regex / - .*[0-9]*[)]/)/ show warnings; create table t8 (id int primary key) engine = innodb row_format = compact; create table t9 (id int primary key) engine = innodb row_format = redundant; --replace_result 16384 {valid} 8192 {valid} 4096 {valid} --eval $query_i_s -drop table t8, t9; +drop table t7, t8, t9; eval set global innodb_file_per_table=$per_table; eval set global innodb_file_format=$format; diff --git a/mysql-test/suite/maria/alter.result b/mysql-test/suite/maria/alter.result index 1a7daf5a1..c63688ddd 100644 --- a/mysql-test/suite/maria/alter.result +++ b/mysql-test/suite/maria/alter.result @@ -31,3 +31,19 @@ pk i 8 88 9 99 DROP TABLE t1; +CREATE TABLE t1 (f INT) ENGINE=Aria transactional=1; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `f` int(11) DEFAULT NULL +) ENGINE=Aria DEFAULT CHARSET=latin1 PAGE_CHECKSUM=1 TRANSACTIONAL=1 +INSERT INTO t1 VALUES (1),(2); +ALTER TABLE t1 ORDER BY unknown_column; +ERROR 42S22: Unknown column 'unknown_column' in 'order clause' +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `f` int(11) DEFAULT NULL +) ENGINE=Aria DEFAULT CHARSET=latin1 PAGE_CHECKSUM=1 TRANSACTIONAL=1 +CREATE TABLE t2 SELECT * FROM t1; +DROP TABLE t1, t2; diff --git a/mysql-test/suite/maria/alter.test b/mysql-test/suite/maria/alter.test index abca48656..09672cdfa 100644 --- a/mysql-test/suite/maria/alter.test +++ b/mysql-test/suite/maria/alter.test @@ -25,3 +25,20 @@ INSERT INTO t1 VALUES (2,0),(3,33),(4,0),(5,55),(6,66),(7,0),(8,88),(9,99); ALTER TABLE t1 ENABLE KEYS; SELECT * FROM t1 WHERE i = 0 OR pk BETWEEN 6 AND 10; DROP TABLE t1; + +# +# MDEV-14943 +# Assertion `block->type == PAGECACHE_EMPTY_PAGE || block->type == type || +# type == PAGECACHE_LSN_PAGE || type == PAGECACHE_READ_UNKNOWN_PAGE || +# block->type == PAGECACHE_READ_UNKNOWN_PAGE' failed in pagecache_read upon +# CREATE ... SELECT from Aria table +# + +CREATE TABLE t1 (f INT) ENGINE=Aria transactional=1; +SHOW CREATE TABLE t1; +INSERT INTO t1 VALUES (1),(2); +--error ER_BAD_FIELD_ERROR +ALTER TABLE t1 ORDER BY unknown_column; +SHOW CREATE TABLE t1; +CREATE TABLE t2 SELECT * FROM t1; +DROP TABLE t1, t2; diff --git a/mysql-test/suite/maria/dynamic.result b/mysql-test/suite/maria/dynamic.result new file mode 100644 index 000000000..1e87010e9 --- /dev/null +++ b/mysql-test/suite/maria/dynamic.result @@ -0,0 +1,4 @@ +create table t1 (a blob, b varchar(20000)) engine=aria row_format=dynamic; +insert t1 (b) values (repeat('a', 20000)); +update t1 set b='b'; +drop table t1; diff --git a/mysql-test/suite/maria/dynamic.test b/mysql-test/suite/maria/dynamic.test new file mode 100644 index 000000000..f8a1e98cd --- /dev/null +++ b/mysql-test/suite/maria/dynamic.test @@ -0,0 +1,7 @@ +# +# MDEV-13748 Assertion `status_var.local_memory_used == 0 || !debug_assert_on_not_freed_memory' failed in virtual THD::~THD after query with INTERSECT +# +create table t1 (a blob, b varchar(20000)) engine=aria row_format=dynamic; +insert t1 (b) values (repeat('a', 20000)); +update t1 set b='b'; +drop table t1; diff --git a/mysql-test/suite/maria/lock.result b/mysql-test/suite/maria/lock.result index 90250568e..1c9d6b181 100644 --- a/mysql-test/suite/maria/lock.result +++ b/mysql-test/suite/maria/lock.result @@ -99,3 +99,13 @@ f2 3 unlock tables; DROP TABLE t1,t2,tmp; +# +# MDEV-10378 Assertion `trn' failed in virtual int ha_maria::start_stmt +# +CREATE TABLE t1 (f1 VARCHAR(3), f2 INT, pk INT, PRIMARY KEY (pk)) ENGINE=Aria; +INSERT INTO t1 VALUES ('foo',10,1), ('foo',1,2); +LOCK TABLE t1 WRITE; +ALTER TABLE t1 ADD UNIQUE KEY (f1); +ERROR 23000: Duplicate entry 'foo' for key 'f1' +ALTER TABLE t1 ADD KEY (f2); +DROP TABLE t1; diff --git a/mysql-test/suite/maria/lock.test b/mysql-test/suite/maria/lock.test index 57447a18c..4f3d4e806 100644 --- a/mysql-test/suite/maria/lock.test +++ b/mysql-test/suite/maria/lock.test @@ -105,3 +105,15 @@ INSERT INTO t2 (f2) SELECT f3 FROM tmp AS tmp_alias; select * from t2; unlock tables; DROP TABLE t1,t2,tmp; + +--echo # +--echo # MDEV-10378 Assertion `trn' failed in virtual int ha_maria::start_stmt +--echo # + +CREATE TABLE t1 (f1 VARCHAR(3), f2 INT, pk INT, PRIMARY KEY (pk)) ENGINE=Aria; +INSERT INTO t1 VALUES ('foo',10,1), ('foo',1,2); +LOCK TABLE t1 WRITE; +--error ER_DUP_ENTRY +ALTER TABLE t1 ADD UNIQUE KEY (f1); +ALTER TABLE t1 ADD KEY (f2); +DROP TABLE t1; diff --git a/mysql-test/suite/maria/maria.result b/mysql-test/suite/maria/maria.result index 8078687da..f4d7f3d32 100644 --- a/mysql-test/suite/maria/maria.result +++ b/mysql-test/suite/maria/maria.result @@ -2771,3 +2771,11 @@ test.t1 check status OK SET aria_repair_threads=@@global.aria_repair_threads; SET aria_sort_buffer_size=@@global.aria_sort_buffer_size; DROP TABLE t1; +CREATE TABLE t1(a INT, b CHAR(10), KEY(a), KEY(b)); +INSERT INTO t1 VALUES(1,'0'),(2,'0'),(3,'0'),(4,'0'),(5,'0'), +(6,'0'),(7,'0'); +flush tables test.t1 for export; +insert into t1 values (8,'0'); +ERROR HY000: Table 't1' was locked with a READ lock and can't be updated +unlock tables; +drop table t1; diff --git a/mysql-test/suite/maria/maria.test b/mysql-test/suite/maria/maria.test index 27e9a45fd..17dfb8033 100644 --- a/mysql-test/suite/maria/maria.test +++ b/mysql-test/suite/maria/maria.test @@ -2028,6 +2028,19 @@ SET aria_repair_threads=@@global.aria_repair_threads; SET aria_sort_buffer_size=@@global.aria_sort_buffer_size; DROP TABLE t1; +# +# Check FLUSH FOR EXPORT +# + +CREATE TABLE t1(a INT, b CHAR(10), KEY(a), KEY(b)); +INSERT INTO t1 VALUES(1,'0'),(2,'0'),(3,'0'),(4,'0'),(5,'0'), + (6,'0'),(7,'0'); +flush tables test.t1 for export; +--error ER_TABLE_NOT_LOCKED_FOR_WRITE +insert into t1 values (8,'0'); +unlock tables; +drop table t1; + # # End of test # diff --git a/mysql-test/suite/mariabackup/absolute_ibdata_paths.opt b/mysql-test/suite/mariabackup/absolute_ibdata_paths.opt new file mode 100644 index 000000000..52b6b743a --- /dev/null +++ b/mysql-test/suite/mariabackup/absolute_ibdata_paths.opt @@ -0,0 +1 @@ +--innodb --innodb-data-home-dir= --innodb-data-file-path=$MYSQLTEST_VARDIR/tmp/absolute_path_ibdata1:3M;ibdata_second:1M:autoextend \ No newline at end of file diff --git a/mysql-test/suite/mariabackup/absolute_ibdata_paths.result b/mysql-test/suite/mariabackup/absolute_ibdata_paths.result new file mode 100644 index 000000000..fe211e71f --- /dev/null +++ b/mysql-test/suite/mariabackup/absolute_ibdata_paths.result @@ -0,0 +1,10 @@ +CREATE TABLE t(i INT) ENGINE INNODB; +INSERT INTO t VALUES(1); +# xtrabackup backup +# remove datadir +# xtrabackup copy back +# restart server +SELECT * from t; +i +1 +DROP TABLE t; diff --git a/mysql-test/suite/mariabackup/absolute_ibdata_paths.test b/mysql-test/suite/mariabackup/absolute_ibdata_paths.test new file mode 100644 index 000000000..6717f16d1 --- /dev/null +++ b/mysql-test/suite/mariabackup/absolute_ibdata_paths.test @@ -0,0 +1,31 @@ +# This test just backs up and restores empty database +# Innodb system tablespace is specified with absolute path in the .opt file +CREATE TABLE t(i INT) ENGINE INNODB; +INSERT INTO t VALUES(1); +echo # xtrabackup backup; + +let $targetdir=$MYSQLTEST_VARDIR/tmp/backup; +let $_innodb_data_file_path=`select @@innodb_data_file_path`; +let $_innodb_data_home_dir=`select @@innodb_data_home_dir`; +let $_datadir= `SELECT @@datadir`; + +--disable_result_log +exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --target-dir=$targetdir; +--enable_result_log +exec $XTRABACKUP --prepare --target-dir=$targetdir; + +--source include/shutdown_mysqld.inc +echo # remove datadir; +rmdir $_datadir; +#remove out-of-datadir ibdata1 +remove_file $MYSQLTEST_VARDIR/tmp/absolute_path_ibdata1; +echo # xtrabackup copy back; +exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --copy-back --datadir=$_datadir --target-dir=$targetdir "--innodb_data_file_path=$_innodb_data_file_path" --innodb_data_home_dir=$_innodb_data_home_dir; +echo # restart server; +--source include/start_mysqld.inc +--enable_result_log + +SELECT * from t; +DROP TABLE t; +rmdir $targetdir; + diff --git a/mysql-test/suite/mariabackup/backup_ssl.result b/mysql-test/suite/mariabackup/backup_ssl.result new file mode 100644 index 000000000..6e59da6d4 --- /dev/null +++ b/mysql-test/suite/mariabackup/backup_ssl.result @@ -0,0 +1,9 @@ +GRANT ALL PRIVILEGES on *.* TO backup_user IDENTIFIED by 'x' REQUIRE SSL; +FLUSH PRIVILEGES; +# xtrabackup backup +# xtrabackup prepare +# shutdown server +# remove datadir +# xtrabackup move back +# restart server +DROP USER backup_user; diff --git a/mysql-test/suite/mariabackup/backup_ssl.test b/mysql-test/suite/mariabackup/backup_ssl.test new file mode 100644 index 000000000..e858c834d --- /dev/null +++ b/mysql-test/suite/mariabackup/backup_ssl.test @@ -0,0 +1,16 @@ +GRANT ALL PRIVILEGES on *.* TO backup_user IDENTIFIED by 'x' REQUIRE SSL; +FLUSH PRIVILEGES; +echo # xtrabackup backup; +let $targetdir=$MYSQLTEST_VARDIR/tmp/backup; +--disable_result_log +exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --user=backup_user --password=x --ssl --backup --target-dir=$targetdir; +--enable_result_log + +echo # xtrabackup prepare; +--disable_result_log +exec $XTRABACKUP --prepare --target-dir=$targetdir; +-- source include/restart_and_restore.inc +--enable_result_log +DROP USER backup_user; +rmdir $targetdir; + diff --git a/mysql-test/suite/mariabackup/undo_space_id.opt b/mysql-test/suite/mariabackup/undo_space_id.opt new file mode 100644 index 000000000..01b1d91e8 --- /dev/null +++ b/mysql-test/suite/mariabackup/undo_space_id.opt @@ -0,0 +1,2 @@ +--debug=d,innodb_undo_upgrade +--innodb_undo_tablespaces=2 diff --git a/mysql-test/suite/mariabackup/undo_space_id.result b/mysql-test/suite/mariabackup/undo_space_id.result new file mode 100644 index 000000000..96d3e2a58 --- /dev/null +++ b/mysql-test/suite/mariabackup/undo_space_id.result @@ -0,0 +1,13 @@ +# Create 2 UNDO TABLESPACE(UNDO003, UNDO004) +CREATE TABLE t1(a varchar(60)) ENGINE INNODB; +start transaction; +INSERT INTO t1 VALUES(1); +# xtrabackup backup +# Display undo log files from target directory +undo003 +undo004 +# xtrabackup prepare +# Display undo log files from targer directory +undo003 +undo004 +DROP TABLE t1; diff --git a/mysql-test/suite/mariabackup/undo_space_id.test b/mysql-test/suite/mariabackup/undo_space_id.test new file mode 100644 index 000000000..8adeb18e5 --- /dev/null +++ b/mysql-test/suite/mariabackup/undo_space_id.test @@ -0,0 +1,25 @@ +--source include/have_innodb.inc +--source include/have_debug.inc + +--echo # Create 2 UNDO TABLESPACE(UNDO003, UNDO004) + +let $basedir=$MYSQLTEST_VARDIR/tmp/backup; + +CREATE TABLE t1(a varchar(60)) ENGINE INNODB; +start transaction; +INSERT INTO t1 VALUES(1); + +--echo # xtrabackup backup +--disable_result_log +exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --target-dir=$basedir; +--enable_result_log +--echo # Display undo log files from target directory +list_files $basedir undo*; + +--echo # xtrabackup prepare +exec $XTRABACKUP --prepare --apply-log-only --target-dir=$basedir; +--echo # Display undo log files from targer directory +list_files $basedir undo*; + +DROP TABLE t1; +rmdir $basedir; diff --git a/mysql-test/suite/parts/inc/part_alter_values.inc b/mysql-test/suite/parts/inc/part_alter_values.inc index 0d4929d98..ac69169a9 100644 --- a/mysql-test/suite/parts/inc/part_alter_values.inc +++ b/mysql-test/suite/parts/inc/part_alter_values.inc @@ -35,3 +35,13 @@ ALTER TABLE t1 REORGANIZE PARTITION p1 INTO PARTITION p3 VALUES IN (4,5,6) ); DROP TABLE t1; + +# +# MDEV-15456 Server crashes upon adding or dropping a partition in ALTER under LOCK TABLE after ER_SAME_NAME_PARTITION +# +--eval create table t1 (i int) engine=$engine partition by range(i) (partition p0 values less than (10)) +lock table t1 write; +--error ER_SAME_NAME_PARTITION +alter table t1 add partition (partition p0 values less than (20)); +alter table t1 add partition (partition p1 values less than (20)) /* comment */; +drop table t1; diff --git a/mysql-test/suite/parts/r/longname.result b/mysql-test/suite/parts/r/longname.result index 6424ba282..5a223cf65 100644 --- a/mysql-test/suite/parts/r/longname.result +++ b/mysql-test/suite/parts/r/longname.result @@ -12,15 +12,6 @@ SUBPARTITION BY HASH ( id2 ) SUBPARTITIONS 2 ( PARTITION test_jfg_partition_name_with_60_chars_1234567890123456789012 VALUES LESS THAN (1000) ENGINE = InnoDB, PARTITION pmax VALUES LESS THAN MAXVALUE ENGINE = InnoDB); -Warnings: -Warning 1478 InnoDB: ROW_FORMAT=DYNAMIC requires innodb_file_format > Antelope. -Warning 1478 InnoDB: assuming ROW_FORMAT=COMPACT. -Warning 1478 InnoDB: ROW_FORMAT=DYNAMIC requires innodb_file_format > Antelope. -Warning 1478 InnoDB: assuming ROW_FORMAT=COMPACT. -Warning 1478 InnoDB: ROW_FORMAT=DYNAMIC requires innodb_file_format > Antelope. -Warning 1478 InnoDB: assuming ROW_FORMAT=COMPACT. -Warning 1478 InnoDB: ROW_FORMAT=DYNAMIC requires innodb_file_format > Antelope. -Warning 1478 InnoDB: assuming ROW_FORMAT=COMPACT. select database_name, table_name, length(table_name) from mysql.innodb_table_stats where database_name = 'mysqltest1'; database_name table_name length(table_name) CREATE TABLE mysqltest1.éééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééé ( diff --git a/mysql-test/suite/parts/r/partition_alter_innodb.result b/mysql-test/suite/parts/r/partition_alter_innodb.result index 29076a3c1..87c113a27 100644 --- a/mysql-test/suite/parts/r/partition_alter_innodb.result +++ b/mysql-test/suite/parts/r/partition_alter_innodb.result @@ -47,3 +47,9 @@ PARTITION p3 VALUES IN (4,5,6) ); ERROR HY000: Syntax error: LIST PARTITIONING requires definition of VALUES IN for each partition DROP TABLE t1; +create table t1 (i int) engine=InnoDB partition by range(i) (partition p0 values less than (10)); +lock table t1 write; +alter table t1 add partition (partition p0 values less than (20)); +ERROR HY000: Duplicate partition name p0 +alter table t1 add partition (partition p1 values less than (20)) /* comment */; +drop table t1; diff --git a/mysql-test/suite/parts/r/partition_alter_maria.result b/mysql-test/suite/parts/r/partition_alter_maria.result index fd09c0bd4..5f1f882d2 100644 --- a/mysql-test/suite/parts/r/partition_alter_maria.result +++ b/mysql-test/suite/parts/r/partition_alter_maria.result @@ -16,6 +16,15 @@ select * from t1; pk dt 1 2017-09-28 15:12:00 drop table t1; +create table t1 (a int) engine=Aria transactional=1 partition by hash(a) partitions 2; +show create table t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` int(11) DEFAULT NULL +) ENGINE=Aria DEFAULT CHARSET=latin1 TRANSACTIONAL=1 +/*!50100 PARTITION BY HASH (a) +PARTITIONS 2 */ +drop table t1; # # MDEV-14641 Incompatible key or row definition between the MariaDB .frm file and the information in the storage engine # @@ -60,3 +69,9 @@ PARTITION p3 VALUES IN (4,5,6) ); ERROR HY000: Syntax error: LIST PARTITIONING requires definition of VALUES IN for each partition DROP TABLE t1; +create table t1 (i int) engine=Aria partition by range(i) (partition p0 values less than (10)); +lock table t1 write; +alter table t1 add partition (partition p0 values less than (20)); +ERROR HY000: Duplicate partition name p0 +alter table t1 add partition (partition p1 values less than (20)) /* comment */; +drop table t1; diff --git a/mysql-test/suite/parts/r/partition_alter_myisam.result b/mysql-test/suite/parts/r/partition_alter_myisam.result index 41af6af72..4098ebba4 100644 --- a/mysql-test/suite/parts/r/partition_alter_myisam.result +++ b/mysql-test/suite/parts/r/partition_alter_myisam.result @@ -42,6 +42,12 @@ PARTITION p3 VALUES IN (4,5,6) ); ERROR HY000: Syntax error: LIST PARTITIONING requires definition of VALUES IN for each partition DROP TABLE t1; +create table t1 (i int) engine=MyISAM partition by range(i) (partition p0 values less than (10)); +lock table t1 write; +alter table t1 add partition (partition p0 values less than (20)); +ERROR HY000: Duplicate partition name p0 +alter table t1 add partition (partition p1 values less than (20)) /* comment */; +drop table t1; create table t1 ( c1 int, c2 int, c3 varchar(100)) delay_key_write=1 partition by key(c1) ( partition p01 data directory = 'MYSQL_TMP_DIR' diff --git a/mysql-test/suite/parts/r/partition_basic_symlink_innodb.result b/mysql-test/suite/parts/r/partition_basic_symlink_innodb.result index d7a77e5e5..405511543 100644 --- a/mysql-test/suite/parts/r/partition_basic_symlink_innodb.result +++ b/mysql-test/suite/parts/r/partition_basic_symlink_innodb.result @@ -127,5 +127,198 @@ t1#P#p0.ibd t1#P#p1.ibd DROP TABLE t1; # +# MDEV-14611 ALTER TABLE EXCHANGE PARTITION does not work +# properly when used with DATA DIRECTORY +# +SET GLOBAL innodb_file_per_table = ON; +CREATE TABLE t1 +( +myid INT(11) NOT NULL, +myval VARCHAR(10), +PRIMARY KEY (myid) +) ENGINE=INNODB PARTITION BY KEY (myid) +( +PARTITION p0001 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' ENGINE = INNODB, +PARTITION p0002 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' ENGINE = INNODB, +PARTITION p0003 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' ENGINE = INNODB, +PARTITION p0004 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' ENGINE = INNODB +); +CREATE TABLE t2 +( +myid INT(11) NOT NULL, +myval VARCHAR(10), +PRIMARY KEY (myid) +) ENGINE=INNODB DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir'; +ALTER TABLE t1 EXCHANGE PARTITION p0001 WITH TABLE t2; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `myid` int(11) NOT NULL, + `myval` varchar(10) DEFAULT NULL, + PRIMARY KEY (`myid`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +/*!50100 PARTITION BY KEY (myid) +(PARTITION p0001 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' ENGINE = InnoDB, + PARTITION p0002 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' ENGINE = InnoDB, + PARTITION p0003 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' ENGINE = InnoDB, + PARTITION p0004 DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' ENGINE = InnoDB) */ +DROP TABLE t1, t2; +CREATE TABLE t1 +( +myid INT(11) NOT NULL, +myval VARCHAR(10), +PRIMARY KEY (myid) +) ENGINE=INNODB PARTITION BY RANGE (myid) +( +PARTITION p0001 VALUES LESS THAN (50) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' ENGINE = INNODB, +PARTITION p0002 VALUES LESS THAN (150) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' ENGINE = INNODB, +PARTITION p0003 VALUES LESS THAN (1050) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' ENGINE = INNODB, +PARTITION p0004 VALUES LESS THAN (10050) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' ENGINE = INNODB +); +CREATE TABLE t2 +( +myid INT(11) NOT NULL, +myval VARCHAR(10), +PRIMARY KEY (myid) +) ENGINE=INNODB DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir'; +insert into t1 values (1, 'one'); +insert into t2 values (2, 'two'), (3, 'threee'), (4, 'four'); +select * from t1; +myid myval +1 one +ALTER TABLE t1 EXCHANGE PARTITION p0001 WITH TABLE t2; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `myid` int(11) NOT NULL, + `myval` varchar(10) DEFAULT NULL, + PRIMARY KEY (`myid`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +/*!50100 PARTITION BY RANGE (myid) +(PARTITION p0001 VALUES LESS THAN (50) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = InnoDB, + PARTITION p0002 VALUES LESS THAN (150) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' ENGINE = InnoDB, + PARTITION p0003 VALUES LESS THAN (1050) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' ENGINE = InnoDB, + PARTITION p0004 VALUES LESS THAN (10050) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' ENGINE = InnoDB) */ +SHOW CREATE TABLE t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `myid` int(11) NOT NULL, + `myval` varchar(10) DEFAULT NULL, + PRIMARY KEY (`myid`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 DATA DIRECTORY='MYSQLTEST_VARDIR/mysql-test-data-dir/' +select * from t1; +myid myval +2 two +3 threee +4 four +select * from t2; +myid myval +1 one +DROP TABLE t1, t2; +CREATE TABLE t1 +( +myid INT(11) NOT NULL, +myval VARCHAR(10), +PRIMARY KEY (myid) +) ENGINE=INNODB PARTITION BY RANGE (myid) +( +PARTITION p0001 VALUES LESS THAN (50) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' ENGINE = INNODB, +PARTITION p0002 VALUES LESS THAN (150) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' ENGINE = INNODB, +PARTITION p0003 VALUES LESS THAN (1050) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' ENGINE = INNODB, +PARTITION p0004 VALUES LESS THAN (10050) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' ENGINE = INNODB +); +CREATE TABLE t2 +( +myid INT(11) NOT NULL, +myval VARCHAR(10), +PRIMARY KEY (myid) +) ENGINE=INNODB; +insert into t1 values (1, 'one'); +insert into t2 values (2, 'two'), (3, 'threee'), (4, 'four'); +select * from t1; +myid myval +1 one +ALTER TABLE t1 EXCHANGE PARTITION p0001 WITH TABLE t2; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `myid` int(11) NOT NULL, + `myval` varchar(10) DEFAULT NULL, + PRIMARY KEY (`myid`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +/*!50100 PARTITION BY RANGE (myid) +(PARTITION p0001 VALUES LESS THAN (50) ENGINE = InnoDB, + PARTITION p0002 VALUES LESS THAN (150) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' ENGINE = InnoDB, + PARTITION p0003 VALUES LESS THAN (1050) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' ENGINE = InnoDB, + PARTITION p0004 VALUES LESS THAN (10050) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-data-dir' ENGINE = InnoDB) */ +SHOW CREATE TABLE t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `myid` int(11) NOT NULL, + `myval` varchar(10) DEFAULT NULL, + PRIMARY KEY (`myid`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 DATA DIRECTORY='MYSQLTEST_VARDIR/mysql-test-data-dir/' +select * from t1; +myid myval +2 two +3 threee +4 four +select * from t2; +myid myval +1 one +DROP TABLE t1, t2; +CREATE TABLE t1 +( +myid INT(11) NOT NULL, +myval VARCHAR(10), +PRIMARY KEY (myid) +) ENGINE=INNODB PARTITION BY RANGE (myid) +( +PARTITION p0001 VALUES LESS THAN (50) ENGINE = INNODB, +PARTITION p0002 VALUES LESS THAN (150) ENGINE = INNODB, +PARTITION p0003 VALUES LESS THAN (1050) ENGINE = INNODB, +PARTITION p0004 VALUES LESS THAN (10050) ENGINE = INNODB +); +CREATE TABLE t2 +( +myid INT(11) NOT NULL, +myval VARCHAR(10), +PRIMARY KEY (myid) +) ENGINE=INNODB DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir'; +insert into t1 values (1, 'one'); +insert into t2 values (2, 'two'), (3, 'threee'), (4, 'four'); +select * from t1; +myid myval +1 one +ALTER TABLE t1 EXCHANGE PARTITION p0001 WITH TABLE t2; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `myid` int(11) NOT NULL, + `myval` varchar(10) DEFAULT NULL, + PRIMARY KEY (`myid`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +/*!50100 PARTITION BY RANGE (myid) +(PARTITION p0001 VALUES LESS THAN (50) DATA DIRECTORY = 'MYSQLTEST_VARDIR/mysql-test-idx-dir' ENGINE = InnoDB, + PARTITION p0002 VALUES LESS THAN (150) ENGINE = InnoDB, + PARTITION p0003 VALUES LESS THAN (1050) ENGINE = InnoDB, + PARTITION p0004 VALUES LESS THAN (10050) ENGINE = InnoDB) */ +SHOW CREATE TABLE t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `myid` int(11) NOT NULL, + `myval` varchar(10) DEFAULT NULL, + PRIMARY KEY (`myid`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +select * from t1; +myid myval +2 two +3 threee +4 four +select * from t2; +myid myval +1 one +DROP TABLE t1, t2; +# # Cleanup # diff --git a/mysql-test/suite/parts/t/partition_alter_maria.test b/mysql-test/suite/parts/t/partition_alter_maria.test index e21f0dfab..e0b925639 100644 --- a/mysql-test/suite/parts/t/partition_alter_maria.test +++ b/mysql-test/suite/parts/t/partition_alter_maria.test @@ -17,5 +17,12 @@ alter table t1 drop partition p20181231; select * from t1; drop table t1; +# +# MDEV-13982 Server crashes in in ha_partition::engine_name +# +create table t1 (a int) engine=Aria transactional=1 partition by hash(a) partitions 2; +show create table t1; +drop table t1; + --let $engine=Aria --source inc/part_alter_values.inc diff --git a/mysql-test/suite/parts/t/partition_alter_myisam.test b/mysql-test/suite/parts/t/partition_alter_myisam.test index b2bd0e72e..7e984921c 100644 --- a/mysql-test/suite/parts/t/partition_alter_myisam.test +++ b/mysql-test/suite/parts/t/partition_alter_myisam.test @@ -1,4 +1,5 @@ --source include/have_partition.inc +--source include/have_symlink.inc --let $engine=MyISAM --source inc/part_alter_values.inc diff --git a/mysql-test/suite/parts/t/partition_basic_symlink_innodb.test b/mysql-test/suite/parts/t/partition_basic_symlink_innodb.test index 35dc2d5e0..31448c7a9 100644 --- a/mysql-test/suite/parts/t/partition_basic_symlink_innodb.test +++ b/mysql-test/suite/parts/t/partition_basic_symlink_innodb.test @@ -147,6 +147,147 @@ SHOW CREATE TABLE t1; DROP TABLE t1; +--echo # +--echo # MDEV-14611 ALTER TABLE EXCHANGE PARTITION does not work +--echo # properly when used with DATA DIRECTORY +--echo # +let $data_dir_path= $MYSQLTEST_VARDIR/mysql-test-data-dir; +let $alt_data_dir_path= $MYSQLTEST_VARDIR/mysql-test-idx-dir; +SET GLOBAL innodb_file_per_table = ON; +--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR +eval CREATE TABLE t1 +( + myid INT(11) NOT NULL, + myval VARCHAR(10), + PRIMARY KEY (myid) +) ENGINE=INNODB PARTITION BY KEY (myid) + ( + PARTITION p0001 DATA DIRECTORY = '$data_dir_path' ENGINE = INNODB, + PARTITION p0002 DATA DIRECTORY = '$data_dir_path' ENGINE = INNODB, + PARTITION p0003 DATA DIRECTORY = '$data_dir_path' ENGINE = INNODB, + PARTITION p0004 DATA DIRECTORY = '$data_dir_path' ENGINE = INNODB + ); + +--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR +eval CREATE TABLE t2 +( + myid INT(11) NOT NULL, + myval VARCHAR(10), + PRIMARY KEY (myid) +) ENGINE=INNODB DATA DIRECTORY = '$data_dir_path'; + +ALTER TABLE t1 EXCHANGE PARTITION p0001 WITH TABLE t2; + +--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR +SHOW CREATE TABLE t1; +DROP TABLE t1, t2; +--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR +eval CREATE TABLE t1 +( + myid INT(11) NOT NULL, + myval VARCHAR(10), + PRIMARY KEY (myid) +) ENGINE=INNODB PARTITION BY RANGE (myid) + ( + PARTITION p0001 VALUES LESS THAN (50) DATA DIRECTORY = '$data_dir_path' ENGINE = INNODB, + PARTITION p0002 VALUES LESS THAN (150) DATA DIRECTORY = '$data_dir_path' ENGINE = INNODB, + PARTITION p0003 VALUES LESS THAN (1050) DATA DIRECTORY = '$data_dir_path' ENGINE = INNODB, + PARTITION p0004 VALUES LESS THAN (10050) DATA DIRECTORY = '$data_dir_path' ENGINE = INNODB + ); + +--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR +eval CREATE TABLE t2 +( + myid INT(11) NOT NULL, + myval VARCHAR(10), + PRIMARY KEY (myid) +) ENGINE=INNODB DATA DIRECTORY = '$alt_data_dir_path'; + +insert into t1 values (1, 'one'); +insert into t2 values (2, 'two'), (3, 'threee'), (4, 'four'); + +select * from t1; +ALTER TABLE t1 EXCHANGE PARTITION p0001 WITH TABLE t2; + +--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR +SHOW CREATE TABLE t1; +--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR +SHOW CREATE TABLE t2; +select * from t1; +select * from t2; +DROP TABLE t1, t2; + +--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR +eval CREATE TABLE t1 +( + myid INT(11) NOT NULL, + myval VARCHAR(10), + PRIMARY KEY (myid) +) ENGINE=INNODB PARTITION BY RANGE (myid) + ( + PARTITION p0001 VALUES LESS THAN (50) DATA DIRECTORY = '$data_dir_path' ENGINE = INNODB, + PARTITION p0002 VALUES LESS THAN (150) DATA DIRECTORY = '$data_dir_path' ENGINE = INNODB, + PARTITION p0003 VALUES LESS THAN (1050) DATA DIRECTORY = '$data_dir_path' ENGINE = INNODB, + PARTITION p0004 VALUES LESS THAN (10050) DATA DIRECTORY = '$data_dir_path' ENGINE = INNODB + ); + +--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR +eval CREATE TABLE t2 +( + myid INT(11) NOT NULL, + myval VARCHAR(10), + PRIMARY KEY (myid) +) ENGINE=INNODB; + +insert into t1 values (1, 'one'); +insert into t2 values (2, 'two'), (3, 'threee'), (4, 'four'); + +select * from t1; +ALTER TABLE t1 EXCHANGE PARTITION p0001 WITH TABLE t2; + +--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR +SHOW CREATE TABLE t1; +--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR +SHOW CREATE TABLE t2; +select * from t1; +select * from t2; +DROP TABLE t1, t2; + +--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR +eval CREATE TABLE t1 +( + myid INT(11) NOT NULL, + myval VARCHAR(10), + PRIMARY KEY (myid) +) ENGINE=INNODB PARTITION BY RANGE (myid) + ( + PARTITION p0001 VALUES LESS THAN (50) ENGINE = INNODB, + PARTITION p0002 VALUES LESS THAN (150) ENGINE = INNODB, + PARTITION p0003 VALUES LESS THAN (1050) ENGINE = INNODB, + PARTITION p0004 VALUES LESS THAN (10050) ENGINE = INNODB + ); + +--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR +eval CREATE TABLE t2 +( + myid INT(11) NOT NULL, + myval VARCHAR(10), + PRIMARY KEY (myid) +) ENGINE=INNODB DATA DIRECTORY = '$alt_data_dir_path'; + +insert into t1 values (1, 'one'); +insert into t2 values (2, 'two'), (3, 'threee'), (4, 'four'); + +select * from t1; +ALTER TABLE t1 EXCHANGE PARTITION p0001 WITH TABLE t2; + +--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR +SHOW CREATE TABLE t1; +--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR +SHOW CREATE TABLE t2; +select * from t1; +select * from t2; +DROP TABLE t1, t2; --echo # --echo # Cleanup --echo # @@ -160,5 +301,3 @@ EVAL SET GLOBAL innodb_file_per_table=$innodb_file_per_table_orig; EVAL SET SESSION innodb_strict_mode=$innodb_strict_mode_orig; --enable_query_log - - diff --git a/mysql-test/suite/perfschema/r/hostcache_ipv4_max_con.result b/mysql-test/suite/perfschema/r/hostcache_ipv4_max_con.result index 31e4bc9f8..69e1ddb29 100644 --- a/mysql-test/suite/perfschema/r/hostcache_ipv4_max_con.result +++ b/mysql-test/suite/perfschema/r/hostcache_ipv4_max_con.result @@ -525,7 +525,7 @@ COUNT_UNKNOWN_ERRORS 0 FIRST_ERROR_SEEN set LAST_ERROR_SEEN set set global max_user_connections = 0; -set global max_connections = 3; +set global max_connections = 10; flush user_resources; select "Con4a is alive"; Con4a is alive diff --git a/mysql-test/suite/perfschema/r/hostcache_ipv6_max_con.result b/mysql-test/suite/perfschema/r/hostcache_ipv6_max_con.result index 4416b78d0..56eb6fe6a 100644 --- a/mysql-test/suite/perfschema/r/hostcache_ipv6_max_con.result +++ b/mysql-test/suite/perfschema/r/hostcache_ipv6_max_con.result @@ -525,7 +525,7 @@ COUNT_UNKNOWN_ERRORS 0 FIRST_ERROR_SEEN set LAST_ERROR_SEEN set set global max_user_connections = 0; -set global max_connections = 3; +set global max_connections = 10; flush user_resources; select "Con4a is alive"; Con4a is alive diff --git a/mysql-test/suite/perfschema/r/partition.result b/mysql-test/suite/perfschema/r/partition.result new file mode 100644 index 000000000..9bc624268 --- /dev/null +++ b/mysql-test/suite/perfschema/r/partition.result @@ -0,0 +1,10 @@ +# +# MDEV-10679 +# Server crashes in in mysql_create_frm_image upon query from +# performance schema in ps-protocol mode +# +CREATE TABLE t1 (i INT); +ALTER TABLE t1 ADD PARTITION (PARTITION p VALUES LESS THAN (1)); +ERROR HY000: Partition management on a not partitioned table is not possible +SELECT * FROM performance_schema.events_stages_summary_by_user_by_event_name; +DROP TABLE t1; diff --git a/mysql-test/suite/perfschema/t/hostcache_ipv4_max_con.test b/mysql-test/suite/perfschema/t/hostcache_ipv4_max_con.test index 3bf5ef3b6..a76e04ea3 100644 --- a/mysql-test/suite/perfschema/t/hostcache_ipv4_max_con.test +++ b/mysql-test/suite/perfschema/t/hostcache_ipv4_max_con.test @@ -176,9 +176,17 @@ disconnect con4c; --source ../include/wait_for_pfs_thread_count.inc set global max_user_connections = 0; -set global max_connections = 3; +set global max_connections = 10; flush user_resources; +connect (tmp_con1,localhost,root,,); +connect (tmp_con2,localhost,root,,); +connect (tmp_con3,localhost,root,,); +connect (tmp_con4,localhost,root,,); +connect (tmp_con5,localhost,root,,); +connect (tmp_con6,localhost,root,,); +connect (tmp_con7,localhost,root,,); + connect (con5a,"127.0.0.1",quota,,test,$MASTER_MYPORT,); select "Con4a is alive"; select current_user(); @@ -233,6 +241,13 @@ connect (con5d,"127.0.0.1",quota,,test,$MASTER_MYPORT,); disconnect con5a; disconnect con5b; +--disconnect tmp_con1 +--disconnect tmp_con2 +--disconnect tmp_con3 +--disconnect tmp_con4 +--disconnect tmp_con5 +--disconnect tmp_con6 +--disconnect tmp_con7 # Wait for all disconnects --source ../include/wait_for_pfs_thread_count.inc diff --git a/mysql-test/suite/perfschema/t/hostcache_ipv6_max_con.test b/mysql-test/suite/perfschema/t/hostcache_ipv6_max_con.test index 0ced79544..96a5d10d6 100644 --- a/mysql-test/suite/perfschema/t/hostcache_ipv6_max_con.test +++ b/mysql-test/suite/perfschema/t/hostcache_ipv6_max_con.test @@ -177,9 +177,17 @@ disconnect con4c; --source ../include/wait_for_pfs_thread_count.inc set global max_user_connections = 0; -set global max_connections = 3; +set global max_connections = 10; flush user_resources; +connect (tmp_con1,localhost,root,,); +connect (tmp_con2,localhost,root,,); +connect (tmp_con3,localhost,root,,); +connect (tmp_con4,localhost,root,,); +connect (tmp_con5,localhost,root,,); +connect (tmp_con6,localhost,root,,); +connect (tmp_con7,localhost,root,,); + connect (con5a,"::1",quota,,test,$MASTER_MYPORT,); select "Con4a is alive"; select current_user(); @@ -215,6 +223,13 @@ connect (con5d,"::1",quota,,test,$MASTER_MYPORT,); disconnect con5a; disconnect con5b; +--disconnect tmp_con1 +--disconnect tmp_con2 +--disconnect tmp_con3 +--disconnect tmp_con4 +--disconnect tmp_con5 +--disconnect tmp_con6 +--disconnect tmp_con7 # Wait for all disconnects --source ../include/wait_for_pfs_thread_count.inc diff --git a/mysql-test/suite/perfschema/t/partition.test b/mysql-test/suite/perfschema/t/partition.test new file mode 100644 index 000000000..073a41e92 --- /dev/null +++ b/mysql-test/suite/perfschema/t/partition.test @@ -0,0 +1,15 @@ +--source include/have_perfschema.inc + +--echo # +--echo # MDEV-10679 +--echo # Server crashes in in mysql_create_frm_image upon query from +--echo # performance schema in ps-protocol mode +--echo # + +CREATE TABLE t1 (i INT); +--error ER_PARTITION_MGMT_ON_NONPARTITIONED +ALTER TABLE t1 ADD PARTITION (PARTITION p VALUES LESS THAN (1)); +--disable_result_log +SELECT * FROM performance_schema.events_stages_summary_by_user_by_event_name; +--enable_result_log +DROP TABLE t1; diff --git a/mysql-test/suite/plugins/r/processlist.result b/mysql-test/suite/plugins/r/processlist.result new file mode 100644 index 000000000..d08ea9d35 --- /dev/null +++ b/mysql-test/suite/plugins/r/processlist.result @@ -0,0 +1,8 @@ +create table t1 (a int) engine=innodb; +start transaction; +insert t1 values (1); +state from show engine innodb status + +state from show processlist + +drop table t1; diff --git a/mysql-test/suite/plugins/r/server_audit.result b/mysql-test/suite/plugins/r/server_audit.result index 3971504b2..5c355b34b 100644 --- a/mysql-test/suite/plugins/r/server_audit.result +++ b/mysql-test/suite/plugins/r/server_audit.result @@ -182,6 +182,17 @@ select 2; 2 2 drop table t1; +set global server_audit_events='query_dml_no_select'; +create table t1(id int); +insert into t1 values (1), (2); +select * from t1; +id +1 +2 +select 2; +2 +2 +drop table t1; set global server_audit_events=''; set global server_audit_query_log_limit= 15; select (1), (2), (3), (4); @@ -343,6 +354,7 @@ TIME,HOSTNAME,root,localhost,ID,ID,QUERY,sa_db,'SET PASSWORD \n# comment\nFOR u1 TIME,HOSTNAME,root,localhost,ID,ID,QUERY,sa_db,'SET PASSWORD FOR u1=',ID TIME,HOSTNAME,root,localhost,ID,ID,QUERY,sa_db,'CREATE USER u3 IDENTIFIED BY *****',0 TIME,HOSTNAME,root,localhost,ID,ID,QUERY,sa_db,'drop user u1, u2, u3',0 +TIME,HOSTNAME,root,localhost,ID,ID,QUERY,sa_db,'insert into t1 values (1), (2)',0 TIME,HOSTNAME,root,localhost,ID,ID,QUERY,sa_db,'set global server_audit_events=\'\'',0 TIME,HOSTNAME,root,localhost,ID,ID,QUERY,sa_db,'set global serv',0 TIME,HOSTNAME,root,localhost,ID,ID,QUERY,sa_db,'select (1), (2)',0 diff --git a/mysql-test/suite/plugins/t/processlist.test b/mysql-test/suite/plugins/t/processlist.test new file mode 100644 index 000000000..5aacef317 --- /dev/null +++ b/mysql-test/suite/plugins/t/processlist.test @@ -0,0 +1,18 @@ +# +# MDEV-15359 Thread stay in "cleaning up" status after finishing +# +source include/have_innodb.inc; + +create table t1 (a int) engine=innodb; +start transaction; +insert t1 values (1); +let id=`select connection_id()`; +connect con2,localhost,root; +let s=query_get_value(show engine innodb status,Status,1); +disable_query_log; +eval select regexp_replace("$s", '(?s)^.*MySQL thread id $id,.*root([^\n]*)\n.*', '\\\\1') as `state from show engine innodb status`; +eval select state as `state from show processlist` from information_schema.processlist where id = $id; +enable_query_log; +disconnect con2; +connection default; +drop table t1; diff --git a/mysql-test/suite/plugins/t/server_audit.test b/mysql-test/suite/plugins/t/server_audit.test index 9be0d5556..4af1ed883 100644 --- a/mysql-test/suite/plugins/t/server_audit.test +++ b/mysql-test/suite/plugins/t/server_audit.test @@ -42,8 +42,10 @@ select 1, 3; insert into t2 values (1), (2); select * from t2; +--disable_ps_protocol --error ER_NO_SUCH_TABLE select * from t_doesnt_exist; +--enable_ps_protocol --error 1064 syntax_error_query; drop table renamed_t1, t2; @@ -119,6 +121,13 @@ select 2; /*! select 2*/; /*comment*/ select 2; drop table t1; +set global server_audit_events='query_dml_no_select'; +create table t1(id int); +insert into t1 values (1), (2); +select * from t1; +select 2; +drop table t1; + set global server_audit_events=''; set global server_audit_query_log_limit= 15; diff --git a/mysql-test/suite/rpl/r/rename.result b/mysql-test/suite/rpl/r/rename.result new file mode 100644 index 000000000..5cedea51c --- /dev/null +++ b/mysql-test/suite/rpl/r/rename.result @@ -0,0 +1,34 @@ +include/master-slave.inc +[connection master] +# +# MDEV-16229 Replication aborts with ER_VIEW_SELECT_TMPTABLE after +# half-failed RENAME +# +CREATE TABLE t1 (a INT); +CREATE TEMPORARY TABLE t1 (b INT); +RENAME TABLE t1 TO tmp, tmp TO t1; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TEMPORARY TABLE `t1` ( + `b` int(11) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +CREATE VIEW v AS SELECT * FROM t1; +ERROR HY000: View's SELECT refers to a temporary table 't1' +RENAME TABLE t1 TO tmp, t1 TO t2; +SHOW CREATE TABLE tmp; +Table Create Table +tmp CREATE TEMPORARY TABLE `tmp` ( + `b` int(11) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +SHOW CREATE TABLE t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `a` int(11) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +CREATE VIEW v AS SELECT * FROM tmp; +ERROR HY000: View's SELECT refers to a temporary table 'tmp' +CREATE VIEW v AS SELECT * FROM t2; +DROP VIEW v; +DROP TABLE tmp; +DROP TABLE t2; +include/rpl_end.inc diff --git a/mysql-test/suite/rpl/r/rpl_mixed_implicit_commit_binlog.result b/mysql-test/suite/rpl/r/rpl_mixed_implicit_commit_binlog.result index 328c3c342..7efb1f716 100644 --- a/mysql-test/suite/rpl/r/rpl_mixed_implicit_commit_binlog.result +++ b/mysql-test/suite/rpl/r/rpl_mixed_implicit_commit_binlog.result @@ -13,612 +13,319 @@ INSERT INTO tt_2(ddl_case) VALUES(0); # CHECK IMPLICT COMMIT ######################################################################### SET AUTOCOMMIT= 0; --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- INSERT INTO tt_1(ddl_case) VALUES (43); CREATE FUNCTION myfunc_int RETURNS INTEGER SONAME "UDF_EXAMPLE_LIB"; --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info -master-bin.000001 # Gtid # # BEGIN GTID #-#-# -master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(ddl_case) VALUES (43) -master-bin.000001 # Xid # # COMMIT /* XID */ -master-bin.000001 # Gtid # # GTID #-#-# -master-bin.000001 # Query # # use `test`; CREATE FUNCTION myfunc_int RETURNS INTEGER SONAME "LIB" --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- INSERT INTO tt_1(ddl_case) VALUES (42); DROP FUNCTION myfunc_int; --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info -master-bin.000001 # Gtid # # BEGIN GTID #-#-# -master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(ddl_case) VALUES (42) -master-bin.000001 # Xid # # COMMIT /* XID */ -master-bin.000001 # Gtid # # GTID #-#-# -master-bin.000001 # Query # # use `test`; DROP FUNCTION myfunc_int --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- INSERT INTO tt_1(ddl_case) VALUES (41); LOAD INDEX INTO CACHE nt_1 IGNORE LEAVES; Table Op Msg_type Msg_text test.nt_1 preload_keys status OK --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info -master-bin.000001 # Gtid # # BEGIN GTID #-#-# -master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(ddl_case) VALUES (41) -master-bin.000001 # Xid # # COMMIT /* XID */ --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- INSERT INTO tt_1(ddl_case) VALUES (40); LOAD INDEX INTO CACHE tt_1, tt_2 IGNORE LEAVES; Table Op Msg_type Msg_text test.tt_1 preload_keys note The storage engine for the table doesn't support preload_keys test.tt_2 preload_keys note The storage engine for the table doesn't support preload_keys --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info -master-bin.000001 # Gtid # # BEGIN GTID #-#-# -master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(ddl_case) VALUES (40) -master-bin.000001 # Xid # # COMMIT /* XID */ --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- INSERT INTO tt_1(ddl_case) VALUES (39); ANALYZE TABLE nt_1; Table Op Msg_type Msg_text test.nt_1 analyze status Table is already up to date --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info -master-bin.000001 # Gtid # # BEGIN GTID #-#-# -master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(ddl_case) VALUES (39) -master-bin.000001 # Xid # # COMMIT /* XID */ -master-bin.000001 # Gtid # # GTID #-#-# -master-bin.000001 # Query # # use `test`; ANALYZE TABLE nt_1 --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- INSERT INTO tt_1(ddl_case) VALUES (38); CHECK TABLE nt_1; Table Op Msg_type Msg_text test.nt_1 check status OK --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info -master-bin.000001 # Gtid # # BEGIN GTID #-#-# -master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(ddl_case) VALUES (38) -master-bin.000001 # Xid # # COMMIT /* XID */ --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- INSERT INTO tt_1(ddl_case) VALUES (37); OPTIMIZE TABLE nt_1; Table Op Msg_type Msg_text test.nt_1 optimize status Table is already up to date --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- +INSERT INTO tt_1(ddl_case) VALUES (36); +REPAIR TABLE nt_1; +Table Op Msg_type Msg_text +test.nt_1 repair status OK +INSERT INTO tt_1(ddl_case) VALUES (35); +LOCK TABLES tt_1 WRITE; +INSERT INTO tt_1(ddl_case) VALUES (34); +UNLOCK TABLES; +INSERT INTO tt_1(ddl_case) VALUES (33); +CREATE USER 'user'@'localhost'; +INSERT INTO tt_1(ddl_case) VALUES (32); +GRANT ALL ON *.* TO 'user'@'localhost'; +INSERT INTO tt_1(ddl_case) VALUES (31); +SET PASSWORD FOR 'user'@'localhost' = PASSWORD('newpass'); +INSERT INTO tt_1(ddl_case) VALUES (30); +REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'user'@'localhost'; +INSERT INTO tt_1(ddl_case) VALUES (29); +RENAME USER 'user'@'localhost' TO 'user_new'@'localhost'; +INSERT INTO tt_1(ddl_case) VALUES (28); +DROP USER 'user_new'@'localhost'; +INSERT INTO tt_1(ddl_case) VALUES (27); +CREATE EVENT evt ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 HOUR DO SELECT * FROM tt_1; +INSERT INTO tt_1(ddl_case) VALUES (26); +ALTER EVENT evt COMMENT 'evt'; +INSERT INTO tt_1(ddl_case) VALUES (25); +DROP EVENT evt; +INSERT INTO tt_1(ddl_case) VALUES (24); +CREATE TRIGGER tr AFTER INSERT ON tt_1 FOR EACH ROW UPDATE tt_2 SET ddl_case = ddl_case WHERE ddl_case= NEW.ddl_case; +INSERT INTO tt_1(ddl_case) VALUES (23); +DROP TRIGGER tr; +INSERT INTO tt_1(ddl_case) VALUES (22); +CREATE FUNCTION fc () RETURNS VARCHAR(64) RETURN "fc"; +INSERT INTO tt_1(ddl_case) VALUES (21); +ALTER FUNCTION fc COMMENT 'fc'; +INSERT INTO tt_1(ddl_case) VALUES (20); +DROP FUNCTION fc; +INSERT INTO tt_1(ddl_case) VALUES (19); +CREATE PROCEDURE pc () UPDATE tt_2 SET ddl_case = ddl_case WHERE ddl_case= NEW.ddl_case; +INSERT INTO tt_1(ddl_case) VALUES (18); +ALTER PROCEDURE pc COMMENT 'pc'; +INSERT INTO tt_1(ddl_case) VALUES (17); +DROP PROCEDURE pc; +INSERT INTO tt_1(ddl_case) VALUES (16); +CREATE VIEW v AS SELECT * FROM tt_1; +INSERT INTO tt_1(ddl_case) VALUES (15); +ALTER VIEW v AS SELECT * FROM tt_1; +INSERT INTO tt_1(ddl_case) VALUES (14); +DROP VIEW v; +INSERT INTO tt_1(ddl_case) VALUES (13); +CREATE INDEX ix ON tt_1(ddl_case); +INSERT INTO tt_1(ddl_case) VALUES (12); +DROP INDEX ix ON tt_1; +INSERT INTO tt_1(ddl_case) VALUES (11); +CREATE TEMPORARY TABLE tt_xx (a int); +INSERT INTO tt_1(ddl_case) VALUES (10); +ALTER TABLE tt_xx ADD COLUMN (b int); +INSERT INTO tt_1(ddl_case) VALUES (9); +ALTER TABLE tt_xx RENAME new_tt_xx; +INSERT INTO tt_1(ddl_case) VALUES (8); +DROP TEMPORARY TABLE IF EXISTS new_tt_xx; +INSERT INTO tt_1(ddl_case) VALUES (7); +CREATE TABLE tt_xx (a int); +INSERT INTO tt_1(ddl_case) VALUES (6); +ALTER TABLE tt_xx ADD COLUMN (b int); +INSERT INTO tt_1(ddl_case) VALUES (5); +RENAME TABLE tt_xx TO new_tt_xx; +INSERT INTO tt_1(ddl_case) VALUES (4); +TRUNCATE TABLE new_tt_xx; +INSERT INTO tt_1(ddl_case) VALUES (3); +DROP TABLE IF EXISTS tt_xx, new_tt_xx; +Warnings: +Note 1051 Unknown table 'test.tt_xx' +INSERT INTO tt_1(ddl_case) VALUES (2); +CREATE DATABASE db; +INSERT INTO tt_1(ddl_case) VALUES (1); +DROP DATABASE IF EXISTS db; include/show_binlog_events.inc Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Gtid # # GTID #-#-# +master-bin.000001 # Query # # use `test`; CREATE TABLE tt_1 (ddl_case INT, PRIMARY KEY(ddl_case)) ENGINE = Innodb +master-bin.000001 # Gtid # # GTID #-#-# +master-bin.000001 # Query # # use `test`; CREATE TABLE tt_2 (ddl_case INT, PRIMARY KEY(ddl_case)) ENGINE = Innodb +master-bin.000001 # Gtid # # GTID #-#-# +master-bin.000001 # Query # # use `test`; CREATE TABLE nt_1 (ddl_case INT, PRIMARY KEY(ddl_case)) ENGINE = MyIsam +master-bin.000001 # Gtid # # BEGIN GTID #-#-# +master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(ddl_case) VALUES(0) +master-bin.000001 # Xid # # COMMIT /* XID */ +master-bin.000001 # Gtid # # BEGIN GTID #-#-# +master-bin.000001 # Query # # use `test`; INSERT INTO tt_2(ddl_case) VALUES(0) +master-bin.000001 # Xid # # COMMIT /* XID */ +master-bin.000001 # Gtid # # BEGIN GTID #-#-# +master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(ddl_case) VALUES (43) +master-bin.000001 # Xid # # COMMIT /* XID */ +master-bin.000001 # Gtid # # GTID #-#-# +master-bin.000001 # Query # # use `test`; CREATE FUNCTION myfunc_int RETURNS INTEGER SONAME "LIB" +master-bin.000001 # Gtid # # BEGIN GTID #-#-# +master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(ddl_case) VALUES (42) +master-bin.000001 # Xid # # COMMIT /* XID */ +master-bin.000001 # Gtid # # GTID #-#-# +master-bin.000001 # Query # # use `test`; DROP FUNCTION myfunc_int +master-bin.000001 # Gtid # # BEGIN GTID #-#-# +master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(ddl_case) VALUES (41) +master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(ddl_case) VALUES (40) +master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(ddl_case) VALUES (39) +master-bin.000001 # Xid # # COMMIT /* XID */ +master-bin.000001 # Gtid # # GTID #-#-# +master-bin.000001 # Query # # use `test`; ANALYZE TABLE nt_1 +master-bin.000001 # Gtid # # BEGIN GTID #-#-# +master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(ddl_case) VALUES (38) +master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(ddl_case) VALUES (37) master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; OPTIMIZE TABLE nt_1 --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (36); -REPAIR TABLE nt_1; -Table Op Msg_type Msg_text -test.nt_1 repair status OK --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(ddl_case) VALUES (36) master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; REPAIR TABLE nt_1 --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (35); -LOCK TABLES tt_1 WRITE; --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(ddl_case) VALUES (35) master-bin.000001 # Xid # # COMMIT /* XID */ --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (34); -UNLOCK TABLES; --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(ddl_case) VALUES (34) master-bin.000001 # Xid # # COMMIT /* XID */ --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (33); -CREATE USER 'user'@'localhost'; --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(ddl_case) VALUES (33) master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; CREATE USER 'user'@'localhost' --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (32); -GRANT ALL ON *.* TO 'user'@'localhost'; --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(ddl_case) VALUES (32) master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; GRANT ALL ON *.* TO 'user'@'localhost' --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (31); -SET PASSWORD FOR 'user'@'localhost' = PASSWORD('newpass'); --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(ddl_case) VALUES (31) master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; SET PASSWORD FOR 'user'@'localhost'='*D8DECEC305209EEFEC43008E1D420E1AA06B19E0' --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (30); -REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'user'@'localhost'; --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(ddl_case) VALUES (30) master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'user'@'localhost' --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (29); -RENAME USER 'user'@'localhost' TO 'user_new'@'localhost'; --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(ddl_case) VALUES (29) master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; RENAME USER 'user'@'localhost' TO 'user_new'@'localhost' --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (28); -DROP USER 'user_new'@'localhost'; --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(ddl_case) VALUES (28) master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; DROP USER 'user_new'@'localhost' --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (27); -CREATE EVENT evt ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 HOUR DO SELECT * FROM tt_1; --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(ddl_case) VALUES (27) master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; CREATE DEFINER=`root`@`localhost` EVENT evt ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 HOUR DO SELECT * FROM tt_1 --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (26); -ALTER EVENT evt COMMENT 'evt'; --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(ddl_case) VALUES (26) master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; ALTER EVENT evt COMMENT 'evt' --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (25); -DROP EVENT evt; --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(ddl_case) VALUES (25) master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; DROP EVENT evt --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (24); -CREATE TRIGGER tr AFTER INSERT ON tt_1 FOR EACH ROW UPDATE tt_2 SET ddl_case = ddl_case WHERE ddl_case= NEW.ddl_case; --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(ddl_case) VALUES (24) master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; CREATE DEFINER=`root`@`localhost` TRIGGER tr AFTER INSERT ON tt_1 FOR EACH ROW UPDATE tt_2 SET ddl_case = ddl_case WHERE ddl_case= NEW.ddl_case --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (23); -DROP TRIGGER tr; --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(ddl_case) VALUES (23) master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; DROP TRIGGER tr --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (22); -CREATE FUNCTION fc () RETURNS VARCHAR(64) RETURN "fc"; --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(ddl_case) VALUES (22) master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; CREATE DEFINER=`root`@`localhost` FUNCTION `fc`() RETURNS varchar(64) CHARSET latin1 RETURN "fc" --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (21); -ALTER FUNCTION fc COMMENT 'fc'; --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(ddl_case) VALUES (21) master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; ALTER FUNCTION fc COMMENT 'fc' --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (20); -DROP FUNCTION fc; --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(ddl_case) VALUES (20) master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; DROP FUNCTION fc --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (19); -CREATE PROCEDURE pc () UPDATE tt_2 SET ddl_case = ddl_case WHERE ddl_case= NEW.ddl_case; --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(ddl_case) VALUES (19) master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; CREATE DEFINER=`root`@`localhost` PROCEDURE `pc`() UPDATE tt_2 SET ddl_case = ddl_case WHERE ddl_case= NEW.ddl_case --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (18); -ALTER PROCEDURE pc COMMENT 'pc'; --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(ddl_case) VALUES (18) master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; ALTER PROCEDURE pc COMMENT 'pc' --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (17); -DROP PROCEDURE pc; --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(ddl_case) VALUES (17) master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; DROP PROCEDURE pc --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (16); -CREATE VIEW v AS SELECT * FROM tt_1; --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(ddl_case) VALUES (16) master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v` AS SELECT * FROM tt_1 --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (15); -ALTER VIEW v AS SELECT * FROM tt_1; --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(ddl_case) VALUES (15) master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; ALTER ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v` AS SELECT * FROM tt_1 --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (14); -DROP VIEW v; --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(ddl_case) VALUES (14) master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; DROP VIEW v --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (13); -CREATE INDEX ix ON tt_1(ddl_case); --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(ddl_case) VALUES (13) master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; CREATE INDEX ix ON tt_1(ddl_case) --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (12); -DROP INDEX ix ON tt_1; --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(ddl_case) VALUES (12) master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; DROP INDEX ix ON tt_1 --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (11); -CREATE TEMPORARY TABLE tt_xx (a int); --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(ddl_case) VALUES (11) master-bin.000001 # Query # # use `test`; CREATE TEMPORARY TABLE tt_xx (a int) +master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(ddl_case) VALUES (10) master-bin.000001 # Xid # # COMMIT /* XID */ --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (10); -ALTER TABLE tt_xx ADD COLUMN (b int); --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info -master-bin.000001 # Gtid # # BEGIN GTID #-#-# -master-bin.000001 # Table_map # # table_id: # (test.tt_1) -master-bin.000001 # Write_rows_v1 # # table_id: # flags: STMT_END_F -master-bin.000001 # Xid # # COMMIT /* XID */ --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (9); -ALTER TABLE tt_xx RENAME new_tt_xx; --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Gtid # # GTID #-#-# +master-bin.000001 # Query # # use `test`; ALTER TABLE tt_xx ADD COLUMN (b int) master-bin.000001 # Gtid # # BEGIN GTID #-#-# -master-bin.000001 # Table_map # # table_id: # (test.tt_1) -master-bin.000001 # Write_rows_v1 # # table_id: # flags: STMT_END_F +master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(ddl_case) VALUES (9) master-bin.000001 # Xid # # COMMIT /* XID */ --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (8); -DROP TEMPORARY TABLE IF EXISTS new_tt_xx; --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Gtid # # GTID #-#-# +master-bin.000001 # Query # # use `test`; ALTER TABLE tt_xx RENAME new_tt_xx master-bin.000001 # Gtid # # BEGIN GTID #-#-# -master-bin.000001 # Table_map # # table_id: # (test.tt_1) -master-bin.000001 # Write_rows_v1 # # table_id: # flags: STMT_END_F +master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(ddl_case) VALUES (8) master-bin.000001 # Query # # DROP TEMPORARY TABLE IF EXISTS `test`.`new_tt_xx` /* generated by server */ -master-bin.000001 # Xid # # COMMIT /* XID */ --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (7); -CREATE TABLE tt_xx (a int); --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info -master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(ddl_case) VALUES (7) master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; CREATE TABLE tt_xx (a int) --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (6); -ALTER TABLE tt_xx ADD COLUMN (b int); --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(ddl_case) VALUES (6) master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; ALTER TABLE tt_xx ADD COLUMN (b int) --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (5); -RENAME TABLE tt_xx TO new_tt_xx; --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(ddl_case) VALUES (5) master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; RENAME TABLE tt_xx TO new_tt_xx --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (4); -TRUNCATE TABLE new_tt_xx; --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(ddl_case) VALUES (4) master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; TRUNCATE TABLE new_tt_xx --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (3); -DROP TABLE IF EXISTS tt_xx, new_tt_xx; -Warnings: -Note 1051 Unknown table 'test.tt_xx' --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(ddl_case) VALUES (3) master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; DROP TABLE IF EXISTS `tt_xx`,`new_tt_xx` /* generated by server */ --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (2); -CREATE DATABASE db; --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(ddl_case) VALUES (2) master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # CREATE DATABASE db --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (1); -DROP DATABASE IF EXISTS db; --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(ddl_case) VALUES (1) master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # DROP DATABASE IF EXISTS db --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - +SET AUTOCOMMIT= 1; ################################################################################### # CHECK CONSISTENCY ################################################################################### @@ -626,4 +333,7 @@ include/diff_tables.inc [master:tt_1,slave:tt_1] ################################################################################### # CLEAN ################################################################################### +DROP TABLE tt_1; +DROP TABLE tt_2; +DROP TABLE nt_1; include/rpl_end.inc diff --git a/mysql-test/suite/rpl/r/rpl_parallel_optimistic.result b/mysql-test/suite/rpl/r/rpl_parallel_optimistic.result index 0177e65b1..a6da3399f 100644 --- a/mysql-test/suite/rpl/r/rpl_parallel_optimistic.result +++ b/mysql-test/suite/rpl/r/rpl_parallel_optimistic.result @@ -1,4 +1,6 @@ include/rpl_init.inc [topology=1->2] +call mtr.add_suppression("Warning.*Deadlock found when trying to get lock; try restarting transaction"); +call mtr.add_suppression("Warning.*mysqld: Can't find record in 't2'"); ALTER TABLE mysql.gtid_slave_pos ENGINE=InnoDB; CREATE TABLE t1 (a int PRIMARY KEY, b INT) ENGINE=InnoDB; SET @old_parallel_threads=@@GLOBAL.slave_parallel_threads; @@ -543,6 +545,27 @@ a b 57 7 58 8 59 9 +DELETE FROM t1; +DELETE FROM t2; +include/save_master_gtid.inc +include/sync_with_master_gtid.inc +BEGIN; +INSERT INTO t1 SET a=1; +SET @save.binlog_format=@@session.binlog_format; +SET @@SESSION.binlog_format=row; +BEGIN; +INSERT INTO t1 SET a=1; +INSERT INTO t2 SET a=1; +COMMIT; +BEGIN; +DELETE FROM t2; +COMMIT; +ROLLBACK; +SET @@SESSION.binlog_format= @save.binlog_format; +DELETE FROM t1; +DELETE FROM t2; +include/save_master_gtid.inc +include/sync_with_master_gtid.inc include/stop_slave.inc SET GLOBAL slave_parallel_mode=@old_parallel_mode; SET GLOBAL slave_parallel_threads=@old_parallel_threads; diff --git a/mysql-test/suite/rpl/r/rpl_row_implicit_commit_binlog.result b/mysql-test/suite/rpl/r/rpl_row_implicit_commit_binlog.result index 95167311c..1618ee318 100644 --- a/mysql-test/suite/rpl/r/rpl_row_implicit_commit_binlog.result +++ b/mysql-test/suite/rpl/r/rpl_row_implicit_commit_binlog.result @@ -13,316 +13,229 @@ INSERT INTO tt_2(ddl_case) VALUES(0); # CHECK IMPLICT COMMIT ######################################################################### SET AUTOCOMMIT= 0; --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- INSERT INTO tt_1(ddl_case) VALUES (43); CREATE FUNCTION myfunc_int RETURNS INTEGER SONAME "UDF_EXAMPLE_LIB"; --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- +INSERT INTO tt_1(ddl_case) VALUES (42); +DROP FUNCTION myfunc_int; +INSERT INTO tt_1(ddl_case) VALUES (41); +LOAD INDEX INTO CACHE nt_1 IGNORE LEAVES; +Table Op Msg_type Msg_text +test.nt_1 preload_keys status OK +INSERT INTO tt_1(ddl_case) VALUES (40); +LOAD INDEX INTO CACHE tt_1, tt_2 IGNORE LEAVES; +Table Op Msg_type Msg_text +test.tt_1 preload_keys note The storage engine for the table doesn't support preload_keys +test.tt_2 preload_keys note The storage engine for the table doesn't support preload_keys +INSERT INTO tt_1(ddl_case) VALUES (39); +ANALYZE TABLE nt_1; +Table Op Msg_type Msg_text +test.nt_1 analyze status Table is already up to date +INSERT INTO tt_1(ddl_case) VALUES (38); +CHECK TABLE nt_1; +Table Op Msg_type Msg_text +test.nt_1 check status OK +INSERT INTO tt_1(ddl_case) VALUES (37); +OPTIMIZE TABLE nt_1; +Table Op Msg_type Msg_text +test.nt_1 optimize status Table is already up to date +INSERT INTO tt_1(ddl_case) VALUES (36); +REPAIR TABLE nt_1; +Table Op Msg_type Msg_text +test.nt_1 repair status OK +INSERT INTO tt_1(ddl_case) VALUES (35); +LOCK TABLES tt_1 WRITE; +INSERT INTO tt_1(ddl_case) VALUES (34); +UNLOCK TABLES; +INSERT INTO tt_1(ddl_case) VALUES (33); +CREATE USER 'user'@'localhost'; +INSERT INTO tt_1(ddl_case) VALUES (32); +GRANT ALL ON *.* TO 'user'@'localhost'; +INSERT INTO tt_1(ddl_case) VALUES (31); +SET PASSWORD FOR 'user'@'localhost' = PASSWORD('newpass'); +INSERT INTO tt_1(ddl_case) VALUES (30); +REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'user'@'localhost'; +INSERT INTO tt_1(ddl_case) VALUES (29); +RENAME USER 'user'@'localhost' TO 'user_new'@'localhost'; +INSERT INTO tt_1(ddl_case) VALUES (28); +DROP USER 'user_new'@'localhost'; +INSERT INTO tt_1(ddl_case) VALUES (27); +CREATE EVENT evt ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 HOUR DO SELECT * FROM tt_1; +INSERT INTO tt_1(ddl_case) VALUES (26); +ALTER EVENT evt COMMENT 'evt'; +INSERT INTO tt_1(ddl_case) VALUES (25); +DROP EVENT evt; +INSERT INTO tt_1(ddl_case) VALUES (24); +CREATE TRIGGER tr AFTER INSERT ON tt_1 FOR EACH ROW UPDATE tt_2 SET ddl_case = ddl_case WHERE ddl_case= NEW.ddl_case; +INSERT INTO tt_1(ddl_case) VALUES (23); +DROP TRIGGER tr; +INSERT INTO tt_1(ddl_case) VALUES (22); +CREATE FUNCTION fc () RETURNS VARCHAR(64) RETURN "fc"; +INSERT INTO tt_1(ddl_case) VALUES (21); +ALTER FUNCTION fc COMMENT 'fc'; +INSERT INTO tt_1(ddl_case) VALUES (20); +DROP FUNCTION fc; +INSERT INTO tt_1(ddl_case) VALUES (19); +CREATE PROCEDURE pc () UPDATE tt_2 SET ddl_case = ddl_case WHERE ddl_case= NEW.ddl_case; +INSERT INTO tt_1(ddl_case) VALUES (18); +ALTER PROCEDURE pc COMMENT 'pc'; +INSERT INTO tt_1(ddl_case) VALUES (17); +DROP PROCEDURE pc; +INSERT INTO tt_1(ddl_case) VALUES (16); +CREATE VIEW v AS SELECT * FROM tt_1; +INSERT INTO tt_1(ddl_case) VALUES (15); +ALTER VIEW v AS SELECT * FROM tt_1; +INSERT INTO tt_1(ddl_case) VALUES (14); +DROP VIEW v; +INSERT INTO tt_1(ddl_case) VALUES (13); +CREATE INDEX ix ON tt_1(ddl_case); +INSERT INTO tt_1(ddl_case) VALUES (12); +DROP INDEX ix ON tt_1; +INSERT INTO tt_1(ddl_case) VALUES (11); +CREATE TEMPORARY TABLE tt_xx (a int); +INSERT INTO tt_1(ddl_case) VALUES (10); +ALTER TABLE tt_xx ADD COLUMN (b int); +INSERT INTO tt_1(ddl_case) VALUES (9); +ALTER TABLE tt_xx RENAME new_tt_xx; +INSERT INTO tt_1(ddl_case) VALUES (8); +DROP TEMPORARY TABLE IF EXISTS new_tt_xx; +INSERT INTO tt_1(ddl_case) VALUES (7); +CREATE TABLE tt_xx (a int); +INSERT INTO tt_1(ddl_case) VALUES (6); +ALTER TABLE tt_xx ADD COLUMN (b int); +INSERT INTO tt_1(ddl_case) VALUES (5); +RENAME TABLE tt_xx TO new_tt_xx; +INSERT INTO tt_1(ddl_case) VALUES (4); +TRUNCATE TABLE new_tt_xx; +INSERT INTO tt_1(ddl_case) VALUES (3); +DROP TABLE IF EXISTS tt_xx, new_tt_xx; +Warnings: +Note 1051 Unknown table 'test.tt_xx' +INSERT INTO tt_1(ddl_case) VALUES (2); +CREATE DATABASE db; +INSERT INTO tt_1(ddl_case) VALUES (1); +DROP DATABASE IF EXISTS db; include/show_binlog_events.inc Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Gtid # # GTID #-#-# +master-bin.000001 # Query # # use `test`; CREATE TABLE tt_1 (ddl_case INT, PRIMARY KEY(ddl_case)) ENGINE = Innodb +master-bin.000001 # Gtid # # GTID #-#-# +master-bin.000001 # Query # # use `test`; CREATE TABLE tt_2 (ddl_case INT, PRIMARY KEY(ddl_case)) ENGINE = Innodb +master-bin.000001 # Gtid # # GTID #-#-# +master-bin.000001 # Query # # use `test`; CREATE TABLE nt_1 (ddl_case INT, PRIMARY KEY(ddl_case)) ENGINE = MyIsam +master-bin.000001 # Gtid # # BEGIN GTID #-#-# +master-bin.000001 # Table_map # # table_id: # (test.tt_1) +master-bin.000001 # Write_rows_v1 # # table_id: # flags: STMT_END_F +master-bin.000001 # Xid # # COMMIT /* XID */ +master-bin.000001 # Gtid # # BEGIN GTID #-#-# +master-bin.000001 # Table_map # # table_id: # (test.tt_2) +master-bin.000001 # Write_rows_v1 # # table_id: # flags: STMT_END_F +master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Table_map # # table_id: # (test.tt_1) master-bin.000001 # Write_rows_v1 # # table_id: # flags: STMT_END_F master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; CREATE FUNCTION myfunc_int RETURNS INTEGER SONAME "LIB" --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (42); -DROP FUNCTION myfunc_int; --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Table_map # # table_id: # (test.tt_1) master-bin.000001 # Write_rows_v1 # # table_id: # flags: STMT_END_F master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; DROP FUNCTION myfunc_int --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (41); -LOAD INDEX INTO CACHE nt_1 IGNORE LEAVES; -Table Op Msg_type Msg_text -test.nt_1 preload_keys status OK --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Table_map # # table_id: # (test.tt_1) master-bin.000001 # Write_rows_v1 # # table_id: # flags: STMT_END_F -master-bin.000001 # Xid # # COMMIT /* XID */ --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (40); -LOAD INDEX INTO CACHE tt_1, tt_2 IGNORE LEAVES; -Table Op Msg_type Msg_text -test.tt_1 preload_keys note The storage engine for the table doesn't support preload_keys -test.tt_2 preload_keys note The storage engine for the table doesn't support preload_keys --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info -master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Table_map # # table_id: # (test.tt_1) master-bin.000001 # Write_rows_v1 # # table_id: # flags: STMT_END_F -master-bin.000001 # Xid # # COMMIT /* XID */ --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (39); -ANALYZE TABLE nt_1; -Table Op Msg_type Msg_text -test.nt_1 analyze status Table is already up to date --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info -master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Table_map # # table_id: # (test.tt_1) master-bin.000001 # Write_rows_v1 # # table_id: # flags: STMT_END_F master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; ANALYZE TABLE nt_1 --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (38); -CHECK TABLE nt_1; -Table Op Msg_type Msg_text -test.nt_1 check status OK --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Table_map # # table_id: # (test.tt_1) master-bin.000001 # Write_rows_v1 # # table_id: # flags: STMT_END_F master-bin.000001 # Xid # # COMMIT /* XID */ --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (37); -OPTIMIZE TABLE nt_1; -Table Op Msg_type Msg_text -test.nt_1 optimize status Table is already up to date --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Table_map # # table_id: # (test.tt_1) master-bin.000001 # Write_rows_v1 # # table_id: # flags: STMT_END_F master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; OPTIMIZE TABLE nt_1 --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (36); -REPAIR TABLE nt_1; -Table Op Msg_type Msg_text -test.nt_1 repair status OK --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Table_map # # table_id: # (test.tt_1) master-bin.000001 # Write_rows_v1 # # table_id: # flags: STMT_END_F master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; REPAIR TABLE nt_1 --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (35); -LOCK TABLES tt_1 WRITE; --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Table_map # # table_id: # (test.tt_1) master-bin.000001 # Write_rows_v1 # # table_id: # flags: STMT_END_F master-bin.000001 # Xid # # COMMIT /* XID */ --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (34); -UNLOCK TABLES; --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Table_map # # table_id: # (test.tt_1) master-bin.000001 # Write_rows_v1 # # table_id: # flags: STMT_END_F master-bin.000001 # Xid # # COMMIT /* XID */ --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (33); -CREATE USER 'user'@'localhost'; --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Table_map # # table_id: # (test.tt_1) master-bin.000001 # Write_rows_v1 # # table_id: # flags: STMT_END_F master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; CREATE USER 'user'@'localhost' --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (32); -GRANT ALL ON *.* TO 'user'@'localhost'; --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Table_map # # table_id: # (test.tt_1) master-bin.000001 # Write_rows_v1 # # table_id: # flags: STMT_END_F master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; GRANT ALL ON *.* TO 'user'@'localhost' --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (31); -SET PASSWORD FOR 'user'@'localhost' = PASSWORD('newpass'); --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Table_map # # table_id: # (test.tt_1) master-bin.000001 # Write_rows_v1 # # table_id: # flags: STMT_END_F master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; SET PASSWORD FOR 'user'@'localhost'='*D8DECEC305209EEFEC43008E1D420E1AA06B19E0' --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (30); -REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'user'@'localhost'; --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Table_map # # table_id: # (test.tt_1) master-bin.000001 # Write_rows_v1 # # table_id: # flags: STMT_END_F master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'user'@'localhost' --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (29); -RENAME USER 'user'@'localhost' TO 'user_new'@'localhost'; --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Table_map # # table_id: # (test.tt_1) master-bin.000001 # Write_rows_v1 # # table_id: # flags: STMT_END_F master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; RENAME USER 'user'@'localhost' TO 'user_new'@'localhost' --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (28); -DROP USER 'user_new'@'localhost'; --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Table_map # # table_id: # (test.tt_1) master-bin.000001 # Write_rows_v1 # # table_id: # flags: STMT_END_F master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; DROP USER 'user_new'@'localhost' --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (27); -CREATE EVENT evt ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 HOUR DO SELECT * FROM tt_1; --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Table_map # # table_id: # (test.tt_1) master-bin.000001 # Write_rows_v1 # # table_id: # flags: STMT_END_F master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; CREATE DEFINER=`root`@`localhost` EVENT evt ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 HOUR DO SELECT * FROM tt_1 --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (26); -ALTER EVENT evt COMMENT 'evt'; --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Table_map # # table_id: # (test.tt_1) master-bin.000001 # Write_rows_v1 # # table_id: # flags: STMT_END_F master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; ALTER EVENT evt COMMENT 'evt' --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (25); -DROP EVENT evt; --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Table_map # # table_id: # (test.tt_1) master-bin.000001 # Write_rows_v1 # # table_id: # flags: STMT_END_F master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; DROP EVENT evt --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (24); -CREATE TRIGGER tr AFTER INSERT ON tt_1 FOR EACH ROW UPDATE tt_2 SET ddl_case = ddl_case WHERE ddl_case= NEW.ddl_case; --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Table_map # # table_id: # (test.tt_1) master-bin.000001 # Write_rows_v1 # # table_id: # flags: STMT_END_F master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; CREATE DEFINER=`root`@`localhost` TRIGGER tr AFTER INSERT ON tt_1 FOR EACH ROW UPDATE tt_2 SET ddl_case = ddl_case WHERE ddl_case= NEW.ddl_case --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (23); -DROP TRIGGER tr; --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Table_map # # table_id: # (test.tt_1) master-bin.000001 # Table_map # # table_id: # (test.tt_2) @@ -330,15 +243,6 @@ master-bin.000001 # Write_rows_v1 # # table_id: # flags: STMT_END_F master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; DROP TRIGGER tr --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (22); -CREATE FUNCTION fc () RETURNS VARCHAR(64) RETURN "fc"; --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Table_map # # table_id: # (test.tt_1) master-bin.000001 # Write_rows_v1 # # table_id: # flags: STMT_END_F @@ -346,45 +250,18 @@ master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; CREATE DEFINER=`root`@`localhost` FUNCTION `fc`() RETURNS varchar(64) CHARSET latin1 RETURN "fc" --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (21); -ALTER FUNCTION fc COMMENT 'fc'; --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Table_map # # table_id: # (test.tt_1) master-bin.000001 # Write_rows_v1 # # table_id: # flags: STMT_END_F master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; ALTER FUNCTION fc COMMENT 'fc' --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (20); -DROP FUNCTION fc; --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Table_map # # table_id: # (test.tt_1) master-bin.000001 # Write_rows_v1 # # table_id: # flags: STMT_END_F master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; DROP FUNCTION fc --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (19); -CREATE PROCEDURE pc () UPDATE tt_2 SET ddl_case = ddl_case WHERE ddl_case= NEW.ddl_case; --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Table_map # # table_id: # (test.tt_1) master-bin.000001 # Write_rows_v1 # # table_id: # flags: STMT_END_F @@ -392,272 +269,103 @@ master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; CREATE DEFINER=`root`@`localhost` PROCEDURE `pc`() UPDATE tt_2 SET ddl_case = ddl_case WHERE ddl_case= NEW.ddl_case --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (18); -ALTER PROCEDURE pc COMMENT 'pc'; --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Table_map # # table_id: # (test.tt_1) master-bin.000001 # Write_rows_v1 # # table_id: # flags: STMT_END_F master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; ALTER PROCEDURE pc COMMENT 'pc' --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (17); -DROP PROCEDURE pc; --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Table_map # # table_id: # (test.tt_1) master-bin.000001 # Write_rows_v1 # # table_id: # flags: STMT_END_F master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; DROP PROCEDURE pc --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (16); -CREATE VIEW v AS SELECT * FROM tt_1; --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Table_map # # table_id: # (test.tt_1) master-bin.000001 # Write_rows_v1 # # table_id: # flags: STMT_END_F master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v` AS SELECT * FROM tt_1 --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (15); -ALTER VIEW v AS SELECT * FROM tt_1; --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Table_map # # table_id: # (test.tt_1) master-bin.000001 # Write_rows_v1 # # table_id: # flags: STMT_END_F master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; ALTER ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v` AS SELECT * FROM tt_1 --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (14); -DROP VIEW v; --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Table_map # # table_id: # (test.tt_1) master-bin.000001 # Write_rows_v1 # # table_id: # flags: STMT_END_F master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; DROP VIEW v --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (13); -CREATE INDEX ix ON tt_1(ddl_case); --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Table_map # # table_id: # (test.tt_1) master-bin.000001 # Write_rows_v1 # # table_id: # flags: STMT_END_F master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; CREATE INDEX ix ON tt_1(ddl_case) --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (12); -DROP INDEX ix ON tt_1; --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Table_map # # table_id: # (test.tt_1) master-bin.000001 # Write_rows_v1 # # table_id: # flags: STMT_END_F master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; DROP INDEX ix ON tt_1 --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (11); -CREATE TEMPORARY TABLE tt_xx (a int); --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Table_map # # table_id: # (test.tt_1) master-bin.000001 # Write_rows_v1 # # table_id: # flags: STMT_END_F -master-bin.000001 # Xid # # COMMIT /* XID */ --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (10); -ALTER TABLE tt_xx ADD COLUMN (b int); --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info -master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Table_map # # table_id: # (test.tt_1) master-bin.000001 # Write_rows_v1 # # table_id: # flags: STMT_END_F master-bin.000001 # Xid # # COMMIT /* XID */ --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (9); -ALTER TABLE tt_xx RENAME new_tt_xx; --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Table_map # # table_id: # (test.tt_1) master-bin.000001 # Write_rows_v1 # # table_id: # flags: STMT_END_F master-bin.000001 # Xid # # COMMIT /* XID */ --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (8); -DROP TEMPORARY TABLE IF EXISTS new_tt_xx; --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Table_map # # table_id: # (test.tt_1) master-bin.000001 # Write_rows_v1 # # table_id: # flags: STMT_END_F -master-bin.000001 # Xid # # COMMIT /* XID */ --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (7); -CREATE TABLE tt_xx (a int); --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info -master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Table_map # # table_id: # (test.tt_1) master-bin.000001 # Write_rows_v1 # # table_id: # flags: STMT_END_F master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; CREATE TABLE tt_xx (a int) --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (6); -ALTER TABLE tt_xx ADD COLUMN (b int); --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Table_map # # table_id: # (test.tt_1) master-bin.000001 # Write_rows_v1 # # table_id: # flags: STMT_END_F master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; ALTER TABLE tt_xx ADD COLUMN (b int) --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (5); -RENAME TABLE tt_xx TO new_tt_xx; --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Table_map # # table_id: # (test.tt_1) master-bin.000001 # Write_rows_v1 # # table_id: # flags: STMT_END_F master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; RENAME TABLE tt_xx TO new_tt_xx --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (4); -TRUNCATE TABLE new_tt_xx; --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Table_map # # table_id: # (test.tt_1) master-bin.000001 # Write_rows_v1 # # table_id: # flags: STMT_END_F master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; TRUNCATE TABLE new_tt_xx --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (3); -DROP TABLE IF EXISTS tt_xx, new_tt_xx; -Warnings: -Note 1051 Unknown table 'test.tt_xx' --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Table_map # # table_id: # (test.tt_1) master-bin.000001 # Write_rows_v1 # # table_id: # flags: STMT_END_F master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; DROP TABLE IF EXISTS `tt_xx`,`new_tt_xx` /* generated by server */ --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (2); -CREATE DATABASE db; --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Table_map # # table_id: # (test.tt_1) master-bin.000001 # Write_rows_v1 # # table_id: # flags: STMT_END_F master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # CREATE DATABASE db --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (1); -DROP DATABASE IF EXISTS db; --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Table_map # # table_id: # (test.tt_1) master-bin.000001 # Write_rows_v1 # # table_id: # flags: STMT_END_F master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # DROP DATABASE IF EXISTS db --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - +SET AUTOCOMMIT= 1; ################################################################################### # CHECK CONSISTENCY ################################################################################### @@ -665,4 +373,7 @@ include/diff_tables.inc [master:tt_1,slave:tt_1] ################################################################################### # CLEAN ################################################################################### +DROP TABLE tt_1; +DROP TABLE tt_2; +DROP TABLE nt_1; include/rpl_end.inc diff --git a/mysql-test/suite/rpl/r/rpl_semi_sync_skip_repl.result b/mysql-test/suite/rpl/r/rpl_semi_sync_skip_repl.result new file mode 100644 index 000000000..4762ac8dd --- /dev/null +++ b/mysql-test/suite/rpl/r/rpl_semi_sync_skip_repl.result @@ -0,0 +1,23 @@ +include/master-slave.inc +[connection master] +call mtr.add_suppression("Timeout waiting for reply of binlog"); +SET @@GLOBAL.rpl_semi_sync_master_enabled = 1; +SET @@GLOBAL.rpl_semi_sync_master_timeout=100; +include/stop_slave.inc +SET @@GLOBAL.replicate_events_marked_for_skip=FILTER_ON_MASTER; +SET @@GLOBAL. rpl_semi_sync_slave_enabled = 1; +include/start_slave.inc +CREATE TABLE t1 (a INT) ENGINE=innodb; +SET @@GLOBAL.debug_dbug= "d,dbug_master_binlog_over_2GB"; +SET @@SESSION.skip_replication=1; +INSERT INTO t1 SET a=1; +SET @@SESSION.skip_replication=0; +INSERT INTO t1 SET a=0; +SET @@GLOBAL.debug_dbug=""; +SET @@GLOBAL. rpl_semi_sync_master_timeout = 10000; +SET @@GLOBAL. rpl_semi_sync_master_enabled = 0; +DROP TABLE t1; +include/stop_slave.inc +SET @@GLOBAL. rpl_semi_sync_slave_enabled = 0; +SET @@GLOBAL.replicate_events_marked_for_skip = REPLICATE; +include/rpl_end.inc diff --git a/mysql-test/suite/rpl/r/rpl_stm_implicit_commit_binlog.result b/mysql-test/suite/rpl/r/rpl_stm_implicit_commit_binlog.result index cb702ad64..7efb1f716 100644 --- a/mysql-test/suite/rpl/r/rpl_stm_implicit_commit_binlog.result +++ b/mysql-test/suite/rpl/r/rpl_stm_implicit_commit_binlog.result @@ -13,613 +13,319 @@ INSERT INTO tt_2(ddl_case) VALUES(0); # CHECK IMPLICT COMMIT ######################################################################### SET AUTOCOMMIT= 0; --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- INSERT INTO tt_1(ddl_case) VALUES (43); CREATE FUNCTION myfunc_int RETURNS INTEGER SONAME "UDF_EXAMPLE_LIB"; --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info -master-bin.000001 # Gtid # # BEGIN GTID #-#-# -master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(ddl_case) VALUES (43) -master-bin.000001 # Xid # # COMMIT /* XID */ -master-bin.000001 # Gtid # # GTID #-#-# -master-bin.000001 # Query # # use `test`; CREATE FUNCTION myfunc_int RETURNS INTEGER SONAME "LIB" --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- INSERT INTO tt_1(ddl_case) VALUES (42); DROP FUNCTION myfunc_int; --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info -master-bin.000001 # Gtid # # BEGIN GTID #-#-# -master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(ddl_case) VALUES (42) -master-bin.000001 # Xid # # COMMIT /* XID */ -master-bin.000001 # Gtid # # GTID #-#-# -master-bin.000001 # Query # # use `test`; DROP FUNCTION myfunc_int --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- INSERT INTO tt_1(ddl_case) VALUES (41); LOAD INDEX INTO CACHE nt_1 IGNORE LEAVES; Table Op Msg_type Msg_text test.nt_1 preload_keys status OK --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info -master-bin.000001 # Gtid # # BEGIN GTID #-#-# -master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(ddl_case) VALUES (41) -master-bin.000001 # Xid # # COMMIT /* XID */ --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- INSERT INTO tt_1(ddl_case) VALUES (40); LOAD INDEX INTO CACHE tt_1, tt_2 IGNORE LEAVES; Table Op Msg_type Msg_text test.tt_1 preload_keys note The storage engine for the table doesn't support preload_keys test.tt_2 preload_keys note The storage engine for the table doesn't support preload_keys --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info -master-bin.000001 # Gtid # # BEGIN GTID #-#-# -master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(ddl_case) VALUES (40) -master-bin.000001 # Xid # # COMMIT /* XID */ --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- INSERT INTO tt_1(ddl_case) VALUES (39); ANALYZE TABLE nt_1; Table Op Msg_type Msg_text test.nt_1 analyze status Table is already up to date --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info -master-bin.000001 # Gtid # # BEGIN GTID #-#-# -master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(ddl_case) VALUES (39) -master-bin.000001 # Xid # # COMMIT /* XID */ -master-bin.000001 # Gtid # # GTID #-#-# -master-bin.000001 # Query # # use `test`; ANALYZE TABLE nt_1 --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- INSERT INTO tt_1(ddl_case) VALUES (38); CHECK TABLE nt_1; Table Op Msg_type Msg_text test.nt_1 check status OK --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info -master-bin.000001 # Gtid # # BEGIN GTID #-#-# -master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(ddl_case) VALUES (38) -master-bin.000001 # Xid # # COMMIT /* XID */ --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- INSERT INTO tt_1(ddl_case) VALUES (37); OPTIMIZE TABLE nt_1; Table Op Msg_type Msg_text test.nt_1 optimize status Table is already up to date --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- +INSERT INTO tt_1(ddl_case) VALUES (36); +REPAIR TABLE nt_1; +Table Op Msg_type Msg_text +test.nt_1 repair status OK +INSERT INTO tt_1(ddl_case) VALUES (35); +LOCK TABLES tt_1 WRITE; +INSERT INTO tt_1(ddl_case) VALUES (34); +UNLOCK TABLES; +INSERT INTO tt_1(ddl_case) VALUES (33); +CREATE USER 'user'@'localhost'; +INSERT INTO tt_1(ddl_case) VALUES (32); +GRANT ALL ON *.* TO 'user'@'localhost'; +INSERT INTO tt_1(ddl_case) VALUES (31); +SET PASSWORD FOR 'user'@'localhost' = PASSWORD('newpass'); +INSERT INTO tt_1(ddl_case) VALUES (30); +REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'user'@'localhost'; +INSERT INTO tt_1(ddl_case) VALUES (29); +RENAME USER 'user'@'localhost' TO 'user_new'@'localhost'; +INSERT INTO tt_1(ddl_case) VALUES (28); +DROP USER 'user_new'@'localhost'; +INSERT INTO tt_1(ddl_case) VALUES (27); +CREATE EVENT evt ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 HOUR DO SELECT * FROM tt_1; +INSERT INTO tt_1(ddl_case) VALUES (26); +ALTER EVENT evt COMMENT 'evt'; +INSERT INTO tt_1(ddl_case) VALUES (25); +DROP EVENT evt; +INSERT INTO tt_1(ddl_case) VALUES (24); +CREATE TRIGGER tr AFTER INSERT ON tt_1 FOR EACH ROW UPDATE tt_2 SET ddl_case = ddl_case WHERE ddl_case= NEW.ddl_case; +INSERT INTO tt_1(ddl_case) VALUES (23); +DROP TRIGGER tr; +INSERT INTO tt_1(ddl_case) VALUES (22); +CREATE FUNCTION fc () RETURNS VARCHAR(64) RETURN "fc"; +INSERT INTO tt_1(ddl_case) VALUES (21); +ALTER FUNCTION fc COMMENT 'fc'; +INSERT INTO tt_1(ddl_case) VALUES (20); +DROP FUNCTION fc; +INSERT INTO tt_1(ddl_case) VALUES (19); +CREATE PROCEDURE pc () UPDATE tt_2 SET ddl_case = ddl_case WHERE ddl_case= NEW.ddl_case; +INSERT INTO tt_1(ddl_case) VALUES (18); +ALTER PROCEDURE pc COMMENT 'pc'; +INSERT INTO tt_1(ddl_case) VALUES (17); +DROP PROCEDURE pc; +INSERT INTO tt_1(ddl_case) VALUES (16); +CREATE VIEW v AS SELECT * FROM tt_1; +INSERT INTO tt_1(ddl_case) VALUES (15); +ALTER VIEW v AS SELECT * FROM tt_1; +INSERT INTO tt_1(ddl_case) VALUES (14); +DROP VIEW v; +INSERT INTO tt_1(ddl_case) VALUES (13); +CREATE INDEX ix ON tt_1(ddl_case); +INSERT INTO tt_1(ddl_case) VALUES (12); +DROP INDEX ix ON tt_1; +INSERT INTO tt_1(ddl_case) VALUES (11); +CREATE TEMPORARY TABLE tt_xx (a int); +INSERT INTO tt_1(ddl_case) VALUES (10); +ALTER TABLE tt_xx ADD COLUMN (b int); +INSERT INTO tt_1(ddl_case) VALUES (9); +ALTER TABLE tt_xx RENAME new_tt_xx; +INSERT INTO tt_1(ddl_case) VALUES (8); +DROP TEMPORARY TABLE IF EXISTS new_tt_xx; +INSERT INTO tt_1(ddl_case) VALUES (7); +CREATE TABLE tt_xx (a int); +INSERT INTO tt_1(ddl_case) VALUES (6); +ALTER TABLE tt_xx ADD COLUMN (b int); +INSERT INTO tt_1(ddl_case) VALUES (5); +RENAME TABLE tt_xx TO new_tt_xx; +INSERT INTO tt_1(ddl_case) VALUES (4); +TRUNCATE TABLE new_tt_xx; +INSERT INTO tt_1(ddl_case) VALUES (3); +DROP TABLE IF EXISTS tt_xx, new_tt_xx; +Warnings: +Note 1051 Unknown table 'test.tt_xx' +INSERT INTO tt_1(ddl_case) VALUES (2); +CREATE DATABASE db; +INSERT INTO tt_1(ddl_case) VALUES (1); +DROP DATABASE IF EXISTS db; include/show_binlog_events.inc Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Gtid # # GTID #-#-# +master-bin.000001 # Query # # use `test`; CREATE TABLE tt_1 (ddl_case INT, PRIMARY KEY(ddl_case)) ENGINE = Innodb +master-bin.000001 # Gtid # # GTID #-#-# +master-bin.000001 # Query # # use `test`; CREATE TABLE tt_2 (ddl_case INT, PRIMARY KEY(ddl_case)) ENGINE = Innodb +master-bin.000001 # Gtid # # GTID #-#-# +master-bin.000001 # Query # # use `test`; CREATE TABLE nt_1 (ddl_case INT, PRIMARY KEY(ddl_case)) ENGINE = MyIsam +master-bin.000001 # Gtid # # BEGIN GTID #-#-# +master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(ddl_case) VALUES(0) +master-bin.000001 # Xid # # COMMIT /* XID */ +master-bin.000001 # Gtid # # BEGIN GTID #-#-# +master-bin.000001 # Query # # use `test`; INSERT INTO tt_2(ddl_case) VALUES(0) +master-bin.000001 # Xid # # COMMIT /* XID */ +master-bin.000001 # Gtid # # BEGIN GTID #-#-# +master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(ddl_case) VALUES (43) +master-bin.000001 # Xid # # COMMIT /* XID */ +master-bin.000001 # Gtid # # GTID #-#-# +master-bin.000001 # Query # # use `test`; CREATE FUNCTION myfunc_int RETURNS INTEGER SONAME "LIB" +master-bin.000001 # Gtid # # BEGIN GTID #-#-# +master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(ddl_case) VALUES (42) +master-bin.000001 # Xid # # COMMIT /* XID */ +master-bin.000001 # Gtid # # GTID #-#-# +master-bin.000001 # Query # # use `test`; DROP FUNCTION myfunc_int +master-bin.000001 # Gtid # # BEGIN GTID #-#-# +master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(ddl_case) VALUES (41) +master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(ddl_case) VALUES (40) +master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(ddl_case) VALUES (39) +master-bin.000001 # Xid # # COMMIT /* XID */ +master-bin.000001 # Gtid # # GTID #-#-# +master-bin.000001 # Query # # use `test`; ANALYZE TABLE nt_1 +master-bin.000001 # Gtid # # BEGIN GTID #-#-# +master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(ddl_case) VALUES (38) +master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(ddl_case) VALUES (37) master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; OPTIMIZE TABLE nt_1 --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (36); -REPAIR TABLE nt_1; -Table Op Msg_type Msg_text -test.nt_1 repair status OK --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(ddl_case) VALUES (36) master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; REPAIR TABLE nt_1 --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (35); -LOCK TABLES tt_1 WRITE; --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(ddl_case) VALUES (35) master-bin.000001 # Xid # # COMMIT /* XID */ --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (34); -UNLOCK TABLES; --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(ddl_case) VALUES (34) master-bin.000001 # Xid # # COMMIT /* XID */ --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (33); -CREATE USER 'user'@'localhost'; --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(ddl_case) VALUES (33) master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; CREATE USER 'user'@'localhost' --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (32); -GRANT ALL ON *.* TO 'user'@'localhost'; --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(ddl_case) VALUES (32) master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; GRANT ALL ON *.* TO 'user'@'localhost' --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (31); -SET PASSWORD FOR 'user'@'localhost' = PASSWORD('newpass'); --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(ddl_case) VALUES (31) master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; SET PASSWORD FOR 'user'@'localhost'='*D8DECEC305209EEFEC43008E1D420E1AA06B19E0' --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (30); -REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'user'@'localhost'; --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(ddl_case) VALUES (30) master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'user'@'localhost' --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (29); -RENAME USER 'user'@'localhost' TO 'user_new'@'localhost'; --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(ddl_case) VALUES (29) master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; RENAME USER 'user'@'localhost' TO 'user_new'@'localhost' --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (28); -DROP USER 'user_new'@'localhost'; --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(ddl_case) VALUES (28) master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; DROP USER 'user_new'@'localhost' --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (27); -CREATE EVENT evt ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 HOUR DO SELECT * FROM tt_1; --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(ddl_case) VALUES (27) master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; CREATE DEFINER=`root`@`localhost` EVENT evt ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 HOUR DO SELECT * FROM tt_1 --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (26); -ALTER EVENT evt COMMENT 'evt'; --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(ddl_case) VALUES (26) master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; ALTER EVENT evt COMMENT 'evt' --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (25); -DROP EVENT evt; --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(ddl_case) VALUES (25) master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; DROP EVENT evt --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (24); -CREATE TRIGGER tr AFTER INSERT ON tt_1 FOR EACH ROW UPDATE tt_2 SET ddl_case = ddl_case WHERE ddl_case= NEW.ddl_case; --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(ddl_case) VALUES (24) master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; CREATE DEFINER=`root`@`localhost` TRIGGER tr AFTER INSERT ON tt_1 FOR EACH ROW UPDATE tt_2 SET ddl_case = ddl_case WHERE ddl_case= NEW.ddl_case --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (23); -DROP TRIGGER tr; --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(ddl_case) VALUES (23) master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; DROP TRIGGER tr --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (22); -CREATE FUNCTION fc () RETURNS VARCHAR(64) RETURN "fc"; --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(ddl_case) VALUES (22) master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; CREATE DEFINER=`root`@`localhost` FUNCTION `fc`() RETURNS varchar(64) CHARSET latin1 RETURN "fc" --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (21); -ALTER FUNCTION fc COMMENT 'fc'; --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(ddl_case) VALUES (21) master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; ALTER FUNCTION fc COMMENT 'fc' --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (20); -DROP FUNCTION fc; --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(ddl_case) VALUES (20) master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; DROP FUNCTION fc --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (19); -CREATE PROCEDURE pc () UPDATE tt_2 SET ddl_case = ddl_case WHERE ddl_case= NEW.ddl_case; --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(ddl_case) VALUES (19) master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; CREATE DEFINER=`root`@`localhost` PROCEDURE `pc`() UPDATE tt_2 SET ddl_case = ddl_case WHERE ddl_case= NEW.ddl_case --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (18); -ALTER PROCEDURE pc COMMENT 'pc'; --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(ddl_case) VALUES (18) master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; ALTER PROCEDURE pc COMMENT 'pc' --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (17); -DROP PROCEDURE pc; --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(ddl_case) VALUES (17) master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; DROP PROCEDURE pc --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (16); -CREATE VIEW v AS SELECT * FROM tt_1; --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(ddl_case) VALUES (16) master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v` AS SELECT * FROM tt_1 --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (15); -ALTER VIEW v AS SELECT * FROM tt_1; --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(ddl_case) VALUES (15) master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; ALTER ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v` AS SELECT * FROM tt_1 --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (14); -DROP VIEW v; --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(ddl_case) VALUES (14) master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; DROP VIEW v --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (13); -CREATE INDEX ix ON tt_1(ddl_case); --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(ddl_case) VALUES (13) master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; CREATE INDEX ix ON tt_1(ddl_case) --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (12); -DROP INDEX ix ON tt_1; --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(ddl_case) VALUES (12) master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; DROP INDEX ix ON tt_1 --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (11); -CREATE TEMPORARY TABLE tt_xx (a int); --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(ddl_case) VALUES (11) master-bin.000001 # Query # # use `test`; CREATE TEMPORARY TABLE tt_xx (a int) -master-bin.000001 # Xid # # COMMIT /* XID */ --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (10); -ALTER TABLE tt_xx ADD COLUMN (b int); --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info -master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(ddl_case) VALUES (10) master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; ALTER TABLE tt_xx ADD COLUMN (b int) --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (9); -ALTER TABLE tt_xx RENAME new_tt_xx; --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(ddl_case) VALUES (9) master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; ALTER TABLE tt_xx RENAME new_tt_xx --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (8); -DROP TEMPORARY TABLE IF EXISTS new_tt_xx; --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(ddl_case) VALUES (8) master-bin.000001 # Query # # DROP TEMPORARY TABLE IF EXISTS `test`.`new_tt_xx` /* generated by server */ -master-bin.000001 # Xid # # COMMIT /* XID */ --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (7); -CREATE TABLE tt_xx (a int); --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info -master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(ddl_case) VALUES (7) master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; CREATE TABLE tt_xx (a int) --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (6); -ALTER TABLE tt_xx ADD COLUMN (b int); --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(ddl_case) VALUES (6) master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; ALTER TABLE tt_xx ADD COLUMN (b int) --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (5); -RENAME TABLE tt_xx TO new_tt_xx; --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(ddl_case) VALUES (5) master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; RENAME TABLE tt_xx TO new_tt_xx --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (4); -TRUNCATE TABLE new_tt_xx; --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(ddl_case) VALUES (4) master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; TRUNCATE TABLE new_tt_xx --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (3); -DROP TABLE IF EXISTS tt_xx, new_tt_xx; -Warnings: -Note 1051 Unknown table 'test.tt_xx' --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(ddl_case) VALUES (3) master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; DROP TABLE IF EXISTS `tt_xx`,`new_tt_xx` /* generated by server */ --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (2); -CREATE DATABASE db; --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(ddl_case) VALUES (2) master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # CREATE DATABASE db --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -INSERT INTO tt_1(ddl_case) VALUES (1); -DROP DATABASE IF EXISTS db; --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- --b-b-b-b-b-b-b-b-b-b-b- >> << -b-b-b-b-b-b-b-b-b-b-b- -include/show_binlog_events.inc -Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # BEGIN GTID #-#-# master-bin.000001 # Query # # use `test`; INSERT INTO tt_1(ddl_case) VALUES (1) master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # DROP DATABASE IF EXISTS db --e-e-e-e-e-e-e-e-e-e-e- >> << -e-e-e-e-e-e-e-e-e-e-e- - +SET AUTOCOMMIT= 1; ################################################################################### # CHECK CONSISTENCY ################################################################################### @@ -627,4 +333,7 @@ include/diff_tables.inc [master:tt_1,slave:tt_1] ################################################################################### # CLEAN ################################################################################### +DROP TABLE tt_1; +DROP TABLE tt_2; +DROP TABLE nt_1; include/rpl_end.inc diff --git a/mysql-test/suite/rpl/t/rename.test b/mysql-test/suite/rpl/t/rename.test new file mode 100644 index 000000000..ac4991579 --- /dev/null +++ b/mysql-test/suite/rpl/t/rename.test @@ -0,0 +1,33 @@ +--source include/have_binlog_format_mixed.inc +--source include/master-slave.inc + +--echo # +--echo # MDEV-16229 Replication aborts with ER_VIEW_SELECT_TMPTABLE after +--echo # half-failed RENAME +--echo # + +CREATE TABLE t1 (a INT); +CREATE TEMPORARY TABLE t1 (b INT); +RENAME TABLE t1 TO tmp, tmp TO t1; +SHOW CREATE TABLE t1; +--error ER_VIEW_SELECT_TMPTABLE +CREATE VIEW v AS SELECT * FROM t1; + +RENAME TABLE t1 TO tmp, t1 TO t2; +SHOW CREATE TABLE tmp; +SHOW CREATE TABLE t2; +--error ER_VIEW_SELECT_TMPTABLE +CREATE VIEW v AS SELECT * FROM tmp; +CREATE VIEW v AS SELECT * FROM t2; + +--sync_slave_with_master + +# Cleanup + +--connection master + +DROP VIEW v; +DROP TABLE tmp; +DROP TABLE t2; + +--source include/rpl_end.inc diff --git a/mysql-test/suite/rpl/t/rpl_parallel_optimistic.test b/mysql-test/suite/rpl/t/rpl_parallel_optimistic.test index 41fb6ebb7..28bf4a77f 100644 --- a/mysql-test/suite/rpl/t/rpl_parallel_optimistic.test +++ b/mysql-test/suite/rpl/t/rpl_parallel_optimistic.test @@ -4,6 +4,11 @@ --let $rpl_topology=1->2 --source include/rpl_init.inc +--connection server_2 +call mtr.add_suppression("Warning.*Deadlock found when trying to get lock; try restarting transaction"); +# The following instruction is a part of the proof of MDEV-13577 fixes, below. +call mtr.add_suppression("Warning.*mysqld: Can't find record in 't2'"); + --connection server_1 ALTER TABLE mysql.gtid_slave_pos ENGINE=InnoDB; CREATE TABLE t1 (a int PRIMARY KEY, b INT) ENGINE=InnoDB; @@ -480,8 +485,65 @@ SELECT * FROM t2 WHERE a >= 40 ORDER BY a; SELECT * FROM t1 WHERE a >= 40 ORDER BY a; SELECT * FROM t2 WHERE a >= 40 ORDER BY a; -# Clean up. +# partial cleanup to reuse the tables by following tests +--connection server_1 +DELETE FROM t1; +DELETE FROM t2; +--source include/save_master_gtid.inc + +--connection server_2 +--source include/sync_with_master_gtid.inc +# +# MDEV-13577 optimistic parallel slave errors out to error log unnecessary +# + +# The 1st of the following two trx:s a blocker on slave +--connection server_2 +BEGIN; +INSERT INTO t1 SET a=1; + +--connection server_1 +SET @save.binlog_format=@@session.binlog_format; +SET @@SESSION.binlog_format=row; + +BEGIN; + INSERT INTO t1 SET a=1; + INSERT INTO t2 SET a=1; +COMMIT; + +# This transaction is going to win optimistical race with above INSERT +# on slave while being depend on it. That means it will face a kind of temporary error +# and then will retry to succeed. +BEGIN; + DELETE FROM t2; +COMMIT; + +# First make sure DELETE raced indeed to get stuck at retrying stage +# where it runs "realistically" now. There is nomore optimistic error +# in the errorlog, which is downgraded to the warning level (when +# --log-warnings > 1), see above suppression. +--connection server_2 +--let $wait_condition= SELECT COUNT(*) = 1 FROM information_schema.processlist WHERE state = "Waiting for prior transaction to commit" +--source include/wait_condition.inc + +# Next release the 1st trx to commit. +--connection server_2 +ROLLBACK; + +# MDEV-13577 local cleanup: +--connection server_1 +SET @@SESSION.binlog_format= @save.binlog_format; +DELETE FROM t1; +DELETE FROM t2; +--source include/save_master_gtid.inc + +--connection server_2 +--source include/sync_with_master_gtid.inc + +# +# Clean up. +# --connection server_2 --source include/stop_slave.inc SET GLOBAL slave_parallel_mode=@old_parallel_mode; diff --git a/mysql-test/suite/rpl/t/rpl_semi_sync_skip_repl.test b/mysql-test/suite/rpl/t/rpl_semi_sync_skip_repl.test new file mode 100644 index 000000000..2f6da1806 --- /dev/null +++ b/mysql-test/suite/rpl/t/rpl_semi_sync_skip_repl.test @@ -0,0 +1,62 @@ +# MDEV-14721 Big transaction events get lost on semisync master when +# replicate_events_marked_for_skip=FILTER_ON_MASTER +# +# When events of a big transaction are binlogged offsetting over 2GB from +# the beginning of the log the semisync master's dump thread +# lost such events. +# The test verifies the fixes' correctness simulating the 2GB offset. + +source include/have_semisync.inc; +source include/not_embedded.inc; +source include/have_innodb.inc; +source include/have_debug.inc; +source include/master-slave.inc; + +--connection master +# Suppress warnings that might be generated during the test +call mtr.add_suppression("Timeout waiting for reply of binlog"); + +--let $sav_enabled_master=`SELECT @@GLOBAL.rpl_semi_sync_master_enabled ` +--let $sav_timeout_master=`SELECT @@GLOBAL.rpl_semi_sync_master_timeout ` +SET @@GLOBAL.rpl_semi_sync_master_enabled = 1; +SET @@GLOBAL.rpl_semi_sync_master_timeout=100; + +--connection slave +source include/stop_slave.inc; +--let $sav_skip_marked_slave=`SELECT @@GLOBAL.replicate_events_marked_for_skip ` +SET @@GLOBAL.replicate_events_marked_for_skip=FILTER_ON_MASTER; +--let $sav_enabled_slave=`SELECT @@GLOBAL.rpl_semi_sync_slave_enabled ` +SET @@GLOBAL. rpl_semi_sync_slave_enabled = 1; + +source include/start_slave.inc; + +--connection master +CREATE TABLE t1 (a INT) ENGINE=innodb; + +# Make the following events as if they offset over 2GB from the beginning of binlog +SET @@GLOBAL.debug_dbug= "d,dbug_master_binlog_over_2GB"; +SET @@SESSION.skip_replication=1; +INSERT INTO t1 SET a=1; +SET @@SESSION.skip_replication=0; +INSERT INTO t1 SET a=0; + +--sync_slave_with_master + +# +# Clean up +# +--connection master +SET @@GLOBAL.debug_dbug=""; +--eval SET @@GLOBAL. rpl_semi_sync_master_timeout = $sav_timeout_master +--eval SET @@GLOBAL. rpl_semi_sync_master_enabled = $sav_enabled_master + +--connection master +DROP TABLE t1; + +--sync_slave_with_master +source include/stop_slave.inc; +--eval SET @@GLOBAL. rpl_semi_sync_slave_enabled = $sav_enabled_slave +--eval SET @@GLOBAL.replicate_events_marked_for_skip = $sav_skip_marked_slave + +--let $rpl_only_running_threads= 1 +--source include/rpl_end.inc diff --git a/mysql-test/suite/sys_vars/r/innodb_default_row_format_basic.result b/mysql-test/suite/sys_vars/r/innodb_default_row_format_basic.result new file mode 100644 index 000000000..971b8b9d2 --- /dev/null +++ b/mysql-test/suite/sys_vars/r/innodb_default_row_format_basic.result @@ -0,0 +1,48 @@ +SELECT @@global.innodb_default_row_format; +@@global.innodb_default_row_format +compact +SET GLOBAL innodb_default_row_format = 'redundant'; +SELECT @@global.innodb_default_row_format; +@@global.innodb_default_row_format +redundant +SET GLOBAL innodb_default_row_format = 'dynamic'; +SELECT @@global.innodb_default_row_format; +@@global.innodb_default_row_format +dynamic +SET GLOBAL innodb_default_row_format = 'compact'; +SELECT @@global.innodb_default_row_format; +@@global.innodb_default_row_format +compact +SET GLOBAL innodb_default_row_format = 'compressed'; +ERROR 42000: Variable 'innodb_default_row_format' can't be set to the value of 'compressed' +SELECT @@global.innodb_default_row_format; +@@global.innodb_default_row_format +compact +SET GLOBAL innodb_default_row_format = 'foobar'; +ERROR 42000: Variable 'innodb_default_row_format' can't be set to the value of 'foobar' +SELECT @@global.innodb_default_row_format; +@@global.innodb_default_row_format +compact +SET GLOBAL innodb_default_row_format = 0; +SELECT @@global.innodb_default_row_format; +@@global.innodb_default_row_format +redundant +SET GLOBAL innodb_default_row_format = 1; +SELECT @@global.innodb_default_row_format; +@@global.innodb_default_row_format +compact +SET GLOBAL innodb_default_row_format = 2; +SELECT @@global.innodb_default_row_format; +@@global.innodb_default_row_format +dynamic +SET GLOBAL innodb_default_row_format = 3; +ERROR 42000: Variable 'innodb_default_row_format' can't be set to the value of '3' +SELECT @@global.innodb_default_row_format; +@@global.innodb_default_row_format +dynamic +SET GLOBAL innodb_default_row_format = 123; +ERROR 42000: Variable 'innodb_default_row_format' can't be set to the value of '123' +SELECT @@global.innodb_default_row_format; +@@global.innodb_default_row_format +dynamic +SET GLOBAL innodb_default_row_format = default; 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 708342b01..f9b2c0344 100644 --- a/mysql-test/suite/sys_vars/r/max_connections_basic.result +++ b/mysql-test/suite/sys_vars/r/max_connections_basic.result @@ -27,20 +27,24 @@ SELECT @@global.max_connections; @@global.max_connections 65536 SET @@global.max_connections = 1; +Warnings: +Warning 1292 Truncated incorrect max_connections value: '1' SELECT @@global.max_connections; @@global.max_connections -1 +10 SET @@global.max_connections = 2; +Warnings: +Warning 1292 Truncated incorrect max_connections value: '2' SELECT @@global.max_connections; @@global.max_connections -2 +10 '#--------------------FN_DYNVARS_074_04-------------------------#' SET @@global.max_connections = -1; Warnings: Warning 1292 Truncated incorrect max_connections value: '-1' SELECT @@global.max_connections; @@global.max_connections -1 +10 SET @@global.max_connections = 100000000000; Warnings: Warning 1292 Truncated incorrect max_connections value: '100000000000' @@ -57,13 +61,13 @@ Warnings: Warning 1292 Truncated incorrect max_connections value: '-1024' SELECT @@global.max_connections; @@global.max_connections -1 +10 SET @@global.max_connections = 0; Warnings: Warning 1292 Truncated incorrect max_connections value: '0' SELECT @@global.max_connections; @@global.max_connections -1 +10 SET @@global.max_connections = 100001; Warnings: Warning 1292 Truncated incorrect max_connections value: '100001' @@ -98,15 +102,17 @@ WHERE VARIABLE_NAME='max_connections'; 1 '#---------------------FN_DYNVARS_074_07----------------------#' SET @@global.max_connections = TRUE; +Warnings: +Warning 1292 Truncated incorrect max_connections value: '1' SELECT @@global.max_connections; @@global.max_connections -1 +10 SET @@global.max_connections = FALSE; Warnings: Warning 1292 Truncated incorrect max_connections value: '0' SELECT @@global.max_connections; @@global.max_connections -1 +10 '#---------------------FN_DYNVARS_074_08----------------------#' SET @@global.max_connections = 5000; SELECT @@max_connections = @@global.max_connections; 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 9419f2519..d3de7707f 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 @@ -46,40 +46,40 @@ Warnings: Warning 1292 Truncated incorrect max_prepared_stmt_count value: '100000000000' SELECT @@global.max_prepared_stmt_count; @@global.max_prepared_stmt_count -1048576 +4294967295 SET @@global.max_prepared_stmt_count = 10000.01; ERROR 42000: Incorrect argument type to variable 'max_prepared_stmt_count' SELECT @@global.max_prepared_stmt_count; @@global.max_prepared_stmt_count -1048576 +4294967295 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 -SET @@global.max_prepared_stmt_count = 1048577; +SET @@global.max_prepared_stmt_count = 4294967296; Warnings: -Warning 1292 Truncated incorrect max_prepared_stmt_count value: '1048577' +Warning 1292 Truncated incorrect max_prepared_stmt_count value: '4294967296' SELECT @@global.max_prepared_stmt_count; @@global.max_prepared_stmt_count -1048576 -SET @@global.max_prepared_stmt_count = 104857612; +4294967295 +SET @@global.max_prepared_stmt_count = 4294967295*1024; Warnings: -Warning 1292 Truncated incorrect max_prepared_stmt_count value: '104857612' +Warning 1292 Truncated incorrect max_prepared_stmt_count value: '4398046510080' SELECT @@global.max_prepared_stmt_count; @@global.max_prepared_stmt_count -1048576 +4294967295 SET @@global.max_prepared_stmt_count = ON; ERROR 42000: Incorrect argument type to variable 'max_prepared_stmt_count' SELECT @@global.max_prepared_stmt_count; @@global.max_prepared_stmt_count -1048576 +4294967295 SET @@global.max_prepared_stmt_count = 'test'; ERROR 42000: Incorrect argument type to variable 'max_prepared_stmt_count' SELECT @@global.max_prepared_stmt_count; @@global.max_prepared_stmt_count -1048576 +4294967295 '#-------------------FN_DYNVARS_081_05----------------------------#' SET @@session.max_prepared_stmt_count = 4096; ERROR HY000: Variable 'max_prepared_stmt_count' is a GLOBAL variable and should be set with SET GLOBAL diff --git a/mysql-test/suite/sys_vars/r/sysvars_innodb,32bit,xtradb.rdiff b/mysql-test/suite/sys_vars/r/sysvars_innodb,32bit,xtradb.rdiff index a57fc1294..65439e3ae 100644 --- a/mysql-test/suite/sys_vars/r/sysvars_innodb,32bit,xtradb.rdiff +++ b/mysql-test/suite/sys_vars/r/sysvars_innodb,32bit,xtradb.rdiff @@ -298,7 +298,7 @@ VARIABLE_NAME INNODB_DATA_FILE_PATH SESSION_VALUE NULL GLOBAL_VALUE ibdata1:12M:autoextend -@@ -767,7 +907,7 @@ +@@ -781,7 +921,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 120 VARIABLE_SCOPE GLOBAL @@ -307,7 +307,7 @@ VARIABLE_COMMENT Number of pages reserved in doublewrite buffer for batch flushing NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 127 -@@ -775,6 +915,20 @@ +@@ -789,6 +929,20 @@ ENUM_VALUE_LIST NULL READ_ONLY YES COMMAND_LINE_ARGUMENT OPTIONAL @@ -328,7 +328,7 @@ VARIABLE_NAME INNODB_ENCRYPTION_ROTATE_KEY_AGE SESSION_VALUE NULL GLOBAL_VALUE 1 -@@ -845,13 +999,27 @@ +@@ -859,13 +1013,27 @@ ENUM_VALUE_LIST OFF,ON,FORCE READ_ONLY NO COMMAND_LINE_ARGUMENT OPTIONAL @@ -357,7 +357,7 @@ VARIABLE_COMMENT Speeds up the shutdown process of the InnoDB storage engine. Possible values are 0, 1 (faster) or 2 (fastest - crash-like). NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 2 -@@ -865,7 +1033,7 @@ +@@ -879,7 +1047,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 600 VARIABLE_SCOPE GLOBAL @@ -366,7 +366,7 @@ VARIABLE_COMMENT Maximum number of seconds that semaphore times out in InnoDB. NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 4294967295 -@@ -935,7 +1103,7 @@ +@@ -949,7 +1117,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 0 VARIABLE_SCOPE GLOBAL @@ -375,7 +375,7 @@ VARIABLE_COMMENT Make the first page of the given tablespace dirty. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -949,7 +1117,7 @@ +@@ -963,7 +1131,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 30 VARIABLE_SCOPE GLOBAL @@ -384,7 +384,7 @@ VARIABLE_COMMENT Number of iterations over which the background flushing is averaged. NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 1000 -@@ -972,12 +1140,12 @@ +@@ -986,12 +1154,12 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME INNODB_FLUSH_LOG_AT_TRX_COMMIT @@ -400,7 +400,7 @@ VARIABLE_COMMENT Controls the durability/speed trade-off for commits. Set to 0 (write and flush redo log to disk only once per second), 1 (flush to disk at each commit), 2 (write to log at commit but flush to disk only once per second) or 3 (flush to disk at prepare and at commit, slower and usually redundant). 1 and 3 guarantees that after a crash, committed transactions will not be lost and will be consistent with the binlog and other transactional engines. 2 can get inconsistent and lose transactions if there is a power failure or kernel crash but not if mysqld crashes. 0 has no guarantees in case of crash. 0 and 2 can be faster than 1 or 3. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 3 -@@ -1005,7 +1173,7 @@ +@@ -1019,7 +1187,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 1 VARIABLE_SCOPE GLOBAL @@ -409,7 +409,7 @@ VARIABLE_COMMENT Set to 0 (don't flush neighbors from buffer pool), 1 (flush contiguous neighbors from buffer pool) or 2 (flush neighbors from buffer pool), when flushing a block NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 2 -@@ -1047,7 +1215,7 @@ +@@ -1061,7 +1229,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 0 VARIABLE_SCOPE GLOBAL @@ -418,7 +418,7 @@ VARIABLE_COMMENT Helps to save your data in case the disk image of the database becomes corrupt. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 6 -@@ -1055,6 +1223,20 @@ +@@ -1069,6 +1237,20 @@ ENUM_VALUE_LIST NULL READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED @@ -439,7 +439,7 @@ VARIABLE_NAME INNODB_FT_AUX_TABLE SESSION_VALUE NULL GLOBAL_VALUE -@@ -1075,7 +1257,7 @@ +@@ -1089,7 +1271,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 8000000 VARIABLE_SCOPE GLOBAL @@ -448,7 +448,7 @@ VARIABLE_COMMENT InnoDB Fulltext search cache size in bytes NUMERIC_MIN_VALUE 1600000 NUMERIC_MAX_VALUE 80000000 -@@ -1117,7 +1299,7 @@ +@@ -1131,7 +1313,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 84 VARIABLE_SCOPE GLOBAL @@ -457,7 +457,7 @@ VARIABLE_COMMENT InnoDB Fulltext search maximum token size in characters NUMERIC_MIN_VALUE 10 NUMERIC_MAX_VALUE 84 -@@ -1131,7 +1313,7 @@ +@@ -1145,7 +1327,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 3 VARIABLE_SCOPE GLOBAL @@ -466,7 +466,7 @@ VARIABLE_COMMENT InnoDB Fulltext search minimum token size in characters NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 16 -@@ -1145,7 +1327,7 @@ +@@ -1159,7 +1341,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 2000 VARIABLE_SCOPE GLOBAL @@ -475,7 +475,7 @@ VARIABLE_COMMENT InnoDB Fulltext search number of words to optimize for each optimize table call NUMERIC_MIN_VALUE 1000 NUMERIC_MAX_VALUE 10000 -@@ -1159,7 +1341,7 @@ +@@ -1173,7 +1355,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 2000000000 VARIABLE_SCOPE GLOBAL @@ -484,7 +484,7 @@ VARIABLE_COMMENT InnoDB Fulltext search query result cache limit in bytes NUMERIC_MIN_VALUE 1000000 NUMERIC_MAX_VALUE 4294967295 -@@ -1187,7 +1369,7 @@ +@@ -1201,7 +1383,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 2 VARIABLE_SCOPE GLOBAL @@ -493,7 +493,7 @@ VARIABLE_COMMENT InnoDB Fulltext search parallel sort degree, will round up to nearest power of 2 number NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 16 -@@ -1201,7 +1383,7 @@ +@@ -1215,7 +1397,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 640000000 VARIABLE_SCOPE GLOBAL @@ -502,7 +502,7 @@ VARIABLE_COMMENT Total memory allocated for InnoDB Fulltext Search cache NUMERIC_MIN_VALUE 32000000 NUMERIC_MAX_VALUE 1600000000 -@@ -1229,7 +1411,7 @@ +@@ -1243,7 +1425,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 100 VARIABLE_SCOPE GLOBAL @@ -511,7 +511,7 @@ VARIABLE_COMMENT Up to what percentage of dirty pages should be flushed when innodb finds it has spare resources to do so. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 100 -@@ -1271,10 +1453,10 @@ +@@ -1285,10 +1467,10 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 200 VARIABLE_SCOPE GLOBAL @@ -524,7 +524,7 @@ NUMERIC_BLOCK_SIZE 0 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -1283,12 +1465,26 @@ +@@ -1297,12 +1479,26 @@ SESSION_VALUE NULL GLOBAL_VALUE 2000 GLOBAL_VALUE_ORIGIN COMPILE-TIME @@ -554,7 +554,7 @@ NUMERIC_BLOCK_SIZE 0 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -1321,6 +1517,20 @@ +@@ -1335,6 +1531,20 @@ ENUM_VALUE_LIST NULL READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED @@ -575,7 +575,7 @@ VARIABLE_NAME INNODB_LOCKS_UNSAFE_FOR_BINLOG SESSION_VALUE NULL GLOBAL_VALUE OFF -@@ -1355,7 +1565,7 @@ +@@ -1369,7 +1579,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 50 VARIABLE_SCOPE SESSION @@ -584,44 +584,26 @@ VARIABLE_COMMENT Timeout in seconds an InnoDB transaction may wait for a lock before being rolled back. Values above 100000000 disable the timeout. NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 1073741824 -@@ -1363,37 +1573,107 @@ +@@ -1377,16 +1587,72 @@ ENUM_VALUE_LIST NULL READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED --VARIABLE_NAME INNODB_LOG_BUFFER_SIZE --SESSION_VALUE NULL --GLOBAL_VALUE 1048576 --GLOBAL_VALUE_ORIGIN CONFIG --DEFAULT_VALUE 16777216 --VARIABLE_SCOPE GLOBAL --VARIABLE_TYPE BIGINT --VARIABLE_COMMENT The size of the buffer which InnoDB uses to write log to the log files on disk. --NUMERIC_MIN_VALUE 262144 --NUMERIC_MAX_VALUE 9223372036854775807 --NUMERIC_BLOCK_SIZE 1024 --ENUM_VALUE_LIST NULL --READ_ONLY YES --COMMAND_LINE_ARGUMENT REQUIRED --VARIABLE_NAME INNODB_LOG_CHECKPOINT_NOW +VARIABLE_NAME INNODB_LOG_ARCHIVE - SESSION_VALUE NULL - GLOBAL_VALUE OFF - GLOBAL_VALUE_ORIGIN COMPILE-TIME - DEFAULT_VALUE OFF - VARIABLE_SCOPE GLOBAL - VARIABLE_TYPE BOOLEAN --VARIABLE_COMMENT Force checkpoint now ++SESSION_VALUE NULL ++GLOBAL_VALUE OFF ++GLOBAL_VALUE_ORIGIN COMPILE-TIME ++DEFAULT_VALUE OFF ++VARIABLE_SCOPE GLOBAL ++VARIABLE_TYPE BOOLEAN +VARIABLE_COMMENT Set to 1 if you want to have logs archived. - NUMERIC_MIN_VALUE NULL - NUMERIC_MAX_VALUE NULL - NUMERIC_BLOCK_SIZE NULL - ENUM_VALUE_LIST OFF,ON - READ_ONLY NO - COMMAND_LINE_ARGUMENT OPTIONAL --VARIABLE_NAME INNODB_LOG_COMPRESSED_PAGES ++NUMERIC_MIN_VALUE NULL ++NUMERIC_MAX_VALUE NULL ++NUMERIC_BLOCK_SIZE NULL ++ENUM_VALUE_LIST OFF,ON ++READ_ONLY NO ++COMMAND_LINE_ARGUMENT OPTIONAL +VARIABLE_NAME INNODB_LOG_ARCH_DIR - SESSION_VALUE NULL --GLOBAL_VALUE ON ++SESSION_VALUE NULL +GLOBAL_VALUE PATH +GLOBAL_VALUE_ORIGIN COMPILE-TIME +DEFAULT_VALUE @@ -662,34 +644,25 @@ +ENUM_VALUE_LIST NULL +READ_ONLY YES +COMMAND_LINE_ARGUMENT REQUIRED -+VARIABLE_NAME INNODB_LOG_BUFFER_SIZE -+SESSION_VALUE NULL -+GLOBAL_VALUE 1048576 -+GLOBAL_VALUE_ORIGIN CONFIG -+DEFAULT_VALUE 16777216 -+VARIABLE_SCOPE GLOBAL + VARIABLE_NAME INNODB_LOG_BUFFER_SIZE + SESSION_VALUE NULL + GLOBAL_VALUE 1048576 + GLOBAL_VALUE_ORIGIN CONFIG + DEFAULT_VALUE 16777216 + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT +VARIABLE_TYPE INT -+VARIABLE_COMMENT The size of the buffer which InnoDB uses to write log to the log files on disk. -+NUMERIC_MIN_VALUE 262144 + VARIABLE_COMMENT The size of the buffer which InnoDB uses to write log to the log files on disk. + NUMERIC_MIN_VALUE 262144 +-NUMERIC_MAX_VALUE 9223372036854775807 +NUMERIC_MAX_VALUE 2147483647 -+NUMERIC_BLOCK_SIZE 1024 -+ENUM_VALUE_LIST NULL -+READ_ONLY YES -+COMMAND_LINE_ARGUMENT REQUIRED -+VARIABLE_NAME INNODB_LOG_CHECKPOINT_NOW -+SESSION_VALUE NULL -+GLOBAL_VALUE OFF -+GLOBAL_VALUE_ORIGIN COMPILE-TIME -+DEFAULT_VALUE OFF -+VARIABLE_SCOPE GLOBAL -+VARIABLE_TYPE BOOLEAN -+VARIABLE_COMMENT Force checkpoint now -+NUMERIC_MIN_VALUE NULL -+NUMERIC_MAX_VALUE NULL -+NUMERIC_BLOCK_SIZE NULL -+ENUM_VALUE_LIST OFF,ON -+READ_ONLY NO -+COMMAND_LINE_ARGUMENT OPTIONAL + NUMERIC_BLOCK_SIZE 1024 + ENUM_VALUE_LIST NULL + READ_ONLY YES +@@ -1405,6 +1671,20 @@ + ENUM_VALUE_LIST OFF,ON + READ_ONLY NO + COMMAND_LINE_ARGUMENT OPTIONAL +VARIABLE_NAME INNODB_LOG_CHECKSUM_ALGORITHM +SESSION_VALUE NULL +GLOBAL_VALUE INNODB @@ -704,13 +677,10 @@ +ENUM_VALUE_LIST CRC32,STRICT_CRC32,INNODB,STRICT_INNODB,NONE,STRICT_NONE +READ_ONLY NO +COMMAND_LINE_ARGUMENT REQUIRED -+VARIABLE_NAME INNODB_LOG_COMPRESSED_PAGES -+SESSION_VALUE NULL -+GLOBAL_VALUE ON - GLOBAL_VALUE_ORIGIN COMPILE-TIME - DEFAULT_VALUE ON - VARIABLE_SCOPE GLOBAL -@@ -1411,7 +1691,7 @@ + VARIABLE_NAME INNODB_LOG_COMPRESSED_PAGES + SESSION_VALUE NULL + GLOBAL_VALUE ON +@@ -1425,7 +1705,7 @@ GLOBAL_VALUE_ORIGIN CONFIG DEFAULT_VALUE 2 VARIABLE_SCOPE GLOBAL @@ -719,7 +689,7 @@ VARIABLE_COMMENT Number of log files in the log group. InnoDB writes to the files in a circular fashion. NUMERIC_MIN_VALUE 2 NUMERIC_MAX_VALUE 100 -@@ -1453,9 +1733,37 @@ +@@ -1467,9 +1747,37 @@ GLOBAL_VALUE_ORIGIN CONFIG DEFAULT_VALUE 1024 VARIABLE_SCOPE GLOBAL @@ -758,7 +728,7 @@ NUMERIC_MAX_VALUE 18446744073709551615 NUMERIC_BLOCK_SIZE 0 ENUM_VALUE_LIST NULL -@@ -1495,10 +1803,10 @@ +@@ -1509,10 +1817,10 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 0 VARIABLE_SCOPE GLOBAL @@ -771,7 +741,7 @@ NUMERIC_BLOCK_SIZE 0 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -1509,7 +1817,7 @@ +@@ -1523,7 +1831,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 0 VARIABLE_SCOPE GLOBAL @@ -780,7 +750,7 @@ VARIABLE_COMMENT Maximum delay of user threads in micro-seconds NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 10000000 -@@ -1523,7 +1831,7 @@ +@@ -1537,7 +1845,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 0 VARIABLE_SCOPE GLOBAL @@ -789,7 +759,7 @@ VARIABLE_COMMENT Number of identical copies of log groups we keep for the database. Currently this should be set to 1. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 10 -@@ -1593,7 +1901,7 @@ +@@ -1607,7 +1915,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 8 VARIABLE_SCOPE GLOBAL @@ -798,7 +768,12 @@ VARIABLE_COMMENT Number of multi-threaded flush threads NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 64 -@@ -1649,10 +1957,10 @@ +@@ -1659,14 +1967,14 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME INNODB_OPEN_FILES + SESSION_VALUE NULL +-GLOBAL_VALUE 2000 ++GLOBAL_VALUE 300 GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 0 VARIABLE_SCOPE GLOBAL @@ -811,7 +786,7 @@ NUMERIC_BLOCK_SIZE 0 ENUM_VALUE_LIST NULL READ_ONLY YES -@@ -1677,7 +1985,7 @@ +@@ -1691,7 +1999,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 16 VARIABLE_SCOPE GLOBAL @@ -820,7 +795,7 @@ VARIABLE_COMMENT Number of rw_locks protecting buffer pool page_hash. Rounded up to the next power of 2 NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 1024 -@@ -1691,7 +1999,7 @@ +@@ -1705,7 +2013,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 16384 VARIABLE_SCOPE GLOBAL @@ -829,7 +804,7 @@ VARIABLE_COMMENT Page size to use for all InnoDB tablespaces. NUMERIC_MIN_VALUE 4096 NUMERIC_MAX_VALUE 65536 -@@ -1727,13 +2035,83 @@ +@@ -1741,13 +2049,83 @@ ENUM_VALUE_LIST OFF,ON READ_ONLY NO COMMAND_LINE_ARGUMENT OPTIONAL @@ -914,7 +889,7 @@ VARIABLE_COMMENT Number of UNDO log pages to purge in one batch from the history list. NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 5000 -@@ -1775,7 +2139,7 @@ +@@ -1789,7 +2167,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 1 VARIABLE_SCOPE GLOBAL @@ -923,7 +898,7 @@ VARIABLE_COMMENT Purge threads can be from 1 to 32. Default is 1. NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 32 -@@ -1803,7 +2167,7 @@ +@@ -1817,7 +2195,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 56 VARIABLE_SCOPE GLOBAL @@ -932,7 +907,7 @@ VARIABLE_COMMENT Number of pages that must be accessed sequentially for InnoDB to trigger a readahead. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 64 -@@ -1817,7 +2181,7 @@ +@@ -1831,7 +2209,7 @@ GLOBAL_VALUE_ORIGIN CONFIG DEFAULT_VALUE 4 VARIABLE_SCOPE GLOBAL @@ -941,7 +916,7 @@ VARIABLE_COMMENT Number of background read I/O threads in InnoDB. NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 64 -@@ -1845,10 +2209,10 @@ +@@ -1859,10 +2237,10 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 0 VARIABLE_SCOPE GLOBAL @@ -954,7 +929,7 @@ NUMERIC_BLOCK_SIZE 0 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -1873,7 +2237,7 @@ +@@ -1887,7 +2265,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 128 VARIABLE_SCOPE GLOBAL @@ -963,7 +938,7 @@ VARIABLE_COMMENT Number of undo logs to use (deprecated). NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 128 -@@ -1887,7 +2251,7 @@ +@@ -1901,7 +2279,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 0 VARIABLE_SCOPE GLOBAL @@ -972,7 +947,7 @@ VARIABLE_COMMENT An InnoDB page number. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -1895,6 +2259,48 @@ +@@ -1909,6 +2287,48 @@ ENUM_VALUE_LIST NULL READ_ONLY NO COMMAND_LINE_ARGUMENT OPTIONAL @@ -1021,7 +996,7 @@ VARIABLE_NAME INNODB_SCRUB_LOG SESSION_VALUE NULL GLOBAL_VALUE OFF -@@ -1923,6 +2329,34 @@ +@@ -1937,6 +2357,34 @@ ENUM_VALUE_LIST NULL READ_ONLY NO COMMAND_LINE_ARGUMENT OPTIONAL @@ -1056,7 +1031,7 @@ VARIABLE_NAME INNODB_SIMULATE_COMP_FAILURES SESSION_VALUE NULL GLOBAL_VALUE 0 -@@ -1943,7 +2377,7 @@ +@@ -1957,7 +2405,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 1048576 VARIABLE_SCOPE GLOBAL @@ -1065,7 +1040,7 @@ VARIABLE_COMMENT Memory buffer size for index creation NUMERIC_MIN_VALUE 65536 NUMERIC_MAX_VALUE 67108864 -@@ -1957,10 +2391,10 @@ +@@ -1971,10 +2419,10 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 6 VARIABLE_SCOPE GLOBAL @@ -1078,7 +1053,7 @@ NUMERIC_BLOCK_SIZE 0 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -2000,7 +2434,7 @@ +@@ -2014,7 +2462,7 @@ DEFAULT_VALUE nulls_equal VARIABLE_SCOPE GLOBAL VARIABLE_TYPE ENUM @@ -1087,7 +1062,7 @@ NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL -@@ -2167,7 +2601,7 @@ +@@ -2181,7 +2629,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 1 VARIABLE_SCOPE GLOBAL @@ -1096,7 +1071,7 @@ VARIABLE_COMMENT Size of the mutex/lock wait array. NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 1024 -@@ -2181,10 +2615,10 @@ +@@ -2195,10 +2643,10 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 30 VARIABLE_SCOPE GLOBAL @@ -1109,7 +1084,7 @@ NUMERIC_BLOCK_SIZE 0 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -2209,7 +2643,7 @@ +@@ -2223,7 +2671,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 0 VARIABLE_SCOPE GLOBAL @@ -1118,7 +1093,7 @@ VARIABLE_COMMENT Helps in performance tuning in heavily concurrent environments. Sets the maximum number of threads allowed inside InnoDB. Value 0 will disable the thread throttling. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 1000 -@@ -2223,7 +2657,7 @@ +@@ -2237,7 +2685,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 10000 VARIABLE_SCOPE GLOBAL @@ -1127,7 +1102,7 @@ VARIABLE_COMMENT Time of innodb thread sleeping before joining InnoDB queue (usec). Value 0 disable a sleep NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 1000000 -@@ -2245,6 +2679,34 @@ +@@ -2259,6 +2707,34 @@ ENUM_VALUE_LIST NULL READ_ONLY NO COMMAND_LINE_ARGUMENT OPTIONAL @@ -1162,7 +1137,7 @@ VARIABLE_NAME INNODB_TRX_PURGE_VIEW_UPDATE_ONLY_DEBUG SESSION_VALUE NULL GLOBAL_VALUE OFF -@@ -2293,7 +2755,7 @@ +@@ -2307,7 +2783,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 128 VARIABLE_SCOPE GLOBAL @@ -1171,7 +1146,7 @@ VARIABLE_COMMENT Number of undo logs to use. NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 128 -@@ -2307,7 +2769,7 @@ +@@ -2321,7 +2797,7 @@ GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 0 VARIABLE_SCOPE GLOBAL @@ -1180,7 +1155,7 @@ VARIABLE_COMMENT Number of undo tablespaces to use. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 126 -@@ -2322,7 +2784,7 @@ +@@ -2336,7 +2812,7 @@ DEFAULT_VALUE OFF VARIABLE_SCOPE GLOBAL VARIABLE_TYPE BOOLEAN @@ -1189,7 +1164,7 @@ NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL -@@ -2343,6 +2805,20 @@ +@@ -2357,6 +2833,20 @@ ENUM_VALUE_LIST OFF,ON READ_ONLY YES COMMAND_LINE_ARGUMENT NONE @@ -1210,7 +1185,7 @@ VARIABLE_NAME INNODB_USE_MTFLUSH SESSION_VALUE NULL GLOBAL_VALUE OFF -@@ -2357,6 +2833,20 @@ +@@ -2371,6 +2861,20 @@ ENUM_VALUE_LIST OFF,ON READ_ONLY YES COMMAND_LINE_ARGUMENT NONE @@ -1231,12 +1206,12 @@ VARIABLE_NAME INNODB_USE_SYS_MALLOC SESSION_VALUE NULL GLOBAL_VALUE ON -@@ -2387,12 +2877,12 @@ +@@ -2401,12 +2905,12 @@ COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME INNODB_VERSION SESSION_VALUE NULL --GLOBAL_VALUE 5.6.37 -+GLOBAL_VALUE 5.6.36-83.0 +-GLOBAL_VALUE 5.6.40 ++GLOBAL_VALUE 5.6.39-83.1 GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE NULL VARIABLE_SCOPE GLOBAL @@ -1246,7 +1221,7 @@ NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL -@@ -2405,7 +2895,7 @@ +@@ -2419,7 +2923,7 @@ GLOBAL_VALUE_ORIGIN CONFIG DEFAULT_VALUE 4 VARIABLE_SCOPE GLOBAL diff --git a/mysql-test/suite/sys_vars/r/sysvars_innodb,xtradb.rdiff b/mysql-test/suite/sys_vars/r/sysvars_innodb,xtradb.rdiff index 0a2757c51..dafdde75e 100644 --- a/mysql-test/suite/sys_vars/r/sysvars_innodb,xtradb.rdiff +++ b/mysql-test/suite/sys_vars/r/sysvars_innodb,xtradb.rdiff @@ -177,7 +177,7 @@ VARIABLE_NAME INNODB_DATA_FILE_PATH SESSION_VALUE NULL GLOBAL_VALUE ibdata1:12M:autoextend -@@ -775,6 +915,20 @@ +@@ -789,6 +929,20 @@ ENUM_VALUE_LIST NULL READ_ONLY YES COMMAND_LINE_ARGUMENT OPTIONAL @@ -198,7 +198,7 @@ VARIABLE_NAME INNODB_ENCRYPTION_ROTATE_KEY_AGE SESSION_VALUE NULL GLOBAL_VALUE 1 -@@ -845,6 +999,20 @@ +@@ -859,6 +1013,20 @@ ENUM_VALUE_LIST OFF,ON,FORCE READ_ONLY NO COMMAND_LINE_ARGUMENT OPTIONAL @@ -219,7 +219,7 @@ VARIABLE_NAME INNODB_FAST_SHUTDOWN SESSION_VALUE NULL GLOBAL_VALUE 1 -@@ -972,11 +1140,11 @@ +@@ -986,11 +1154,11 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME INNODB_FLUSH_LOG_AT_TRX_COMMIT @@ -233,7 +233,7 @@ VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT Controls the durability/speed trade-off for commits. Set to 0 (write and flush redo log to disk only once per second), 1 (flush to disk at each commit), 2 (write to log at commit but flush to disk only once per second) or 3 (flush to disk at prepare and at commit, slower and usually redundant). 1 and 3 guarantees that after a crash, committed transactions will not be lost and will be consistent with the binlog and other transactional engines. 2 can get inconsistent and lose transactions if there is a power failure or kernel crash but not if mysqld crashes. 0 has no guarantees in case of crash. 0 and 2 can be faster than 1 or 3. NUMERIC_MIN_VALUE 0 -@@ -1055,6 +1223,20 @@ +@@ -1069,6 +1237,20 @@ ENUM_VALUE_LIST NULL READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED @@ -254,7 +254,7 @@ VARIABLE_NAME INNODB_FT_AUX_TABLE SESSION_VALUE NULL GLOBAL_VALUE -@@ -1293,6 +1475,20 @@ +@@ -1307,6 +1489,20 @@ ENUM_VALUE_LIST NULL READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED @@ -275,7 +275,7 @@ VARIABLE_NAME INNODB_LARGE_PREFIX SESSION_VALUE NULL GLOBAL_VALUE OFF -@@ -1321,6 +1517,20 @@ +@@ -1335,6 +1531,20 @@ ENUM_VALUE_LIST NULL READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED @@ -296,7 +296,7 @@ VARIABLE_NAME INNODB_LOCKS_UNSAFE_FOR_BINLOG SESSION_VALUE NULL GLOBAL_VALUE OFF -@@ -1363,6 +1573,62 @@ +@@ -1377,6 +1587,62 @@ ENUM_VALUE_LIST NULL READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED @@ -359,7 +359,7 @@ VARIABLE_NAME INNODB_LOG_BUFFER_SIZE SESSION_VALUE NULL GLOBAL_VALUE 1048576 -@@ -1391,6 +1657,20 @@ +@@ -1405,6 +1671,20 @@ ENUM_VALUE_LIST OFF,ON READ_ONLY NO COMMAND_LINE_ARGUMENT OPTIONAL @@ -380,7 +380,7 @@ VARIABLE_NAME INNODB_LOG_COMPRESSED_PAGES SESSION_VALUE NULL GLOBAL_VALUE ON -@@ -1461,6 +1741,34 @@ +@@ -1475,6 +1755,34 @@ ENUM_VALUE_LIST NULL READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED @@ -415,7 +415,16 @@ VARIABLE_NAME INNODB_MAX_DIRTY_PAGES_PCT SESSION_VALUE NULL GLOBAL_VALUE 75.000000 -@@ -1727,6 +2035,76 @@ +@@ -1659,7 +1967,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME INNODB_OPEN_FILES + SESSION_VALUE NULL +-GLOBAL_VALUE 2000 ++GLOBAL_VALUE 300 + GLOBAL_VALUE_ORIGIN COMPILE-TIME + DEFAULT_VALUE 0 + VARIABLE_SCOPE GLOBAL +@@ -1741,6 +2049,76 @@ ENUM_VALUE_LIST OFF,ON READ_ONLY NO COMMAND_LINE_ARGUMENT OPTIONAL @@ -492,7 +501,7 @@ VARIABLE_NAME INNODB_PURGE_BATCH_SIZE SESSION_VALUE NULL GLOBAL_VALUE 300 -@@ -1895,6 +2273,48 @@ +@@ -1909,6 +2287,48 @@ ENUM_VALUE_LIST NULL READ_ONLY NO COMMAND_LINE_ARGUMENT OPTIONAL @@ -541,7 +550,7 @@ VARIABLE_NAME INNODB_SCRUB_LOG SESSION_VALUE NULL GLOBAL_VALUE OFF -@@ -1923,6 +2343,34 @@ +@@ -1937,6 +2357,34 @@ ENUM_VALUE_LIST NULL READ_ONLY NO COMMAND_LINE_ARGUMENT OPTIONAL @@ -576,7 +585,7 @@ VARIABLE_NAME INNODB_SIMULATE_COMP_FAILURES SESSION_VALUE NULL GLOBAL_VALUE 0 -@@ -2000,7 +2448,7 @@ +@@ -2014,7 +2462,7 @@ DEFAULT_VALUE nulls_equal VARIABLE_SCOPE GLOBAL VARIABLE_TYPE ENUM @@ -585,7 +594,7 @@ NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL -@@ -2245,6 +2693,34 @@ +@@ -2259,6 +2707,34 @@ ENUM_VALUE_LIST NULL READ_ONLY NO COMMAND_LINE_ARGUMENT OPTIONAL @@ -620,7 +629,7 @@ VARIABLE_NAME INNODB_TRX_PURGE_VIEW_UPDATE_ONLY_DEBUG SESSION_VALUE NULL GLOBAL_VALUE OFF -@@ -2322,7 +2798,7 @@ +@@ -2336,7 +2812,7 @@ DEFAULT_VALUE OFF VARIABLE_SCOPE GLOBAL VARIABLE_TYPE BOOLEAN @@ -629,7 +638,7 @@ NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL -@@ -2343,6 +2819,20 @@ +@@ -2357,6 +2833,20 @@ ENUM_VALUE_LIST OFF,ON READ_ONLY YES COMMAND_LINE_ARGUMENT NONE @@ -650,7 +659,7 @@ VARIABLE_NAME INNODB_USE_MTFLUSH SESSION_VALUE NULL GLOBAL_VALUE OFF -@@ -2357,6 +2847,20 @@ +@@ -2371,6 +2861,20 @@ ENUM_VALUE_LIST OFF,ON READ_ONLY YES COMMAND_LINE_ARGUMENT NONE @@ -671,12 +680,12 @@ VARIABLE_NAME INNODB_USE_SYS_MALLOC SESSION_VALUE NULL GLOBAL_VALUE ON -@@ -2387,12 +2891,12 @@ +@@ -2401,12 +2905,12 @@ COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME INNODB_VERSION SESSION_VALUE NULL --GLOBAL_VALUE 5.6.37 -+GLOBAL_VALUE 5.6.36-83.0 +-GLOBAL_VALUE 5.6.40 ++GLOBAL_VALUE 5.6.39-83.1 GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE NULL VARIABLE_SCOPE GLOBAL diff --git a/mysql-test/suite/sys_vars/r/sysvars_innodb.result b/mysql-test/suite/sys_vars/r/sysvars_innodb.result index 161f740db..05bb199ac 100644 --- a/mysql-test/suite/sys_vars/r/sysvars_innodb.result +++ b/mysql-test/suite/sys_vars/r/sysvars_innodb.result @@ -635,6 +635,20 @@ NUMERIC_BLOCK_SIZE 0 ENUM_VALUE_LIST NULL READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED +VARIABLE_NAME INNODB_DEFAULT_ROW_FORMAT +SESSION_VALUE NULL +GLOBAL_VALUE compact +GLOBAL_VALUE_ORIGIN COMPILE-TIME +DEFAULT_VALUE compact +VARIABLE_SCOPE GLOBAL +VARIABLE_TYPE ENUM +VARIABLE_COMMENT The default ROW FORMAT for all innodb tables created without explicit ROW_FORMAT. Possible values are REDUNDANT, COMPACT, and DYNAMIC. The ROW_FORMAT value COMPRESSED is not allowed +NUMERIC_MIN_VALUE NULL +NUMERIC_MAX_VALUE NULL +NUMERIC_BLOCK_SIZE NULL +ENUM_VALUE_LIST redundant,compact,dynamic +READ_ONLY NO +COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME INNODB_DEFRAGMENT SESSION_VALUE NULL GLOBAL_VALUE OFF @@ -2387,7 +2401,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME INNODB_VERSION SESSION_VALUE NULL -GLOBAL_VALUE 5.6.37 +GLOBAL_VALUE 5.6.40 GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE NULL VARIABLE_SCOPE GLOBAL diff --git a/mysql-test/suite/sys_vars/r/sysvars_server_embedded.result b/mysql-test/suite/sys_vars/r/sysvars_server_embedded.result index f851dfcc5..7f046a188 100644 --- a/mysql-test/suite/sys_vars/r/sysvars_server_embedded.result +++ b/mysql-test/suite/sys_vars/r/sysvars_server_embedded.result @@ -1837,7 +1837,7 @@ DEFAULT_VALUE 151 VARIABLE_SCOPE GLOBAL VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT The number of simultaneous clients allowed -NUMERIC_MIN_VALUE 1 +NUMERIC_MIN_VALUE 10 NUMERIC_MAX_VALUE 100000 NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL @@ -1975,10 +1975,10 @@ GLOBAL_VALUE 16382 GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 16382 VARIABLE_SCOPE GLOBAL -VARIABLE_TYPE BIGINT UNSIGNED +VARIABLE_TYPE INT UNSIGNED VARIABLE_COMMENT Maximum number of prepared statements in the server NUMERIC_MIN_VALUE 0 -NUMERIC_MAX_VALUE 1048576 +NUMERIC_MAX_VALUE 4294967295 NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO @@ -3847,13 +3847,13 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME TABLE_OPEN_CACHE SESSION_VALUE NULL -GLOBAL_VALUE 2000 -GLOBAL_VALUE_ORIGIN COMPILE-TIME +GLOBAL_VALUE 100 +GLOBAL_VALUE_ORIGIN CONFIG DEFAULT_VALUE 2000 VARIABLE_SCOPE GLOBAL VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT The number of cached open tables -NUMERIC_MIN_VALUE 1 +NUMERIC_MIN_VALUE 10 NUMERIC_MAX_VALUE 1048576 NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL diff --git a/mysql-test/suite/sys_vars/r/sysvars_server_notembedded.result b/mysql-test/suite/sys_vars/r/sysvars_server_notembedded.result index 5bc6a6e17..72550ffb3 100644 --- a/mysql-test/suite/sys_vars/r/sysvars_server_notembedded.result +++ b/mysql-test/suite/sys_vars/r/sysvars_server_notembedded.result @@ -2019,7 +2019,7 @@ DEFAULT_VALUE 151 VARIABLE_SCOPE GLOBAL VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT The number of simultaneous clients allowed -NUMERIC_MIN_VALUE 1 +NUMERIC_MIN_VALUE 10 NUMERIC_MAX_VALUE 100000 NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL @@ -2157,10 +2157,10 @@ GLOBAL_VALUE 16382 GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE 16382 VARIABLE_SCOPE GLOBAL -VARIABLE_TYPE BIGINT UNSIGNED +VARIABLE_TYPE INT UNSIGNED VARIABLE_COMMENT Maximum number of prepared statements in the server NUMERIC_MIN_VALUE 0 -NUMERIC_MAX_VALUE 1048576 +NUMERIC_MAX_VALUE 4294967295 NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO @@ -4547,13 +4547,13 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME TABLE_OPEN_CACHE SESSION_VALUE NULL -GLOBAL_VALUE 2000 -GLOBAL_VALUE_ORIGIN COMPILE-TIME +GLOBAL_VALUE 100 +GLOBAL_VALUE_ORIGIN CONFIG DEFAULT_VALUE 2000 VARIABLE_SCOPE GLOBAL VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT The number of cached open tables -NUMERIC_MIN_VALUE 1 +NUMERIC_MIN_VALUE 10 NUMERIC_MAX_VALUE 1048576 NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL diff --git a/mysql-test/suite/sys_vars/r/sysvars_wsrep.result b/mysql-test/suite/sys_vars/r/sysvars_wsrep.result index 0c206975c..db932ae82 100644 --- a/mysql-test/suite/sys_vars/r/sysvars_wsrep.result +++ b/mysql-test/suite/sys_vars/r/sysvars_wsrep.result @@ -421,6 +421,20 @@ NUMERIC_BLOCK_SIZE NULL ENUM_VALUE_LIST OFF,ON READ_ONLY YES COMMAND_LINE_ARGUMENT OPTIONAL +VARIABLE_NAME WSREP_REJECT_QUERIES +SESSION_VALUE NULL +GLOBAL_VALUE NONE +GLOBAL_VALUE_ORIGIN COMPILE-TIME +DEFAULT_VALUE NONE +VARIABLE_SCOPE GLOBAL +VARIABLE_TYPE ENUM +VARIABLE_COMMENT Variable to set to reject queries +NUMERIC_MIN_VALUE NULL +NUMERIC_MAX_VALUE NULL +NUMERIC_BLOCK_SIZE NULL +ENUM_VALUE_LIST NONE,ALL,ALL_KILL +READ_ONLY NO +COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME WSREP_REPLICATE_MYISAM SESSION_VALUE NULL GLOBAL_VALUE OFF 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 4c6357837..bc373003e 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 @@ -1,7 +1,7 @@ SET @start_value = @@global.table_open_cache ; SELECT @start_value; @start_value -2000 +421 '#--------------------FN_DYNVARS_001_01------------------------#' SET @@global.table_open_cache = 99; SET @@global.table_open_cache = DeFAULT; @@ -15,13 +15,17 @@ SELECT @@global.table_open_cache = 400; 0 '#--------------------FN_DYNVARS_001_03------------------------#' SET @@global.table_open_cache = 8; +Warnings: +Warning 1292 Truncated incorrect table_open_cache value: '8' SELECT @@global.table_open_cache ; @@global.table_open_cache -8 +10 SET @@global.table_open_cache = 1; +Warnings: +Warning 1292 Truncated incorrect table_open_cache value: '1' SELECT @@global.table_open_cache ; @@global.table_open_cache -1 +10 SET @@global.table_open_cache = 1073741824; Warnings: Warning 1292 Truncated incorrect table_open_cache value: '1073741824' @@ -42,7 +46,7 @@ Warnings: Warning 1292 Truncated incorrect table_open_cache value: '-1' SELECT @@global.table_open_cache ; @@global.table_open_cache -1 +10 SET @@global.table_open_cache = 100000000000; Warnings: Warning 1292 Truncated incorrect table_open_cache value: '100000000000' @@ -54,13 +58,13 @@ Warnings: Warning 1292 Truncated incorrect table_open_cache value: '-1024' SELECT @@global.table_open_cache ; @@global.table_open_cache -1 +10 SET @@global.table_open_cache = 0; Warnings: Warning 1292 Truncated incorrect table_open_cache value: '0' SELECT @@global.table_open_cache ; @@global.table_open_cache -1 +10 SET @@global.table_open_cache = 10000.01; ERROR 42000: Incorrect argument type to variable 'table_open_cache' SET @@global.table_open_cache = ON; @@ -78,15 +82,17 @@ SELECT @@global.table_open_cache = VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL 1 '#---------------------FN_DYNVARS_001_09----------------------#' SET @@global.table_open_cache = TRUE; +Warnings: +Warning 1292 Truncated incorrect table_open_cache value: '1' SELECT @@global.table_open_cache ; @@global.table_open_cache -1 +10 SET @@global.table_open_cache = FALSE; Warnings: Warning 1292 Truncated incorrect table_open_cache value: '0' SELECT @@global.table_open_cache ; @@global.table_open_cache -1 +10 '#---------------------FN_DYNVARS_001_10----------------------#' SET @@global.table_open_cache = 10; SELECT @@table_open_cache = @@global.table_open_cache ; @@ -104,4 +110,4 @@ ERROR 42S22: Unknown column 'table_open_cache' in 'field list' SET @@global.table_open_cache = @start_value; SELECT @@global.table_open_cache ; @@global.table_open_cache -2000 +421 diff --git a/mysql-test/suite/sys_vars/r/wsrep_sst_receive_address_basic.result b/mysql-test/suite/sys_vars/r/wsrep_sst_receive_address_basic.result index 6db52eb81..3e1fb6cad 100644 --- a/mysql-test/suite/sys_vars/r/wsrep_sst_receive_address_basic.result +++ b/mysql-test/suite/sys_vars/r/wsrep_sst_receive_address_basic.result @@ -30,10 +30,6 @@ SELECT @@global.wsrep_sst_receive_address; 192.168.2.254 # invalid values -SET @@global.wsrep_sst_receive_address='127.0.0.1:4444'; -ERROR 42000: Variable 'wsrep_sst_receive_address' can't be set to the value of '127.0.0.1:4444' -SET @@global.wsrep_sst_receive_address='127.0.0.1'; -ERROR 42000: Variable 'wsrep_sst_receive_address' can't be set to the value of '127.0.0.1' SELECT @@global.wsrep_sst_receive_address; @@global.wsrep_sst_receive_address 192.168.2.254 diff --git a/mysql-test/suite/sys_vars/t/innodb_default_row_format_basic.test b/mysql-test/suite/sys_vars/t/innodb_default_row_format_basic.test new file mode 100644 index 000000000..f9aabf49b --- /dev/null +++ b/mysql-test/suite/sys_vars/t/innodb_default_row_format_basic.test @@ -0,0 +1,41 @@ +--source include/have_innodb.inc + +# Check the default value +SELECT @@global.innodb_default_row_format; + +SET GLOBAL innodb_default_row_format = 'redundant'; +SELECT @@global.innodb_default_row_format; + +SET GLOBAL innodb_default_row_format = 'dynamic'; +SELECT @@global.innodb_default_row_format; + +SET GLOBAL innodb_default_row_format = 'compact'; +SELECT @@global.innodb_default_row_format; + +--error ER_WRONG_VALUE_FOR_VAR +SET GLOBAL innodb_default_row_format = 'compressed'; +SELECT @@global.innodb_default_row_format; + +--error ER_WRONG_VALUE_FOR_VAR +SET GLOBAL innodb_default_row_format = 'foobar'; +SELECT @@global.innodb_default_row_format; + +SET GLOBAL innodb_default_row_format = 0; +SELECT @@global.innodb_default_row_format; + +SET GLOBAL innodb_default_row_format = 1; +SELECT @@global.innodb_default_row_format; + +SET GLOBAL innodb_default_row_format = 2; +SELECT @@global.innodb_default_row_format; + +--error ER_WRONG_VALUE_FOR_VAR +SET GLOBAL innodb_default_row_format = 3; +SELECT @@global.innodb_default_row_format; + +--error ER_WRONG_VALUE_FOR_VAR +SET GLOBAL innodb_default_row_format = 123; +SELECT @@global.innodb_default_row_format; + + +SET GLOBAL innodb_default_row_format = default; diff --git a/mysql-test/suite/sys_vars/t/max_prepared_stmt_count_basic.test b/mysql-test/suite/sys_vars/t/max_prepared_stmt_count_basic.test index 5bf5d9c88..a97256d84 100644 --- a/mysql-test/suite/sys_vars/t/max_prepared_stmt_count_basic.test +++ b/mysql-test/suite/sys_vars/t/max_prepared_stmt_count_basic.test @@ -92,9 +92,9 @@ SET @@global.max_prepared_stmt_count = 10000.01; SELECT @@global.max_prepared_stmt_count; SET @@global.max_prepared_stmt_count = -1024; SELECT @@global.max_prepared_stmt_count; -SET @@global.max_prepared_stmt_count = 1048577; +SET @@global.max_prepared_stmt_count = 4294967296; SELECT @@global.max_prepared_stmt_count; -SET @@global.max_prepared_stmt_count = 104857612; +SET @@global.max_prepared_stmt_count = 4294967295*1024; SELECT @@global.max_prepared_stmt_count; --Error ER_WRONG_TYPE_FOR_VAR diff --git a/mysql-test/suite/sys_vars/t/sysvars_innodb.opt b/mysql-test/suite/sys_vars/t/sysvars_innodb.opt index 462e83d98..c3eec59bc 100644 --- a/mysql-test/suite/sys_vars/t/sysvars_innodb.opt +++ b/mysql-test/suite/sys_vars/t/sysvars_innodb.opt @@ -1 +1,2 @@ --loose-innodb-flush-log-at-timeout=3 +--table_open_cache=200 diff --git a/mysql-test/suite/sys_vars/t/sysvars_server_embedded.opt b/mysql-test/suite/sys_vars/t/sysvars_server_embedded.opt new file mode 100644 index 000000000..c3f0d3bd5 --- /dev/null +++ b/mysql-test/suite/sys_vars/t/sysvars_server_embedded.opt @@ -0,0 +1 @@ +--table_open_cache=100 diff --git a/mysql-test/suite/sys_vars/t/sysvars_server_notembedded.opt b/mysql-test/suite/sys_vars/t/sysvars_server_notembedded.opt new file mode 100644 index 000000000..c3f0d3bd5 --- /dev/null +++ b/mysql-test/suite/sys_vars/t/sysvars_server_notembedded.opt @@ -0,0 +1 @@ +--table_open_cache=100 diff --git a/mysql-test/suite/sys_vars/t/wsrep_sst_receive_address_basic.test b/mysql-test/suite/sys_vars/t/wsrep_sst_receive_address_basic.test index 9e50cbf89..59f69c14d 100644 --- a/mysql-test/suite/sys_vars/t/wsrep_sst_receive_address_basic.test +++ b/mysql-test/suite/sys_vars/t/wsrep_sst_receive_address_basic.test @@ -27,10 +27,6 @@ SELECT @@global.wsrep_sst_receive_address; --echo --echo # invalid values ---error ER_WRONG_VALUE_FOR_VAR -SET @@global.wsrep_sst_receive_address='127.0.0.1:4444'; ---error ER_WRONG_VALUE_FOR_VAR -SET @@global.wsrep_sst_receive_address='127.0.0.1'; SELECT @@global.wsrep_sst_receive_address; --error ER_WRONG_VALUE_FOR_VAR SET @@global.wsrep_sst_receive_address=NULL; diff --git a/mysql-test/suite/unit/suite.pm b/mysql-test/suite/unit/suite.pm index 966fd278a..fa1da2ae4 100644 --- a/mysql-test/suite/unit/suite.pm +++ b/mysql-test/suite/unit/suite.pm @@ -40,7 +40,7 @@ sub start_test { return "Not run for embedded server" if $::opt_embedded_server; return "Not configured to run ctest" unless -f "../CTestTestfile.cmake"; my ($ctest_vs)= $opt_vs_config ? "--build-config $opt_vs_config" : ""; - my (@ctest_list)= `cd .. && ctest $opt_vs_config --show-only --verbose`; + my (@ctest_list)= `cd .. && ctest $opt_vs_config -E MTR -C default_ignore --show-only --verbose`; return "No ctest" if $?; my ($command, %tests); diff --git a/mysql-test/suite/wsrep/r/variables.result b/mysql-test/suite/wsrep/r/variables.result index 62d7f6244..4ecc1ca3b 100644 --- a/mysql-test/suite/wsrep/r/variables.result +++ b/mysql-test/suite/wsrep/r/variables.result @@ -207,6 +207,13 @@ Threads_connected 1 SHOW STATUS LIKE 'wsrep_thread_count'; Variable_name Value wsrep_thread_count 11 +set wsrep_on=0; +set wsrep_on=1; +create user test@localhost; +set auto_increment_increment=10; +set wsrep_on=0; +ERROR 42000: Access denied; you need (at least one of) the SUPER privilege(s) for this operation +drop user test@localhost; # # MDEV#6411: Setting set @@global.wsrep_sst_auth=NULL causes crash # diff --git a/mysql-test/suite/wsrep/t/variables.test b/mysql-test/suite/wsrep/t/variables.test index 1769f5678..1315f090d 100644 --- a/mysql-test/suite/wsrep/t/variables.test +++ b/mysql-test/suite/wsrep/t/variables.test @@ -118,6 +118,20 @@ sleep 3; SHOW STATUS LIKE 'threads_connected'; SHOW STATUS LIKE 'wsrep_thread_count'; +# +# privileges for wsrep_on +# +set wsrep_on=0; +set wsrep_on=1; +create user test@localhost; +connect con1,localhost,test; +set auto_increment_increment=10; +--error ER_SPECIFIC_ACCESS_DENIED_ERROR +set wsrep_on=0; +disconnect con1; +connection default; +drop user test@localhost; + --echo # --echo # MDEV#6411: Setting set @@global.wsrep_sst_auth=NULL causes crash --echo # diff --git a/mysql-test/t/alter_table.test b/mysql-test/t/alter_table.test index 5cb33516e..420f733af 100644 --- a/mysql-test/t/alter_table.test +++ b/mysql-test/t/alter_table.test @@ -1809,6 +1809,52 @@ ALTER TABLE t1 CONVERT TO CHARACTER SET utf8; SHOW CREATE TABLE t1; DROP TABLE t1; +--echo # +--echo # MDEV-15308 +--echo # Assertion `ha_alter_info->alter_info->drop_list.elements > 0' failed +--echo # in ha_innodb::prepare_inplace_alter_table +--echo # + +CREATE TABLE t1 (a INT, b INT) ENGINE=InnoDB; +ALTER TABLE t1 DROP FOREIGN KEY IF EXISTS fk, DROP COLUMN b; +SHOW CREATE TABLE t1; +DROP TABLE t1; + +CREATE TABLE t1 (a INT, b INT) ENGINE=InnoDB; +ALTER TABLE t1 DROP INDEX IF EXISTS fk, DROP COLUMN b; +SHOW CREATE TABLE t1; +DROP TABLE t1; + +CREATE TABLE t1 (a INT, b INT, c INT, KEY(c)) ENGINE=InnoDB; +ALTER TABLE t1 DROP FOREIGN KEY IF EXISTS fk, DROP COLUMN c; +SHOW CREATE TABLE t1; +DROP TABLE t1; + +CREATE TABLE t1 (a INT, b INT, c INT, KEY c1(c)) ENGINE=InnoDB; +ALTER TABLE t1 DROP FOREIGN KEY IF EXISTS fk, DROP INDEX c1; +SHOW CREATE TABLE t1; +DROP TABLE t1; + +CREATE TABLE t1 (a INT, b INT) ENGINE=InnoDB; +ALTER TABLE t1 DROP INDEX IF EXISTS fk, DROP COLUMN IF EXISTS c; +SHOW CREATE TABLE t1; +DROP TABLE t1; + +--echo # +--echo # MDEV-14668 ADD PRIMARY KEY IF NOT EXISTS on composite key +--echo # +CREATE TABLE t1 ( + `ID` BIGINT(20) NOT NULL, + `RANK` MEDIUMINT(4) NOT NULL, + `CHECK_POINT` BIGINT(20) NOT NULL, + UNIQUE INDEX `HORIZON_UIDX01` (`ID`, `RANK`) + ) ENGINE=InnoDB; + +ALTER TABLE t1 ADD PRIMARY KEY IF NOT EXISTS (`ID`, `CHECK_POINT`); +SHOW CREATE TABLE t1; +ALTER TABLE t1 ADD PRIMARY KEY IF NOT EXISTS (`ID`, `CHECK_POINT`); +DROP TABLE t1; + --echo # --echo # End of 10.0 tests --echo # diff --git a/mysql-test/t/assign_key_cache.test b/mysql-test/t/assign_key_cache.test new file mode 100644 index 000000000..401e7bf91 --- /dev/null +++ b/mysql-test/t/assign_key_cache.test @@ -0,0 +1,13 @@ +# +# MDEV-15216 Assertion `! is_set() || m_can_overwrite_status' failed in Diagnostics_area::set_error_status upon operation inside XA +# +--source include/have_partition.inc +set global my_cache.key_buffer_size = 1024*1024; +create table t1 (i int) engine=myisam partition by hash (i) partitions 2; +xa start 'xid'; +cache index t1 partition (non_existing_partition) in my_cache; +cache index t1 partition (p1) in my_cache; +xa end 'xid'; +xa rollback 'xid'; +drop table t1; +set global my_cache.key_buffer_size = 0; diff --git a/mysql-test/t/assign_key_cache-5405.test b/mysql-test/t/assign_key_cache_debug.test similarity index 100% rename from mysql-test/t/assign_key_cache-5405.test rename to mysql-test/t/assign_key_cache_debug.test diff --git a/mysql-test/t/connect.test b/mysql-test/t/connect.test index 20989e70e..c2d44c08e 100644 --- a/mysql-test/t/connect.test +++ b/mysql-test/t/connect.test @@ -143,9 +143,18 @@ GRANT USAGE ON *.* TO mysqltest_u1@localhost; --echo let $saved_max_connections = `SELECT @@global.max_connections`; -SET GLOBAL max_connections = 3; +SET GLOBAL max_connections = 10; SET GLOBAL event_scheduler = ON; +connect (tmp_con1,localhost,mysqltest_u1,,); +connect (tmp_con2,localhost,mysqltest_u1,,); +connect (tmp_con3,localhost,mysqltest_u1,,); +connect (tmp_con4,localhost,mysqltest_u1,,); +connect (tmp_con5,localhost,mysqltest_u1,,); +connect (tmp_con6,localhost,mysqltest_u1,,); +connect (tmp_con7,localhost,mysqltest_u1,,); +connection default; + --echo --echo # -- Waiting for Event Scheduler to start... let $wait_condition = @@ -230,6 +239,13 @@ let $wait_condition = --disconnect con_2 --disconnect con_3 --disconnect con_super_1 +--disconnect tmp_con1 +--disconnect tmp_con2 +--disconnect tmp_con3 +--disconnect tmp_con4 +--disconnect tmp_con5 +--disconnect tmp_con6 +--disconnect tmp_con7 --echo --echo # -- Restoring default connection... diff --git a/mysql-test/t/connect_debug.test b/mysql-test/t/connect_debug.test new file mode 100644 index 000000000..299b605b2 --- /dev/null +++ b/mysql-test/t/connect_debug.test @@ -0,0 +1,12 @@ +source include/have_debug.inc; +set @old_dbug=@@global.debug_dbug; + +# +# use after free if need plugin change and auth aborted +# +set global debug_dbug='+d,auth_disconnect'; +create user 'bad' identified by 'worse'; +--error 1 +--exec $MYSQL --default-auth=mysql_old_password --user=bad --password=worse +set global debug_dbug=@old_dbug; +drop user bad; diff --git a/mysql-test/t/create_or_replace.test b/mysql-test/t/create_or_replace.test index abf470b62..c1441d218 100644 --- a/mysql-test/t/create_or_replace.test +++ b/mysql-test/t/create_or_replace.test @@ -396,3 +396,28 @@ CREATE OR REPLACE TABLE t1 AS SELECT f1(); UNLOCK TABLES; DROP FUNCTION f1; DROP TABLE t1; + +--echo # +--echo # MDEV-11129 +--echo # CREATE OR REPLACE TABLE t1 AS SELECT spfunc() crashes if spfunc() +--echo # references t1 +--echo # + +CREATE OR REPLACE TABLE t1(a INT); +DELIMITER $$; +CREATE FUNCTION f1() RETURNS VARCHAR(16383) +BEGIN + INSERT INTO t1 VALUES(1); + RETURN 'test'; +END; +$$ +DELIMITER ;$$ +--error ER_UPDATE_TABLE_USED +CREATE OR REPLACE TABLE t1 AS SELECT f1(); +LOCK TABLE t1 WRITE; +--error ER_TABLE_NOT_LOCKED +CREATE OR REPLACE TABLE t1 AS SELECT f1(); +UNLOCK TABLES; + +DROP FUNCTION f1; +DROP TABLE t1; diff --git a/mysql-test/t/ctype_latin1.test b/mysql-test/t/ctype_latin1.test index 1ee48eed1..3455b0437 100644 --- a/mysql-test/t/ctype_latin1.test +++ b/mysql-test/t/ctype_latin1.test @@ -389,6 +389,15 @@ EXPLAIN EXTENDED SELECT * FROM t1 WHERE COALESCE(c,0)='3 ' AND COALESCE(d,0)=COALESCE(c,0); DROP TABLE t1; +--echo # +--echo # MDEV-15005 ASAN: stack-buffer-overflow in my_strnncollsp_simple +--echo # + +SET NAMES latin1; +SELECT CONVERT(1, CHAR) IN ('100', 10, '101'); +SELECT CONVERT(1, CHAR) IN ('100', 10, '1'); +SELECT CONVERT(1, CHAR) IN ('100', '10', '1'); + --echo # --echo # End of 10.1 tests --echo # diff --git a/mysql-test/t/ctype_ucs.test b/mysql-test/t/ctype_ucs.test index e21cd1f00..0055a2f20 100644 --- a/mysql-test/t/ctype_ucs.test +++ b/mysql-test/t/ctype_ucs.test @@ -848,6 +848,28 @@ DESCRIBE t1; DROP TABLE t1; +--echo # +--echo # MDEV-15624 Changing the default character set to utf8mb4 changes query evaluation in a very surprising way +--echo # + +SET NAMES utf8; +CREATE TABLE t1 (id INT); +INSERT INTO t1 VALUES (1),(2),(3); + +SELECT COUNT(DISTINCT c) FROM (SELECT id, REPLACE(uuid_short(), '0', CAST('o' AS CHAR CHARACTER SET ucs2)) AS c FROM t1) AS d1; +--replace_column 1 xxxxxxxxxxxxxxxxx +SELECT DISTINCT REPLACE(uuid_short(), '0', CAST('o' AS CHAR CHARACTER SET ucs2)) AS c FROM t1; + +SELECT COUNT(DISTINCT c) FROM (SELECT id, INSERT(uuid_short(), 1, 1, CAST('0' AS CHAR CHARACTER SET ucs2)) AS c FROM t1) AS d1; +--replace_column 1 xxxxxxxxxxxxxxxxx +SELECT DISTINCT INSERT(uuid_short(), 1, 1, CAST('0' AS CHAR CHARACTER SET ucs2)) AS c FROM t1; + +SELECT COUNT(DISTINCT c) FROM (SELECT id, CONCAT(uuid_short(), CAST('0' AS CHAR CHARACTER SET ucs2)) AS c FROM t1) AS d1; +--replace_column 1 xxxxxxxxxxxxxxxxx +SELECT DISTINCT CONCAT(uuid_short(), CAST('0' AS CHAR CHARACTER SET ucs2)) AS c FROM t1; +DROP TABLE t1; + + --echo # --echo # End of 5.5 tests --echo # diff --git a/mysql-test/t/ctype_utf8.test b/mysql-test/t/ctype_utf8.test index e013109d0..be17eb461 100644 --- a/mysql-test/t/ctype_utf8.test +++ b/mysql-test/t/ctype_utf8.test @@ -2024,6 +2024,16 @@ SELECT CONVERT(_utf8 0xC499 USING latin1); SELECT CAST(_utf8 0xC499 AS CHAR CHARACTER SET latin1); +--echo # +--echo # MDEV-15005 ASAN: stack-buffer-overflow in my_strnncollsp_simple +--echo # + +SET NAMES utf8; +SELECT CONVERT(1, CHAR) IN ('100', 10, '101'); +SELECT CONVERT(1, CHAR) IN ('100', 10, '1'); +SELECT CONVERT(1, CHAR) IN ('100', '10', '1'); + + --echo # --echo # End of 10.1 tests --echo # diff --git a/mysql-test/t/ctype_utf8mb4.test b/mysql-test/t/ctype_utf8mb4.test index 77ace1952..af4c16909 100644 --- a/mysql-test/t/ctype_utf8mb4.test +++ b/mysql-test/t/ctype_utf8mb4.test @@ -1841,6 +1841,25 @@ SELECT LENGTH(data) AS len FROM (SELECT REPEAT('☃', 21846) AS data ) AS sub; SELECT LENGTH(data) AS len FROM (SELECT REPEAT('☃', 65535) AS data ) AS sub; SELECT LENGTH(data) AS len FROM (SELECT REPEAT('☃', 65536) AS data ) AS sub; +--echo # +--echo # MDEV-15624 Changing the default character set to utf8mb4 changes query evaluation in a very surprising way +--echo # + +SET NAMES utf8mb4; +CREATE TABLE t1 (id INT); +INSERT INTO t1 VALUES (1),(2),(3); + +SELECT COUNT(DISTINCT c) FROM (SELECT id, REPLACE(UUID(), "-", "") AS c FROM t1) AS d1; +--replace_column 1 xxxxxxxxxxxxx-xxxx-xxxx-xxxxxxxxxxxx +SELECT DISTINCT INSERT(uuid(), 9, 1, "X") AS c FROM t1; + +SELECT COUNT(DISTINCT c) FROM (SELECT id, INSERT(UUID(), 9, 1, "X") AS c FROM t1) AS d1; +--replace_column 1 xxxxxxxxxxxxx-xxxx-xxxx-xxxxxxxxxxxx +SELECT DISTINCT INSERT(UUID(), 9, 1, "X") AS c FROM t1; + +DROP TABLE t1; + + --echo # --echo # End of 5.5 tests --echo # diff --git a/mysql-test/t/dyncol.test b/mysql-test/t/dyncol.test index 2c93f75cb..7807d1a9f 100644 --- a/mysql-test/t/dyncol.test +++ b/mysql-test/t/dyncol.test @@ -928,6 +928,15 @@ SELECT COLUMN_JSON(COLUMN_CREATE('a',1 AS DECIMAL,'b',1 AS DECIMAL)); SELECT COLUMN_JSON(COLUMN_CREATE('test','"\\\t\n\Z')) AS json; SELECT COLUMN_JSON(COLUMN_CREATE('test','First line\nSecond line')) AS json; +--echo # +--echo # MDEV-15230: column_json breaks cyrillic in 10.1.31 +--echo # +set names utf8; +create table t1 (b blob); +insert into t1 values (column_create('description',column_create('title','ОпиÑание'))); +select column_json(b) from t1; +drop table t1; + --echo # --echo # end of 10.0 tests --echo # diff --git a/mysql-test/t/fast_prefix_index_fetch_innodb.test b/mysql-test/t/fast_prefix_index_fetch_innodb.test index e563e65ec..c3b3440d8 100644 --- a/mysql-test/t/fast_prefix_index_fetch_innodb.test +++ b/mysql-test/t/fast_prefix_index_fetch_innodb.test @@ -31,120 +31,638 @@ select * from prefixinno; let $show_count_statement = show status like 'innodb_secondary_index_triggered_cluster_reads'; let $show_opt_statement = show status like 'innodb_secondary_index_triggered_cluster_reads_avoided'; ---disable_query_log - --echo # Baseline sanity check: 0, 0. ---let $base_count = query_get_value($show_count_statement, Value, 1) ---let $base_opt = query_get_value($show_opt_statement, Value, 1) +let $base_count = query_get_value($show_count_statement, Value, 1); +let $base_opt = query_get_value($show_opt_statement, Value, 1); + select "no-op query"; ---let $count = query_get_value($show_count_statement, Value, 1) + +let $count = query_get_value($show_count_statement, Value, 1); +let $opt = query_get_value($show_opt_statement, Value, 1); + +--disable_query_log eval select $count - $base_count into @cluster_lookups; -select @cluster_lookups = 0 as cluster_lookups_matched; ---let $opt = query_get_value($show_opt_statement, Value, 1) -eval select $opt - $base_opt into @cluster_lookups; -select @cluster_lookups = 0 as cluster_lookups_avoided_matched; +eval select $opt - $base_opt into @cluster_lookups_avoided; +--enable_query_log + +select @cluster_lookups; +select @cluster_lookups_avoided; --echo # Eligible for optimization. ---let $base_count = query_get_value($show_count_statement, Value, 1) ---let $base_opt = query_get_value($show_opt_statement, Value, 1) +let $base_count = query_get_value($show_count_statement, Value, 1); +let $base_opt = query_get_value($show_opt_statement, Value, 1); + select id, bigfield from prefixinno where bigfield = repeat('d', 31); ---let $count = query_get_value($show_count_statement, Value, 1) + +let $count = query_get_value($show_count_statement, Value, 1); +let $opt = query_get_value($show_opt_statement, Value, 1); + +--disable_query_log eval select $count - $base_count into @cluster_lookups; -select @cluster_lookups = 0 as cluster_lookups_matched; ---let $opt = query_get_value($show_opt_statement, Value, 1) -eval select $opt - $base_opt into @cluster_lookups; -select @cluster_lookups = 1 as cluster_lookups_avoided_matched; +eval select $opt - $base_opt into @cluster_lookups_avoided; +--enable_query_log + +select @cluster_lookups; +select @cluster_lookups_avoided; --echo # Eligible for optimization, access via fake_id only. ---let $base_count = query_get_value($show_count_statement, Value, 1) ---let $base_opt = query_get_value($show_opt_statement, Value, 1) +let $base_count = query_get_value($show_count_statement, Value, 1); +let $base_opt = query_get_value($show_opt_statement, Value, 1); + select id, bigfield from prefixinno where fake_id = 1031; ---let $count = query_get_value($show_count_statement, Value, 1) + +let $count = query_get_value($show_count_statement, Value, 1); +let $opt = query_get_value($show_opt_statement, Value, 1); + +--disable_query_log eval select $count - $base_count into @cluster_lookups; -select @cluster_lookups = 0 as cluster_lookups_matched; ---let $opt = query_get_value($show_opt_statement, Value, 1) -eval select $opt - $base_opt into @cluster_lookups; -select @cluster_lookups = 1 as cluster_lookups_avoided_matched; +eval select $opt - $base_opt into @cluster_lookups_avoided; +--enable_query_log + +select @cluster_lookups; +select @cluster_lookups_avoided; --echo # Not eligible for optimization, access via fake_id of big row. ---let $base_count = query_get_value($show_count_statement, Value, 1) ---let $base_opt = query_get_value($show_opt_statement, Value, 1) +let $base_count = query_get_value($show_count_statement, Value, 1); +let $base_opt = query_get_value($show_opt_statement, Value, 1); + select id, bigfield from prefixinno where fake_id = 1033; ---let $count = query_get_value($show_count_statement, Value, 1) + +let $count = query_get_value($show_count_statement, Value, 1); +let $opt = query_get_value($show_opt_statement, Value, 1); + +--disable_query_log eval select $count - $base_count into @cluster_lookups; -select @cluster_lookups = 1 as cluster_lookups_matched; ---let $opt = query_get_value($show_opt_statement, Value, 1) -eval select $opt - $base_opt into @cluster_lookups; -select @cluster_lookups = 0 as cluster_lookups_avoided_matched; +eval select $opt - $base_opt into @cluster_lookups_avoided; +--enable_query_log + +select @cluster_lookups; +select @cluster_lookups_avoided; --echo # Not eligible for optimization. ---let $base_count = query_get_value($show_count_statement, Value, 1) ---let $base_opt = query_get_value($show_opt_statement, Value, 1) +let $base_count = query_get_value($show_count_statement, Value, 1); +let $base_opt = query_get_value($show_opt_statement, Value, 1); + select id, bigfield from prefixinno where bigfield = repeat('x', 32); ---let $count = query_get_value($show_count_statement, Value, 1) + +let $count = query_get_value($show_count_statement, Value, 1); +let $opt = query_get_value($show_opt_statement, Value, 1); + +--disable_query_log eval select $count - $base_count into @cluster_lookups; -select @cluster_lookups = 1 as cluster_lookups_matched; ---let $opt = query_get_value($show_opt_statement, Value, 1) -eval select $opt - $base_opt into @cluster_lookups; -select @cluster_lookups = 0 as cluster_lookups_avoided_matched; +eval select $opt - $base_opt into @cluster_lookups_avoided; +--enable_query_log + +select @cluster_lookups; +select @cluster_lookups_avoided; --echo # Not eligible for optimization. ---let $base_count = query_get_value($show_count_statement, Value, 1) ---let $base_opt = query_get_value($show_opt_statement, Value, 1) +let $base_count = query_get_value($show_count_statement, Value, 1); +let $base_opt = query_get_value($show_opt_statement, Value, 1); + select id, bigfield from prefixinno where bigfield = repeat('y', 33); ---let $count = query_get_value($show_count_statement, Value, 1) + +let $count = query_get_value($show_count_statement, Value, 1); +let $opt = query_get_value($show_opt_statement, Value, 1); + +--disable_query_log eval select $count - $base_count into @cluster_lookups; -select @cluster_lookups = 1 as cluster_lookups_matched; ---let $opt = query_get_value($show_opt_statement, Value, 1) -eval select $opt - $base_opt into @cluster_lookups; -select @cluster_lookups = 0 as cluster_lookups_avoided_matched; +eval select $opt - $base_opt into @cluster_lookups_avoided; +--enable_query_log + +select @cluster_lookups; +select @cluster_lookups_avoided; --echo # Eligible, should not increment lookup counter. ---let $base_count = query_get_value($show_count_statement, Value, 1) ---let $base_opt = query_get_value($show_opt_statement, Value, 1) +let $base_count = query_get_value($show_count_statement, Value, 1); +let $base_opt = query_get_value($show_opt_statement, Value, 1); + select id, bigfield from prefixinno where bigfield = repeat('b', 8); ---let $count = query_get_value($show_count_statement, Value, 1) + +let $count = query_get_value($show_count_statement, Value, 1); +let $opt = query_get_value($show_opt_statement, Value, 1); + +--disable_query_log eval select $count - $base_count into @cluster_lookups; -select @cluster_lookups = 0 as cluster_lookups_matched; ---let $opt = query_get_value($show_opt_statement, Value, 1) -eval select $opt - $base_opt into @cluster_lookups; -select @cluster_lookups = 1 as cluster_lookups_avoided_matched; +eval select $opt - $base_opt into @cluster_lookups_avoided; +--enable_query_log + +select @cluster_lookups; +select @cluster_lookups_avoided; --echo # Eligible, should not increment lookup counter. ---let $base_count = query_get_value($show_count_statement, Value, 1) ---let $base_opt = query_get_value($show_opt_statement, Value, 1) +let $base_count = query_get_value($show_count_statement, Value, 1); +let $base_opt = query_get_value($show_opt_statement, Value, 1); + select id, bigfield from prefixinno where bigfield = repeat('c', 24); ---let $count = query_get_value($show_count_statement, Value, 1) + +let $count = query_get_value($show_count_statement, Value, 1); +let $opt = query_get_value($show_opt_statement, Value, 1); + +--disable_query_log eval select $count - $base_count into @cluster_lookups; -select @cluster_lookups = 0 as cluster_lookups_matched; ---let $opt = query_get_value($show_opt_statement, Value, 1) -eval select $opt - $base_opt into @cluster_lookups; -select @cluster_lookups = 1 as cluster_lookups_avoided_matched; +eval select $opt - $base_opt into @cluster_lookups_avoided; +--enable_query_log + +select @cluster_lookups; +select @cluster_lookups_avoided; --echo # Should increment lookup counter. ---let $base_count = query_get_value($show_count_statement, Value, 1) ---let $base_opt = query_get_value($show_opt_statement, Value, 1) +let $base_count = query_get_value($show_count_statement, Value, 1); +let $base_opt = query_get_value($show_opt_statement, Value, 1); + select id, bigfield from prefixinno where bigfield = repeat('z', 128); ---let $count = query_get_value($show_count_statement, Value, 1) + +let $count = query_get_value($show_count_statement, Value, 1); +let $opt = query_get_value($show_opt_statement, Value, 1); + +--disable_query_log eval select $count - $base_count into @cluster_lookups; -select @cluster_lookups = 1 as cluster_lookups_matched; ---let $opt = query_get_value($show_opt_statement, Value, 1) -eval select $opt - $base_opt into @cluster_lookups; -select @cluster_lookups = 0 as cluster_lookups_avoided_matched; +eval select $opt - $base_opt into @cluster_lookups_avoided; +--enable_query_log + +select @cluster_lookups; +select @cluster_lookups_avoided; --echo # Disable optimization, confirm we still increment counter. ---let $base_count = query_get_value($show_count_statement, Value, 1) ---let $base_opt = query_get_value($show_opt_statement, Value, 1) +let $base_count = query_get_value($show_count_statement, Value, 1); +let $base_opt = query_get_value($show_opt_statement, Value, 1); + set global innodb_prefix_index_cluster_optimization = OFF; select id, bigfield from prefixinno where fake_id = 1033; ---let $count = query_get_value($show_count_statement, Value, 1) + +let $count = query_get_value($show_count_statement, Value, 1); +let $opt = query_get_value($show_opt_statement, Value, 1); + +--disable_query_log eval select $count - $base_count into @cluster_lookups; -select @cluster_lookups = 1 as cluster_lookups_matched; ---let $opt = query_get_value($show_opt_statement, Value, 1) -eval select $opt - $base_opt into @cluster_lookups; -select @cluster_lookups = 0 as cluster_lookups_avoided_matched; +eval select $opt - $base_opt into @cluster_lookups_avoided; +--enable_query_log +select @cluster_lookups; +select @cluster_lookups_avoided; ---echo # make test suite happy by cleaning up our mess drop table prefixinno; + +--echo # Multi-byte handling case + +set global innodb_prefix_index_cluster_optimization = ON; +SET NAMES utf8mb4; +CREATE TABLE t1( + f1 varchar(10) CHARACTER SET UTF8MB4 COLLATE UTF8MB4_BIN, + INDEX (f1(3)))ENGINE=INNODB; + +INSERT INTO t1 VALUES('a'), ('cccc'), ('až'), ('cÄc'), ('ggáµ·g'), ('¢¢'); +INSERT INTO t1 VALUES('தமிழà¯'), ('ðŸ±ðŸŒ‘'), ('🌒'), ('🌑'); +INSERT INTO t1 VALUES('😊me'), ('eu€'), ('ls¢'); + +--echo # Eligible - record length is shorter than prefix +let $base_count = query_get_value($show_count_statement, Value, 1); +let $base_opt = query_get_value($show_opt_statement, Value, 1); + +SELECT f1 FROM t1 FORCE INDEX (`f1`) WHERE f1 = 'a'; + +let $count = query_get_value($show_count_statement, Value, 1); +let $opt = query_get_value($show_opt_statement, Value, 1); + +--disable_query_log +eval set @cluster_lookups = $count - $base_count; +eval set @cluster_lookups_avoided = $opt - $base_opt; +--enable_query_log + +select @cluster_lookups; +select @cluster_lookups_avoided; + +--echo # Not eligible - record length longer than prefix length +let $base_count = query_get_value($show_count_statement, Value, 1); +let $base_opt = query_get_value($show_opt_statement, Value, 1); + +SELECT f1 FROM t1 FORCE INDEX (`f1`) WHERE f1 like 'c%'; + +let $count = query_get_value($show_count_statement, Value, 1); +let $opt = query_get_value($show_opt_statement, Value, 1); + +--disable_query_log +eval set @cluster_lookups = $count - $base_count; +eval set @cluster_lookups_avoided = $opt - $base_opt; +--enable_query_log + +select @cluster_lookups; +select @cluster_lookups_avoided; + +--echo # Eligible - record length shorter than prefix length +let $base_count = query_get_value($show_count_statement, Value, 1); +let $base_opt = query_get_value($show_opt_statement, Value, 1); + +SELECT f1 FROM t1 FORCE INDEX (`f1`) WHERE f1 = 'až'; + +let $count = query_get_value($show_count_statement, Value, 1); +let $opt = query_get_value($show_opt_statement, Value, 1); + +--disable_query_log +eval set @cluster_lookups = $count - $base_count; +eval set @cluster_lookups_avoided = $opt - $base_opt; +--enable_query_log + +select @cluster_lookups; +select @cluster_lookups_avoided; + +--echo # Not eligible - record length longer than prefix length + +let $base_count = query_get_value($show_count_statement, Value, 1); +let $base_opt = query_get_value($show_opt_statement, Value, 1); + +SELECT f1 FROM t1 FORCE INDEX (`f1`) WHERE f1 = 'தமிழà¯'; + +let $count = query_get_value($show_count_statement, Value, 1); +let $opt = query_get_value($show_opt_statement, Value, 1); + +--disable_query_log +eval set @cluster_lookups = $count - $base_count; +eval set @cluster_lookups_avoided = $opt - $base_opt; +--enable_query_log + +select @cluster_lookups; +select @cluster_lookups_avoided; + +--echo # Not eligible - record length longer than prefix length + +let $base_count = query_get_value($show_count_statement, Value, 1); +let $base_opt = query_get_value($show_opt_statement, Value, 1); + +SELECT f1 FROM t1 FORCE INDEX (`f1`) WHERE f1 like 'ggáµ·%'; + +let $count = query_get_value($show_count_statement, Value, 1); +let $opt = query_get_value($show_opt_statement, Value, 1); + +--disable_query_log +eval set @cluster_lookups = $count - $base_count; +eval set @cluster_lookups_avoided = $opt - $base_opt; +--enable_query_log + +select @cluster_lookups; +select @cluster_lookups_avoided; + +--echo # Not eligible - record length longer than prefix length + +let $base_count = query_get_value($show_count_statement, Value, 1); +let $base_opt = query_get_value($show_opt_statement, Value, 1); + +SELECT f1 FROM t1 FORCE INDEX (`f1`) WHERE f1 like '😊%'; + +let $count = query_get_value($show_count_statement, Value, 1); +let $opt = query_get_value($show_opt_statement, Value, 1); + +--disable_query_log +eval set @cluster_lookups = $count - $base_count; +eval set @cluster_lookups_avoided = $opt - $base_opt; +--enable_query_log + +select @cluster_lookups; +select @cluster_lookups_avoided; + +--echo # Not eligible - record length longer than prefix length + +let $base_count = query_get_value($show_count_statement, Value, 1); +let $base_opt = query_get_value($show_opt_statement, Value, 1); + +SELECT f1 FROM t1 FORCE INDEX (`f1`) WHERE f1 = 'ls¢'; + +let $count = query_get_value($show_count_statement, Value, 1); +let $opt = query_get_value($show_opt_statement, Value, 1); + +--disable_query_log +eval set @cluster_lookups = $count - $base_count; +eval set @cluster_lookups_avoided = $opt - $base_opt; +--enable_query_log + +select @cluster_lookups; +select @cluster_lookups_avoided; + +--echo # Eligible - record length shorter than prefix length + +let $base_count = query_get_value($show_count_statement, Value, 1); +let $base_opt = query_get_value($show_opt_statement, Value, 1); + +SELECT f1 FROM t1 FORCE INDEX (`f1`) WHERE f1 like '¢¢%'; + +let $count = query_get_value($show_count_statement, Value, 1); +let $opt = query_get_value($show_opt_statement, Value, 1); + +--disable_query_log +eval set @cluster_lookups = $count - $base_count; +eval set @cluster_lookups_avoided = $opt - $base_opt; +--enable_query_log + +select @cluster_lookups; +select @cluster_lookups_avoided; + +--echo # Eligible - record length shorter than prefix length + +let $base_count = query_get_value($show_count_statement, Value, 1); +let $base_opt = query_get_value($show_opt_statement, Value, 1); + +SELECT f1 FROM t1 FORCE INDEX (`f1`) WHERE f1 like 'ðŸ±ðŸŒ‘%'; + +let $count = query_get_value($show_count_statement, Value, 1); +let $opt = query_get_value($show_opt_statement, Value, 1); + +--disable_query_log +eval set @cluster_lookups = $count - $base_count; +eval set @cluster_lookups_avoided = $opt - $base_opt; +--enable_query_log + +select @cluster_lookups; +select @cluster_lookups_avoided; + +--echo # Not eligible - record length longer than prefix length + +let $base_count = query_get_value($show_count_statement, Value, 1); +let $base_opt = query_get_value($show_opt_statement, Value, 1); + +SELECT f1 FROM t1 FORCE INDEX (`f1`) WHERE f1 like '🌑%'; + +let $count = query_get_value($show_count_statement, Value, 1); +let $opt = query_get_value($show_opt_statement, Value, 1); + +--disable_query_log +eval set @cluster_lookups = $count - $base_count; +eval set @cluster_lookups_avoided = $opt - $base_opt; +--enable_query_log + +select @cluster_lookups; +select @cluster_lookups_avoided; + +--echo # Not eligible - record length longer than prefix length + +let $base_count = query_get_value($show_count_statement, Value, 1); +let $base_opt = query_get_value($show_opt_statement, Value, 1); + +SELECT f1 FROM t1 FORCE INDEX (`f1`) WHERE f1 like '🌒%'; + +let $count = query_get_value($show_count_statement, Value, 1); +let $opt = query_get_value($show_opt_statement, Value, 1); + +--disable_query_log +eval set @cluster_lookups = $count - $base_count; +eval set @cluster_lookups_avoided = $opt - $base_opt; +--enable_query_log + +select @cluster_lookups; +select @cluster_lookups_avoided; + +DROP TABLE t1; + +--echo # Multi-byte with minimum character length > 1 bytes + +CREATE TABLE t1( + f1 varchar(10) CHARACTER SET UTF16 COLLATE UTF16_BIN, + INDEX (f1(3)))ENGINE=INNODB; + +INSERT INTO t1 VALUES('a'), ('cccc'), ('až'), ('cÄc'), ('ggáµ·g'), ('¢¢'); +INSERT INTO t1 VALUES('தமிழà¯'), ('ðŸ±ðŸŒ‘'), ('🌒'), ('🌑'); +INSERT INTO t1 VALUES('😊me'), ('eu€'), ('ls¢'); + +--echo # Eligible - record length is shorter than prefix +let $base_count = query_get_value($show_count_statement, Value, 1); +let $base_opt = query_get_value($show_opt_statement, Value, 1); + +SELECT f1 FROM t1 FORCE INDEX (`f1`) WHERE f1 = 'a'; + +let $count = query_get_value($show_count_statement, Value, 1); +let $opt = query_get_value($show_opt_statement, Value, 1); + +--disable_query_log +eval set @cluster_lookups = $count - $base_count; +eval set @cluster_lookups_avoided = $opt - $base_opt; +--enable_query_log + +select @cluster_lookups; +select @cluster_lookups_avoided; + +--echo # Not eligible - record length longer than prefix length +let $base_count = query_get_value($show_count_statement, Value, 1); +let $base_opt = query_get_value($show_opt_statement, Value, 1); + +SELECT f1 FROM t1 FORCE INDEX (`f1`) WHERE f1 like 'c%'; + +let $count = query_get_value($show_count_statement, Value, 1); +let $opt = query_get_value($show_opt_statement, Value, 1); + +--disable_query_log +eval set @cluster_lookups = $count - $base_count; +eval set @cluster_lookups_avoided = $opt - $base_opt; +--enable_query_log + +select @cluster_lookups; +select @cluster_lookups_avoided; + +--echo # Eligible - record length shorter than prefix length + +let $base_count = query_get_value($show_count_statement, Value, 1); +let $base_opt = query_get_value($show_opt_statement, Value, 1); + +SELECT f1 FROM t1 FORCE INDEX (`f1`) WHERE f1 = 'až'; + +let $count = query_get_value($show_count_statement, Value, 1); +let $opt = query_get_value($show_opt_statement, Value, 1); + +--disable_query_log +eval set @cluster_lookups = $count - $base_count; +eval set @cluster_lookups_avoided = $opt - $base_opt; +--enable_query_log + +select @cluster_lookups; +select @cluster_lookups_avoided; + +--echo # Not eligible - record length longer than prefix length + +let $base_count = query_get_value($show_count_statement, Value, 1); +let $base_opt = query_get_value($show_opt_statement, Value, 1); + +SELECT f1 FROM t1 FORCE INDEX (`f1`) WHERE f1 = 'தமிழà¯'; + +let $count = query_get_value($show_count_statement, Value, 1); +let $opt = query_get_value($show_opt_statement, Value, 1); + +--disable_query_log +eval set @cluster_lookups = $count - $base_count; +eval set @cluster_lookups_avoided = $opt - $base_opt; +--enable_query_log + +select @cluster_lookups; +select @cluster_lookups_avoided; + +--echo # Not eligible - record length longer than prefix length + +let $base_count = query_get_value($show_count_statement, Value, 1); +let $base_opt = query_get_value($show_opt_statement, Value, 1); + +SELECT f1 FROM t1 FORCE INDEX (`f1`) WHERE f1 like 'ggáµ·%'; + +let $count = query_get_value($show_count_statement, Value, 1); +let $opt = query_get_value($show_opt_statement, Value, 1); + +--disable_query_log +eval set @cluster_lookups = $count - $base_count; +eval set @cluster_lookups_avoided = $opt - $base_opt; +--enable_query_log + +select @cluster_lookups; +select @cluster_lookups_avoided; + +--echo # Not eligible - record length longer than prefix length + +let $base_count = query_get_value($show_count_statement, Value, 1); +let $base_opt = query_get_value($show_opt_statement, Value, 1); + +SELECT f1 FROM t1 FORCE INDEX (`f1`) WHERE f1 like '😊%'; + +let $count = query_get_value($show_count_statement, Value, 1); +let $opt = query_get_value($show_opt_statement, Value, 1); + +--disable_query_log +eval set @cluster_lookups = $count - $base_count; +eval set @cluster_lookups_avoided = $opt - $base_opt; +--enable_query_log + +select @cluster_lookups; +select @cluster_lookups_avoided; + +--echo # Not eligible - record length longer than prefix length + +let $base_count = query_get_value($show_count_statement, Value, 1); +let $base_opt = query_get_value($show_opt_statement, Value, 1); + +SELECT f1 FROM t1 FORCE INDEX (`f1`) WHERE f1 = 'ls¢'; + +let $count = query_get_value($show_count_statement, Value, 1); +let $opt = query_get_value($show_opt_statement, Value, 1); + +--disable_query_log +eval set @cluster_lookups = $count - $base_count; +eval set @cluster_lookups_avoided = $opt - $base_opt; +--enable_query_log + +select @cluster_lookups; +select @cluster_lookups_avoided; + +--echo # Eligible - record length shorter than prefix length + +let $base_count = query_get_value($show_count_statement, Value, 1); +let $base_opt = query_get_value($show_opt_statement, Value, 1); + +SELECT f1 FROM t1 FORCE INDEX(`f1`) WHERE f1 like '¢¢%'; + +let $count = query_get_value($show_count_statement, Value, 1); +let $opt = query_get_value($show_opt_statement, Value, 1); + +--disable_query_log +eval set @cluster_lookups = $count - $base_count; +eval set @cluster_lookups_avoided = $opt - $base_opt; +--enable_query_log + +select @cluster_lookups; +select @cluster_lookups_avoided; + +--echo # Eligible - record length shorter than prefix length + +let $base_count = query_get_value($show_count_statement, Value, 1); +let $base_opt = query_get_value($show_opt_statement, Value, 1); + +SELECT f1 FROM t1 FORCE INDEX (`f1`) WHERE f1 like 'ðŸ±ðŸŒ‘%'; + +let $count = query_get_value($show_count_statement, Value, 1); +let $opt = query_get_value($show_opt_statement, Value, 1); + +--disable_query_log +eval set @cluster_lookups = $count - $base_count; +eval set @cluster_lookups_avoided = $opt - $base_opt; +--enable_query_log + +select @cluster_lookups; +select @cluster_lookups_avoided; + +--echo # Eligible - record length is shorter than prefix length + +let $base_count = query_get_value($show_count_statement, Value, 1); +let $base_opt = query_get_value($show_opt_statement, Value, 1); + +SELECT f1 FROM t1 FORCE INDEX (`f1`) WHERE f1 like '🌑%'; + +let $count = query_get_value($show_count_statement, Value, 1); +let $opt = query_get_value($show_opt_statement, Value, 1); + +--disable_query_log +eval set @cluster_lookups = $count - $base_count; +eval set @cluster_lookups_avoided = $opt - $base_opt; +--enable_query_log + +select @cluster_lookups; +select @cluster_lookups_avoided; + +--echo # Eligible - record length is shorter than prefix length + +let $base_count = query_get_value($show_count_statement, Value, 1); +let $base_opt = query_get_value($show_opt_statement, Value, 1); + +SELECT f1 FROM t1 FORCE INDEX (`f1`) WHERE f1 like '🌒%'; + +let $count = query_get_value($show_count_statement, Value, 1); +let $opt = query_get_value($show_opt_statement, Value, 1); + +--disable_query_log +eval set @cluster_lookups = $count - $base_count; +eval set @cluster_lookups_avoided = $opt - $base_opt; +--enable_query_log + +select @cluster_lookups; +select @cluster_lookups_avoided; + +DROP TABLE t1; + +CREATE TABLE t1( + col1 INT, + col2 BLOB DEFAULT NULL, + INDEX `idx1`(col2(4), col1))ENGINE=INNODB; +INSERT INTO t1 VALUES (2, 'test'), (3, repeat('test1', 2000)); +INSERT INTO t1(col1) VALUES(1); + +--echo # Eligible - record length is shorter than prefix length + +let $base_count = query_get_value($show_count_statement, Value, 1); +let $base_opt = query_get_value($show_opt_statement, Value, 1); + +SELECT col1 FROM t1 FORCE INDEX (`idx1`) WHERE col2 is NULL; + +let $count = query_get_value($show_count_statement, Value, 1); +let $opt = query_get_value($show_opt_statement, Value, 1); + +--disable_query_log +eval set @cluster_lookups = $count - $base_count; +eval set @cluster_lookups_avoided = $opt - $base_opt; +--enable_query_log + +select @cluster_lookups; +select @cluster_lookups_avoided; + +--echo # Not eligible - record length longer than prefix index + +let $base_count = query_get_value($show_count_statement, Value, 1); +let $base_opt = query_get_value($show_opt_statement, Value, 1); + +SELECT col1 FROM t1 FORCE INDEX (`idx1`) WHERE col2 like 'test1%'; + +let $count = query_get_value($show_count_statement, Value, 1); +let $opt = query_get_value($show_opt_statement, Value, 1); + +--disable_query_log +eval set @cluster_lookups = $count - $base_count; +eval set @cluster_lookups_avoided = $opt - $base_opt; +--enable_query_log + +select @cluster_lookups; +select @cluster_lookups_avoided; + +DROP TABLE t1; set global innodb_prefix_index_cluster_optimization = OFF; diff --git a/mysql-test/t/func_date_add.test b/mysql-test/t/func_date_add.test index 5f2797834..e7e2b96f0 100644 --- a/mysql-test/t/func_date_add.test +++ b/mysql-test/t/func_date_add.test @@ -100,3 +100,40 @@ drop table t1; --echo End of 5.5 tests +--echo # +--echo # Start of 10.1 tests +--echo # + +--echo # +--echo # MDEV-14452 Precision in INTERVAL xxx DAY_MICROSECOND parsed wrong? +--echo # + +--vertical_results +SELECT + DATE_ADD('1000-01-01 00:00:00', INTERVAL '0 00:00:01.5' DAY_MICROSECOND) c1, + DATE_ADD('1000-01-01 00:00:00', INTERVAL '0 00:00:01.50' DAY_MICROSECOND) c2, + DATE_ADD('1000-01-01 00:00:00', INTERVAL '0 00:00:01.500' DAY_MICROSECOND) c3, + DATE_ADD('1000-01-01 00:00:00', INTERVAL '0 00:00:01.5000' DAY_MICROSECOND) c4, + DATE_ADD('1000-01-01 00:00:00', INTERVAL '0 00:00:01.50000' DAY_MICROSECOND) c5, + DATE_ADD('1000-01-01 00:00:00', INTERVAL '0 00:00:01.500000' DAY_MICROSECOND) c6, + DATE_ADD('1000-01-01 00:00:00', INTERVAL '0 00:00:01.5000000' DAY_MICROSECOND) c7, + DATE_ADD('1000-01-01 00:00:00', INTERVAL '0 00:00:01.50000000' DAY_MICROSECOND) c8, + DATE_ADD('1000-01-01 00:00:00', INTERVAL '0 00:00:01.500000000' DAY_MICROSECOND) c9, + DATE_ADD('1000-01-01 00:00:00', INTERVAL '0 00:00:01.5000000000' DAY_MICROSECOND) c10, + DATE_ADD('1000-01-01 00:00:00', INTERVAL '0 00:00:01.50000000000' DAY_MICROSECOND) c11, + DATE_ADD('1000-01-01 00:00:00', INTERVAL '0 00:00:01.500000000000' DAY_MICROSECOND) c12, + DATE_ADD('1000-01-01 00:00:00', INTERVAL '0 00:00:01.5000000000000' DAY_MICROSECOND) c13, + DATE_ADD('1000-01-01 00:00:00', INTERVAL '0 00:00:01.50000000000000' DAY_MICROSECOND) c14, + DATE_ADD('1000-01-01 00:00:00', INTERVAL '0 00:00:01.500000000000000' DAY_MICROSECOND) c15, + DATE_ADD('1000-01-01 00:00:00', INTERVAL '0 00:00:01.5000000000000000' DAY_MICROSECOND) c16, + DATE_ADD('1000-01-01 00:00:00', INTERVAL '0 00:00:01.50000000000000000' DAY_MICROSECOND) c17, + DATE_ADD('1000-01-01 00:00:00', INTERVAL '0 00:00:01.500000000000000000' DAY_MICROSECOND) c18, + DATE_ADD('1000-01-01 00:00:00', INTERVAL '0 00:00:01.5000000000000000000' DAY_MICROSECOND) c19, + DATE_ADD('1000-01-01 00:00:00', INTERVAL '0 00:00:01.50000000000000000000' DAY_MICROSECOND) c20 +; +--horizontal_results + + +--echo # +--echo # End of 10.1 tests +--echo # diff --git a/mysql-test/t/func_misc.test b/mysql-test/t/func_misc.test index ffb7838ee..2509f55cc 100644 --- a/mysql-test/t/func_misc.test +++ b/mysql-test/t/func_misc.test @@ -606,6 +606,17 @@ SELECT NAME_CONST('a', -(1 OR 2)) OR 1; SELECT NAME_CONST('a', -(1 AND 2)) OR 1; SELECT NAME_CONST('a', -(1)) OR 1; +--echo # +--echo # MDEV-15630 uuid() function evaluates at wrong time in query +--echo # + +CREATE TABLE t1 (id INT); +INSERT INTO t1 VALUES (1),(2),(3); +--replace_column 2 xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx +SELECT COUNT(1), UUID() as uid FROM t1 GROUP BY uid; +DROP TABLE t1; + + --echo # --echo # End of 5.5 tests --echo # diff --git a/mysql-test/t/func_str.test b/mysql-test/t/func_str.test index b3143ecbc..46b4dc2e3 100644 --- a/mysql-test/t/func_str.test +++ b/mysql-test/t/func_str.test @@ -1768,6 +1768,41 @@ EXPLAIN EXTENDED SELECT CHAR(0xDF USING latin1); EXPLAIN EXTENDED SELECT CHAR(0xDF USING `binary`); EXPLAIN EXTENDED SELECT CHAR(0xDF); +--echo # +--echo # MDEV-15619 using CONVERT() inside AES_ENCRYPT() in an UPDATE corrupts data +--echo # + +CREATE TABLE t1 ( + id int(11) NOT NULL, + session_id varchar(255) DEFAULT NULL, + directory mediumtext, + checksum int(10) DEFAULT NULL, + last_update datetime DEFAULT NULL, + PRIMARY KEY (id), + KEY lastupdate (last_update) +) DEFAULT CHARSET=latin1; +INSERT INTO t1 VALUES (1,'',NULL,38391,'2017-06-24 07:35:28'); +UPDATE t1 SET directory = AES_ENCRYPT(CONVERT('test stringrererejrjerjehrjekhrjkehrjkehrkjehrjkerhkjehrjekrhkjehrkjerhjkehrkjehrkjehrjkehrjkehrjkehrjkerjkehrjkehrjkehrjke rekjhrejrejhrjehgrehjgrhjerjhegrjherejhgrjhegrjehgrjhegrejhrgjehgrjhegrjhegrjhergjhegrjhegrhjegrjerhthkjjkdhjkgdfjkgjkdgdjkfjkhgjkfdhjgjkfdghkjdfghkjfdghfjkdghkdjfghdkjfghfjkdghfkjdghkjfdghfkjdghfkdjghfkjdghfdjkghjkdfhgdfjkghfjkdghfjkdghfjdkghfjkdghkfjdghfkjdghfkjdghkjdfghfjdkghjkfdghkjdfhgjkdfhgjkfdhgkjfdghkfjdhgkjfdgdjkejktjherjthkjrethkjrethjkerthjkerhtjkerhtkjerhtjkerhtjkerhtjkrehtkjerhtkjrehtjkrehtkjrehtkjerhtkjerhtjkrehtkjrehtjkrehtkjrethjkrethkjrehtkjethjkerhtjkrehtjkretkjerhtkjrehtjkerhtjkrehtjrehtkjrekjtrfgdsfgdhjsghjgfdhjsfhjdfgdhjshjdshjfghjdsfgjhsfgjhsdfgjhdsfgjdhsfgsjhfgjhsdfgsdjhfgjdhsfdjshfgdsjhfgjsdhfdjshfgdjhsfgdjshfgjdhsfgjhsdfgjhsdgfjhsdgfjhdsgfjhsgfjhsdgfjhdsgfhjsdehkjthrkjethjkre' USING latin1), '95F5A1F52A554'), last_update= NOW(); +SELECT directory IS NULL FROM t1; +DROP TABLE t1; + +CREATE TABLE t1 ( + id int(11) NOT NULL PRIMARY KEY, + directory mediumtext +) DEFAULT CHARSET=latin1; +INSERT INTO t1 VALUES (1,AES_ENCRYPT(CONVERT(REPEAT('a',800) USING latin1),'95F5A1F52A554')); +SELECT AES_DECRYPT(directory,'95F5A1F52A554') FROM t1; +DROP TABLE t1; + +SET @enc=AES_ENCRYPT(REPEAT(_latin1'a',800),'95F5A1F52A554'); +CREATE TABLE t1 ( + id int(11) NOT NULL PRIMARY KEY, + directory mediumtext +) DEFAULT CHARSET=latin1; +INSERT INTO t1 VALUES (1,AES_DECRYPT(CONVERT(@enc USING binary),'95F5A1F52A554')); +SELECT * FROM t1; +DROP TABLE t1; + --echo # --echo # Start of 10.1 tests --echo # diff --git a/mysql-test/t/func_time.test b/mysql-test/t/func_time.test index bc553e6f0..380822130 100644 --- a/mysql-test/t/func_time.test +++ b/mysql-test/t/func_time.test @@ -1762,6 +1762,22 @@ SELECT ADDDATE(DATE'0000-01-01', INTERVAL '3652423:0:0:315569433559' DAY_SECOND) SELECT ADDDATE(DATE'0000-01-01', INTERVAL '0:87658175:0:315569433559' DAY_SECOND); SELECT ADDDATE(DATE'0000-01-01', INTERVAL '0:0:5259490559:315569433599' DAY_SECOND); +--echo # +--echo # MDEV-13202 Assertion `ltime->neg == 0' failed in date_to_datetime +--echo # + +CREATE TABLE t1 (i INT, d DATE); +INSERT INTO t1 VALUES (1, '1970-01-01'); +SELECT MAX(NULLIF(i,1)) FROM t1 ORDER BY DATE_SUB(d,INTERVAL 17300000 HOUR); +DROP TABLE t1; + +CREATE TABLE t1 (i INT, d DATE); +INSERT INTO t1 VALUES (1, '1970-01-01'); +SELECT CONCAT(DATE_SUB(d, INTERVAL 17300000 HOUR)) FROM t1; +DROP TABLE t1; + +SELECT CONCAT(DATE_SUB(TIMESTAMP'1970-01-01 00:00:00', INTERVAL 17300000 HOUR)); + --echo # --echo # End of 10.0 tests diff --git a/mysql-test/t/grant.test b/mysql-test/t/grant.test index a8ddf350b..51d59844d 100644 --- a/mysql-test/t/grant.test +++ b/mysql-test/t/grant.test @@ -1568,15 +1568,7 @@ drop database mysqltest1; --echo End of 5.0 tests - -# -# Bug#21432 Database/Table name limited to 64 bytes, not chars, problems with multi-byte -# set names utf8; -grant select on test.* to юзер_юзер@localhost; ---exec $MYSQL --default-character-set=utf8 --user=юзер_юзер -e "select user()" -revoke all on test.* from юзер_юзер@localhost; -drop user юзер_юзер@localhost; --error ER_WRONG_STRING_LENGTH grant select on test.* to очень_длинный_юзер890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890@localhost; set names default; diff --git a/mysql-test/t/grant2.test b/mysql-test/t/grant2.test index a40fd2afb..f0721b3e5 100644 --- a/mysql-test/t/grant2.test +++ b/mysql-test/t/grant2.test @@ -875,9 +875,8 @@ CACHE INDEX t3 IN keycache1; LOAD INDEX INTO CACHE t3; --echo # ---echo # RENAME (doesn't work for temporary tables, thus should fail). +--echo # RENAME should work for temporary tables --echo # ---error ER_TABLEACCESS_DENIED_ERROR RENAME TABLE t3 TO t3_1; --echo # diff --git a/mysql-test/t/grant_not_windows.test b/mysql-test/t/grant_not_windows.test new file mode 100644 index 000000000..55b09232e --- /dev/null +++ b/mysql-test/t/grant_not_windows.test @@ -0,0 +1,14 @@ + # UTF8 parameters to mysql client do not work on Windows +--source include/not_windows.inc +--source include/not_embedded.inc + +# +# Bug#21432 Database/Table name limited to 64 bytes, not chars, problems with multi-byte +# +set names utf8; +create user юзер_юзер@localhost; +grant select on test.* to юзер_юзер@localhost; +--exec $MYSQL --default-character-set=utf8 --user=юзер_юзер -e "select user()" +revoke all on test.* from юзер_юзер@localhost; +drop user юзер_юзер@localhost; +set names default; diff --git a/mysql-test/t/having.test b/mysql-test/t/having.test index 1bbde3e7c..dadeaca35 100644 --- a/mysql-test/t/having.test +++ b/mysql-test/t/having.test @@ -759,6 +759,24 @@ SELECT * FROM t1 JOIN t2 ON c1 = c2 HAVING c2 > 'a' ORDER BY c2 LIMIT 1; DROP TABLE t1,t2; +--echo # +--echo # MDEV-6736: Valgrind warnings 'Invalid read' in subselect_engine::calc_const_tables with SQ +--echo # in WHERE and HAVING, ORDER BY, materialization+semijoin +--echo # + +CREATE TABLE t1 (a INT) ENGINE=MyISAM; +INSERT INTO t1 VALUES (3),(8); + +CREATE TABLE t2 (b INT) ENGINE=MyISAM; +INSERT INTO t2 VALUES (2),(1); + +SELECT a FROM t1 +WHERE 9 IN ( SELECT MIN( a ) FROM t1 ) +HAVING a <> ( SELECT COUNT(*) FROM t2 ) +ORDER BY a; + +DROP TABLE t1,t2; + --echo End of 10.0 tests --echo # diff --git a/mysql-test/t/insert_select.test b/mysql-test/t/insert_select.test index bcd87c268..385e372bc 100644 --- a/mysql-test/t/insert_select.test +++ b/mysql-test/t/insert_select.test @@ -423,3 +423,13 @@ SET GLOBAL myisam_data_pointer_size = @old_myisam_data_pointer_size; DROP TABLE t1; --echo End of 5.1 tests + +# +# MDEV-15318 CREATE .. SELECT VALUES produces invalid table structure +# +create table t1 (i int); +create table t2 as select values(i) as a from t1; +show create table t2; +drop table t1, t2; + +--echo End of 5.5 tests diff --git a/mysql-test/t/join_outer.test b/mysql-test/t/join_outer.test index acbe19b5e..34b0551a3 100644 --- a/mysql-test/t/join_outer.test +++ b/mysql-test/t/join_outer.test @@ -1972,9 +1972,25 @@ INSERT INTO t1 VALUES (0),(1); CREATE TABLE t2 (b2 BIT NOT NULL); INSERT INTO t2 VALUES (0),(1); -SET SESSION JOIN_CACHE_LEVEL = 3; +set @save_join_cache_level= @@join_cache_level; +SET @@join_cache_level = 3; SELECT t1.b1+'0' , t2.b2 + '0' FROM t1 LEFT JOIN t2 ON b1 = b2; DROP TABLE t1, t2; +set @join_cache_level= @save_join_cache_level; + +--echo # +--echo # MDEV-14779: using left join causes incorrect results with materialization and derived tables +--echo # + +create table t1(id int); +insert into t1 values (1),(2); +create table t2(sid int, id int); +insert into t2 values (1,1),(2,2); + +select * from t1 t + left join (select * from t2 where sid in (select max(sid) from t2 where 0=1 group by id)) r + on t.id=r.id ; +drop table t1, t2; --echo # end of 5.5 tests diff --git a/mysql-test/t/limit.test b/mysql-test/t/limit.test index 4dbe13096..668d3b745 100644 --- a/mysql-test/t/limit.test +++ b/mysql-test/t/limit.test @@ -115,3 +115,17 @@ SELECT a FROM t1 ORDER BY a LIMIT 2 OFFSET 14; DROP TABLE t1; --echo End of 5.1 tests + +--echo # +--echo # mdev-16235: SELECT over a table with LIMIT 0 +--echo # + +EXPLAIN +SELECT * FROM mysql.slow_log WHERE sql_text != 'foo' LIMIT 0; +SELECT * FROM mysql.slow_log WHERE sql_text != 'foo' LIMIT 0; + +EXPLAIN +SELECT * FROM mysql.help_topic WHERE help_category_id != example LIMIT 0; +SELECT * FROM mysql.help_topic WHERE help_category_id != example LIMIT 0; + +--echo End of 5.5 tests diff --git a/mysql-test/t/lock.test b/mysql-test/t/lock.test index 78f0e2ecf..6cfaf9fc3 100644 --- a/mysql-test/t/lock.test +++ b/mysql-test/t/lock.test @@ -481,7 +481,7 @@ LOCK TABLE t1 WRITE; --echo # HANDLER commands are not allowed in LOCK TABLES mode --error ER_LOCK_OR_ACTIVE_TRANSACTION HANDLER t1 OPEN; ---error ER_LOCK_OR_ACTIVE_TRANSACTION +--error ER_LOCK_OR_ACTIVE_TRANSACTION,ER_UNKNOWN_TABLE HANDLER t1 READ FIRST; --error ER_LOCK_OR_ACTIVE_TRANSACTION HANDLER t1 CLOSE; diff --git a/mysql-test/t/mdev375.test b/mysql-test/t/mdev375.test index fe259b378..7380e7a32 100644 --- a/mysql-test/t/mdev375.test +++ b/mysql-test/t/mdev375.test @@ -4,7 +4,16 @@ --source include/not_embedded.inc SET GLOBAL log_warnings=4; -SET GLOBAL max_connections=2; +SET GLOBAL max_connections=10; + +--connect (tmp_con1,localhost,root,,) +--connect (tmp_con2,localhost,root,,) +--connect (tmp_con3,localhost,root,,) +--connect (tmp_con4,localhost,root,,) +--connect (tmp_con5,localhost,root,,) +--connect (tmp_con6,localhost,root,,) +--connect (tmp_con7,localhost,root,,) +--connect (tmp_con8,localhost,root,,) --connect (con1,localhost,root,,) SELECT 1; diff --git a/mysql-test/t/myisam.test b/mysql-test/t/myisam.test index 62260ba43..77baa695b 100644 --- a/mysql-test/t/myisam.test +++ b/mysql-test/t/myisam.test @@ -1216,13 +1216,14 @@ DROP TABLE t1; --echo # --echo # BUG#48438 - crash with error in unioned query against merge table and view... --echo # -SET GLOBAL table_open_cache=3; +SET @save_table_open_cache=@@table_open_cache; +SET GLOBAL table_open_cache=10; CREATE TABLE t1(a INT); -SELECT 1 FROM t1 AS a1, t1 AS a2, t1 AS a3, t1 AS a4 FOR UPDATE; +SELECT 1 FROM t1 AS a1, t1 AS a2, t1 AS a3, t1 AS a4, t1 AS a5, t1 AS a6, t1 AS a7, t1 AS a8, t1 AS a9, t1 AS a10, t1 AS a11 FOR UPDATE; SELECT TABLE_ROWS, DATA_LENGTH FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='test' AND TABLE_NAME='t1'; DROP TABLE t1; -SET GLOBAL table_open_cache=DEFAULT; +SET GLOBAL table_open_cache=@save_table_open_cache; --echo End of 5.0 tests @@ -1762,6 +1763,19 @@ ALTER TABLE t1 DISABLE KEYS; OPTIMIZE TABLE t1; DROP TABLE t1; +# +# Check FLUSH FOR EXPORT +# + +CREATE TABLE t1(a INT, b CHAR(10), KEY(a), KEY(b)) engine=myisam; +INSERT INTO t1 VALUES(1,'0'),(2,'0'),(3,'0'),(4,'0'),(5,'0'), + (6,'0'),(7,'0'); +flush tables test.t1 for export; +--error ER_TABLE_NOT_LOCKED_FOR_WRITE +insert into t1 values (8,'0'); +unlock tables; +drop table t1; + # # Check some variables # diff --git a/mysql-test/t/myisam_recover.test b/mysql-test/t/myisam_recover.test index 49fe9c334..670dfd1aa 100644 --- a/mysql-test/t/myisam_recover.test +++ b/mysql-test/t/myisam_recover.test @@ -24,6 +24,7 @@ call mtr.add_suppression("Got an error from thread_id=.*ha_myisam.cc:"); call mtr.add_suppression("MySQL thread id .*, query id .* localhost.*root Checking table"); call mtr.add_suppression(" '\..test.t1'"); +set @save_table_open_cache=@@table_open_cache; set global table_open_cache=256; set global table_definition_cache=400; --disable_warnings @@ -111,7 +112,7 @@ prepare stmt from @drop_table_stmt; execute stmt; deallocate prepare stmt; set @@global.table_definition_cache=default; -set @@global.table_open_cache=default; +set @@global.table_open_cache=@save_table_open_cache; disconnect con1; connection default; --enable_ps_protocol diff --git a/mysql-test/t/mysql.test b/mysql-test/t/mysql.test index 300695612..fc2ae849a 100644 --- a/mysql-test/t/mysql.test +++ b/mysql-test/t/mysql.test @@ -53,14 +53,22 @@ drop table t1; # # Bug#17939 Wrong table format when using UTF8 strings -# ---exec $MYSQL --default-character-set=utf8 --table -e "SELECT 'John Doe' as '__tañgè Ñãmé'" 2>&1 ---exec $MYSQL --default-character-set=utf8 --table -e "SELECT '__tañgè Ñãmé' as 'John Doe'" 2>&1 +write_file $MYSQL_TMP_DIR/mysql_in; +SELECT 'John Doe' as '__tañgè Ñãmé'; +SELECT '__tañgè Ñãmé' as 'John Doe'; +EOF +--exec $MYSQL --default-character-set=utf8 --table < $MYSQL_TMP_DIR/mysql_in 2>&1 +remove_file $MYSQL_TMP_DIR/mysql_in; # # Bug#18265 -- mysql client: No longer right-justifies numeric columns # ---exec $MYSQL -t --default-character-set utf8 test -e "create table t1 (i int, j int, k char(25) charset utf8); insert into t1 (i) values (1); insert into t1 (k) values ('<----------------------->'); insert into t1 (k) values ('<-----'); insert into t1 (k) values ('Τη γλώσσα'); insert into t1 (k) values ('á›–áš´ áš·á›–á›'); select * from t1; DROP TABLE t1;" +write_file $MYSQL_TMP_DIR/mysql_in; +create table t1 (i int, j int, k char(25) charset utf8); insert into t1 (i) values (1); insert into t1 (k) values ('<----------------------->'); insert into t1 (k) values ('<-----'); insert into t1 (k) values ('Τη γλώσσα'); insert into t1 (k) values ('á›–áš´ áš·á›–á›'); select * from t1; DROP TABLE t1; +EOF +--exec $MYSQL -t --default-character-set utf8 test < $MYSQL_TMP_DIR/mysql_in +remove_file $MYSQL_TMP_DIR/mysql_in; + # # "DESCRIBE" commands may return strange NULLness flags. diff --git a/mysql-test/t/mysql_cp932.test b/mysql-test/t/mysql_cp932.test index 60a129c38..8fba5750d 100644 --- a/mysql-test/t/mysql_cp932.test +++ b/mysql-test/t/mysql_cp932.test @@ -10,13 +10,43 @@ # BUG#16217 - MySQL client misinterprets multi-byte char as escape `\' # +let $mysql_in= $MYSQL_TMP_DIR/mysql_in; + # new command \C or charset ---exec $MYSQL --default-character-set=utf8 test -e "\C cp932 \g" ---exec $MYSQL --default-character-set=cp932 test -e "charset utf8;" +write_file $mysql_in; +\C cp932 \g +EOF +--exec $MYSQL --default-character-set=utf8 test < $mysql_in +remove_file $mysql_in; + +write_file $mysql_in; +charset utf8; +EOF +--exec $MYSQL --default-character-set=cp932 test < $mysql_in +remove_file $mysql_in; # its usage to switch internally in mysql to requested charset ---exec $MYSQL --default-character-set=utf8 test -e "charset cp932; select 'ƒ\'; create table t1 (c_cp932 TEXT CHARACTER SET cp932); insert into t1 values('ƒ\'); select * from t1; drop table t1;" ---exec $MYSQL --default-character-set=utf8 test -e "charset cp932; select 'ƒ\'" ---exec $MYSQL --default-character-set=utf8 test -e "/*charset cp932 */; set character_set_client= cp932; select 'ƒ\'" ---exec $MYSQL --default-character-set=utf8 test -e "/*!\C cp932 */; set character_set_client= cp932; select 'ƒ\'" +write_file $mysql_in; +charset cp932; select 'ƒ\'; create table t1 (c_cp932 TEXT CHARACTER SET cp932); insert into t1 values('ƒ\'); select * from t1; drop table t1; +EOF +--exec $MYSQL --default-character-set=utf8 test < $mysql_in +remove_file $mysql_in; + +write_file $mysql_in; +charset cp932; select 'ƒ\' +EOF +--exec $MYSQL --default-character-set=utf8 test < $mysql_in +remove_file $mysql_in; + +write_file $mysql_in; +/*charset cp932 */; set character_set_client= cp932; select 'ƒ\' +EOF +--exec $MYSQL --default-character-set=utf8 test < $mysql_in +remove_file $mysql_in; + +write_file $mysql_in; +/*!\C cp932 */; set character_set_client= cp932; select 'ƒ\' +EOF +--exec $MYSQL --default-character-set=utf8 test < $mysql_in +remove_file $mysql_in; diff --git a/mysql-test/t/mysqldump.test b/mysql-test/t/mysqldump.test index fca334a7f..aacb812c8 100644 --- a/mysql-test/t/mysqldump.test +++ b/mysql-test/t/mysqldump.test @@ -2627,3 +2627,25 @@ let SEARCH_FILE=$MYSQLTEST_VARDIR/tmp/bug11505.sql; let SEARCH_PATTERN=Database: mysql; exec $MYSQL_DUMP mysql func > $SEARCH_FILE; source include/search_pattern_in_file.inc; + +--echo # +--echo # MDEV-15021: Fix the order in which routines are called +--echo # +use test; +CREATE FUNCTION f() RETURNS INT RETURN 1; +CREATE VIEW v1 AS SELECT f(); + +--echo # Running mysqldump -uroot test --routines --tables v1 > **vardir**/test.dmp +--exec $MYSQL_DUMP -uroot test --routines --tables v1 > $MYSQLTEST_VARDIR/test.dmp + +DROP VIEW v1; +DROP FUNCTION f; + +--echo # Running mysql -uroot test < **vardir**/test.dmp +--exec $MYSQL -uroot test < $MYSQLTEST_VARDIR/test.dmp + +--echo # +--echo # Cleanup after succesful import. +--echo # +DROP VIEW v1; +DROP FUNCTION f; diff --git a/mysql-test/t/mysqlslap.test b/mysql-test/t/mysqlslap.test index c49c4ab3d..81115d59d 100644 --- a/mysql-test/t/mysqlslap.test +++ b/mysql-test/t/mysqlslap.test @@ -80,3 +80,11 @@ DROP DATABASE bug58090; --exec $MYSQL_SLAP --create-schema=test --init-command="CREATE TABLE t1(a INT)" --silent --concurrency=1 --iterations=1 DROP TABLE t1; + +--echo # +--echo # Bug MDEV-15789 (Upstream: #80329): MYSQLSLAP OPTIONS --AUTO-GENERATE-SQL-GUID-PRIMARY and --AUTO-GENERATE-SQL-SECONDARY-INDEXES DONT WORK +--echo # + +--exec $MYSQL_SLAP --concurrency=1 --silent --iterations=1 --number-int-cols=2 --number-char-cols=3 --auto-generate-sql --auto-generate-sql-guid-primary --create-schema=slap + +--exec $MYSQL_SLAP --concurrency=1 --silent --iterations=1 --number-int-cols=2 --number-char-cols=3 --auto-generate-sql --auto-generate-sql-secondary-indexes=1 --create-schema=slap diff --git a/mysql-test/t/mysqltest.test b/mysql-test/t/mysqltest.test index b2eb101a3..60f41042d 100644 --- a/mysql-test/t/mysqltest.test +++ b/mysql-test/t/mysqltest.test @@ -685,7 +685,7 @@ remove_file $MYSQLTEST_VARDIR/tmp/mysqltest.sql; # Too many errorcodes specified --error 1 ---exec echo "--error 1,2,3,4,5,6,7,8,9,10,11" | $MYSQL_TEST 2>&1 +--exec echo "--error 1,2,3,4,5,6,7,8,9,10,11,12,13" | $MYSQL_TEST 2>&1 # ---------------------------------------------------------------------------- diff --git a/mysql-test/t/olap.test b/mysql-test/t/olap.test index fec5df1a1..4a61cebdc 100644 --- a/mysql-test/t/olap.test +++ b/mysql-test/t/olap.test @@ -404,3 +404,26 @@ SELECT DISTINCT b FROM t1, t2 GROUP BY a, b WITH ROLLUP; DROP TABLE t1, t2; --echo End of 5.0 tests + + +--echo # +--echo # Start of 10.1 tests +--echo # + +--echo # +--echo # MDEV-16190 Server crashes in Item_null_result::field_type on SELECT with time field, ROLLUP and HAVING +--echo # +CREATE TABLE t1 (t TIME) ENGINE=MyISAM; +INSERT INTO t1 VALUES ('12:12:12'); +SELECT t, COUNT(*) FROM t1 GROUP BY t WITH ROLLUP HAVING t > '00:00:00'; +DROP TABLE t1; + +CREATE TABLE t1 (t TIME) ENGINE=MyISAM; +INSERT INTO t1 VALUES ('12:12:12'),('12:12:13'); +SELECT t, COUNT(*) FROM t1 GROUP BY t WITH ROLLUP HAVING t > '00:00:00'; +DROP TABLE t1; + + +--echo # +--echo # End of 10.1 tests +--echo # diff --git a/mysql-test/t/parser.test b/mysql-test/t/parser.test index e27db9c4e..1aba207fd 100644 --- a/mysql-test/t/parser.test +++ b/mysql-test/t/parser.test @@ -781,6 +781,15 @@ CREATE TRIGGER tr AFTER DELETE ON t1 FOR EACH ROW SET @a = 1\; PREPARE stmt FROM 'CREATE TRIGGER tr AFTER DELETE ON t1 FOR EACH ROW SET @a = 1\\'; DROP TABLE t1; +--echo # +--echo # MDEV-15620 Crash when using "SET @@NEW.a=expr" inside a trigger +--echo # + +CREATE TABLE t1 (a INT); +--error ER_UNKNOWN_SYSTEM_VARIABLE +CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW SET @@NEW.a=0; +DROP TABLE t1; + # # start of 10.1 tests # diff --git a/mysql-test/t/ps.test b/mysql-test/t/ps.test index f7008f570..e1e8dfeeb 100644 --- a/mysql-test/t/ps.test +++ b/mysql-test/t/ps.test @@ -3876,3 +3876,58 @@ FROM ) X; drop table t1; --echo # End of 5.5 tests + +--echo # +--echo # Start of 10.1 tests +--echo # + +--echo # +--echo # MDEV-12060 Crash in EXECUTE IMMEDIATE with an expression returning a GRANT command +--echo # (the 10.1 part) +--echo # + +DELIMITER /; +CREATE PROCEDURE p2 () +BEGIN + SET STATEMENT join_cache_level=CAST(CONCAT(_utf8'6',_latin1'') AS INT) FOR PREPARE stmt FROM 'SELECT 1'; + EXECUTE stmt; + DEALLOCATE PREPARE stmt; +END; +/ +DELIMITER ;/ +CALL p2(); +DROP PROCEDURE p2; + + +DELIMITER /; +BEGIN NOT ATOMIC + SET STATEMENT join_cache_level=CAST(CONCAT(_utf8'6',_latin1'') AS INT) FOR PREPARE stmt FROM 'SELECT 1'; + EXECUTE stmt; + DEALLOCATE PREPARE stmt; +END; +/ +DELIMITER ;/ + + +DELIMITER /; +BEGIN NOT ATOMIC + SET STATEMENT join_cache_level=CAST(CONCAT(_utf8'6',_latin1'') AS INT) FOR PREPARE stmt FROM 'SELECT 1'; + DEALLOCATE PREPARE stmt; +END; +/ +DELIMITER ;/ + + +DELIMITER /; +BEGIN NOT ATOMIC + PREPARE stmt FROM 'SELECT 1'; + SET STATEMENT join_cache_level=CAST(CONCAT(_utf8'6',_latin1'') AS INT) FOR EXECUTE stmt; + DEALLOCATE PREPARE stmt; +END; +/ +DELIMITER ;/ + + +--echo # +--echo # End of 10.1 tests +--echo # diff --git a/mysql-test/t/ps_qc_innodb.test b/mysql-test/t/ps_qc_innodb.test new file mode 100644 index 000000000..e09a2bf40 --- /dev/null +++ b/mysql-test/t/ps_qc_innodb.test @@ -0,0 +1,35 @@ +--source include/have_query_cache.inc +--source include/have_innodb.inc + +--echo # +--echo # MDEV-15492: Subquery crash similar to MDEV-10050 +--echo # + +SET @qcs.save= @@global.query_cache_size, @qct.save= @@global.query_cache_type; +SET GLOBAL query_cache_size= 512*1024*1024, query_cache_type= ON; + +--connect (con1,localhost,root,,test) +CREATE TABLE t1 (a INT) ENGINE=InnoDB; +CREATE TABLE t2 (b INT) ENGINE=InnoDB; +CREATE VIEW v AS select a from t1 join t2; + +PREPARE stmt1 FROM "SELECT * FROM t1 WHERE a in (SELECT a FROM v)"; + +--connect (con2,localhost,root,,test) +PREPARE stmt2 FROM "SELECT * FROM t1 WHERE a in (SELECT a FROM v)"; +EXECUTE stmt2; + +--connection con1 +EXECUTE stmt1; +INSERT INTO t2 VALUES (0); +EXECUTE stmt1; +START TRANSACTION; +EXECUTE stmt1; + +# Cleanup +--disconnect con1 +--disconnect con2 +--connection default +DROP VIEW v; +DROP TABLE t1, t2; +SET GLOBAL query_cache_size= @qcs.save, query_cache_type= @qct.save; diff --git a/mysql-test/t/rename.test b/mysql-test/t/rename.test index a55bc845a..67732d5b5 100644 --- a/mysql-test/t/rename.test +++ b/mysql-test/t/rename.test @@ -95,3 +95,49 @@ drop table t1; --source include/wait_until_count_sessions.inc +# +# Test of rename with temporary tables +# + +CREATE OR REPLACE TABLE t1 (a INT); +CREATE OR REPLACE TABLE t2 (a INT); +CREATE OR REPLACE TEMPORARY TABLE t1_tmp (b INT); +CREATE OR REPLACE TEMPORARY TABLE t2_tmp (b INT); + +# Can't rename table over another one +--error ER_TABLE_EXISTS_ERROR +rename table t1 to t2; +--error ER_TABLE_EXISTS_ERROR +rename table t1 to tmp, tmp to t2; +--error ER_TABLE_EXISTS_ERROR +rename table t1_tmp to t2_tmp; +--error ER_TABLE_EXISTS_ERROR +rename table t1_tmp to tmp, tmp to t2_tmp; + +show create table t1_tmp; +show create table t2_tmp; + +# The following should work +rename table t1 to t1_tmp; +rename table t2_tmp to t2; +rename table t2 to tmp, tmp to t2; +rename table t1_tmp to tmp, tmp to t1_tmp; +show tables; +SHOW CREATE TABLE t1_tmp; +drop table t1_tmp; +SHOW CREATE TABLE t1_tmp; +drop table t1_tmp; +SHOW CREATE TABLE t2; +drop table t2; +SHOW CREATE TABLE t2; +drop table t2; + +CREATE TABLE t1 (a INT); +insert into t1 values (1); +CREATE TEMPORARY TABLE t1 (b INT); +insert into t1 values (2); +RENAME TABLE t1 TO tmp, t1 TO t2; +select * from tmp; +select * from t2; +drop table tmp,t2; + diff --git a/mysql-test/t/selectivity.test b/mysql-test/t/selectivity.test index 3e60f2420..cf12bdaea 100644 --- a/mysql-test/t/selectivity.test +++ b/mysql-test/t/selectivity.test @@ -1045,6 +1045,24 @@ SELECT * FROM (SELECT t FROM t1 WHERE d IS NULL) sq; DROP TABLE t1; +--echo # +--echo # MDEV-16374: filtered shows 0 for materilization scan for a semi join, which makes optimizer +--echo # always pick materialization scan over materialization lookup +--echo # + +create table t0(a int); +insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9); +create table t1 (a int, b int); +insert into t1 values (0,0),(1,1),(2,2),(3,3),(4,4),(5,5),(6,6),(7,7),(8,8),(9,9),(10,10), +(11,11),(12,12),(13,13),(14,14),(15,15); +set @@optimizer_use_condition_selectivity=2; +explain extended select * from t1 where a in (select max(a) from t1 group by b); +select * from t1 where a in (select max(a) from t1 group by b); +set @@optimizer_use_condition_selectivity=1; +explain extended select * from t1 where a in (select max(a) from t1 group by b); +select * from t1 where a in (select max(a) from t1 group by b); +drop table t1,t0; + set histogram_size=@save_histogram_size; set optimizer_use_condition_selectivity=@save_optimizer_use_condition_selectivity; set use_stat_tables=@save_use_stat_tables; diff --git a/mysql-test/t/sp-destruct.test b/mysql-test/t/sp-destruct.test index 6e19fd885..9d43245d5 100644 --- a/mysql-test/t/sp-destruct.test +++ b/mysql-test/t/sp-destruct.test @@ -285,3 +285,13 @@ create database mysqltest1; create procedure mysqltest1.foo() select "foo"; update mysql.proc set name='' where db='mysqltest1'; drop database mysqltest1; + +# +# BUG#26881798: SERVER EXITS WHEN PRIMARY KEY IN MYSQL.PROC IS DROPPED +# +create procedure p1() set @foo = 10; +alter table mysql.proc drop primary key; +--error ER_CANNOT_LOAD_FROM_TABLE_V2 +drop procedure p1; +alter table mysql.proc add primary key (db,name,type); +drop procedure p1; diff --git a/mysql-test/t/sp-innodb.test b/mysql-test/t/sp-innodb.test index 23715166a..e44a853e7 100644 --- a/mysql-test/t/sp-innodb.test +++ b/mysql-test/t/sp-innodb.test @@ -158,5 +158,47 @@ SET @@innodb_lock_wait_timeout= @innodb_lock_wait_timeout_saved; --echo # BUG 16041903: End of test case --echo # +--echo # +--echo # MDEV-15035: SP using query with outer join and a parameter +--echo # in ON expression +--echo # + +CREATE TABLE t1 ( + id int NOT NULL, + PRIMARY KEY (id) +) ENGINE=InnoDB; + +INSERT INTO t1 VALUES (1), (2); + +CREATE TABLE t2 ( + id int NOT NULL, + id_foo int NOT NULL, + PRIMARY KEY (id) +) ENGINE=InnoDB; + +INSERT INTO t2 VALUES (1, 1); + +--disable_warnings +DROP PROCEDURE IF EXISTS test_proc; +--enable_warnings + +DELIMITER |; +CREATE PROCEDURE test_proc(IN param int) +LANGUAGE SQL +READS SQL DATA +BEGIN + SELECT DISTINCT f.id + FROM t1 f + LEFT OUTER JOIN t2 b ON b.id_foo = f.id + WHERE (param <> 0 OR b.id IS NOT NULL); +END| +DELIMITER ;| + +CALL test_proc(0); +CALL test_proc(1); + +DROP PROCEDURE IF EXISTS test_proc; +DROP TABLE t1, t2; + # Wait till we reached the initial number of concurrent sessions --source include/wait_until_count_sessions.inc diff --git a/mysql-test/t/sp.test b/mysql-test/t/sp.test index 4b2230ea7..467d3b5a7 100644 --- a/mysql-test/t/sp.test +++ b/mysql-test/t/sp.test @@ -9408,7 +9408,7 @@ DELIMITER ;| set @tmp_toc= @@table_open_cache; set @tmp_tdc= @@table_definition_cache; -set global table_open_cache=1; +set global table_open_cache=10; set global table_definition_cache=1; call p1(); @@ -9754,4 +9754,19 @@ DROP TABLE t1, t2; SET max_sp_recursion_depth=default; +--echo # +--echo # MDEV-15347: Valgrind or ASAN errors in mysql_make_view on query +--echo # from information_schema +--echo # + +CREATE VIEW v AS SELECT 1; +CREATE FUNCTION f() RETURNS INT RETURN 1; +--disable_result_log +SELECT * FROM INFORMATION_SCHEMA.TABLES JOIN INFORMATION_SCHEMA.PARAMETERS +UNION +SELECT * FROM INFORMATION_SCHEMA.TABLES JOIN INFORMATION_SCHEMA.PARAMETERS; +--enable_result_log +DROP FUNCTION f; +DROP VIEW v; + --echo #End of 10.1 tests diff --git a/mysql-test/t/statistics.test b/mysql-test/t/statistics.test index 3f08e2e13..0463885e4 100644 --- a/mysql-test/t/statistics.test +++ b/mysql-test/t/statistics.test @@ -729,6 +729,25 @@ select db_name, table_name, column_name, drop table t1; +--echo # +--echo # MDEB-9744: session optimizer_use_condition_selectivity=5 causing SQL Error (1918): +--echo # Encountered illegal value '' when converting to DECIMAL +--echo # + +set @save_optimizer_use_condition_selectivity= @@optimizer_use_condition_selectivity; +set optimizer_use_condition_selectivity=3, use_stat_tables=preferably; + +create table t1 (id int(10),cost decimal(9,2)) engine=innodb; +ANALYZE TABLE t1 PERSISTENT FOR ALL; + +create temporary table t2 (id int); +insert into t2 (id) select id from t1 where cost > 0; +select * from t2; + +set use_stat_tables=@save_use_stat_tables; +set optimizer_use_condition_selectivity= @save_optimizer_use_condition_selectivity; +drop table t1,t2; + --echo # --echo # MDEV-9590: Always print "Engine-independent statistic" warnings and --echo # might be filtering columns unintentionally from engines diff --git a/mysql-test/t/statistics_close.test b/mysql-test/t/statistics_close.test new file mode 100644 index 000000000..de22a5a44 --- /dev/null +++ b/mysql-test/t/statistics_close.test @@ -0,0 +1,18 @@ +# +# MDEV-16123 ASAN heap-use-after-free handler::ha_index_or_rnd_end +# MDEV-13828 Segmentation fault on RENAME TABLE +# + +CREATE TABLE t1 (i int); +--connect (con1,localhost,root,,test) +--send +RENAME TABLE t1 TO t2; +--connection default +FLUSH TABLES; +--connection con1 +--reap + +# Cleanup +--disconnect con1 +--connection default +DROP TABLE IF EXISTS t1, t2; diff --git a/mysql-test/t/subselect4.test b/mysql-test/t/subselect4.test index d4ccbcf6f..d5a404191 100644 --- a/mysql-test/t/subselect4.test +++ b/mysql-test/t/subselect4.test @@ -2032,9 +2032,40 @@ SELECT ( SELECT COUNT(*) FROM t1 WHERE a = c ) AS field, COUNT(DISTINCT c) FROM t2 WHERE b <= 'quux' GROUP BY field; drop table t1,t2; +--echo # +--echo # MDEV-15555: select from DUAL where false yielding wrong result when in a IN +--echo # + +explain +SELECT 2 IN (SELECT 2 from DUAL WHERE 1 != 1); +SELECT 2 IN (SELECT 2 from DUAL WHERE 1 != 1); + SET optimizer_switch= @@global.optimizer_switch; set @@tmp_table_size= @@global.tmp_table_size; +--echo # +--echo # MDEV-14515: Wrong results for tableless query with subquery in WHERE +--echo # and implicit aggregation +--echo # + +create table t1 (i1 int, i2 int); +insert into t1 values (1314, 1084),(1330, 1084),(1401, 1084),(580, 1084); + +create table t2 (cd int); +insert into t2 values + (1330), (1330), (1330), (1330), (1330), (1330), (1330), (1330), + (1330), (1330), (1330), (1330), (1330), (1330), (1330), (1330); + +select max(10) from dual + where exists (select 1 from t2 join t1 on t1.i1 = t2.cd and t1.i2 = 345); + +insert into t2 select * from t2; + +select max(10) from dual + where exists (select 1 from t2 join t1 on t1.i1 = t2.cd and t1.i2 = 345); + +DROP TABLE t1,t2; + --echo # --echo # MDEV-10232 Scalar result of subquery changes after adding an outer select stmt --echo # diff --git a/mysql-test/t/subselect_mat.test b/mysql-test/t/subselect_mat.test index 9c7c9683d..bf5de741e 100644 --- a/mysql-test/t/subselect_mat.test +++ b/mysql-test/t/subselect_mat.test @@ -255,6 +255,19 @@ FROM t1; drop table t1, t2; +--echo # +--echo # MDEV-15235: Assertion `length > 0' failed in create_ref_for_key +--echo # + +CREATE TABLE t1 (i INT); +INSERT INTO t1 VALUES (1),(2); +CREATE TABLE t2 (f CHAR(1)); +INSERT INTO t2 VALUES ('a'),('b'); +explain +SELECT * FROM t2 WHERE f IN ( SELECT LEFT('foo',0) FROM t1 ORDER BY 1 ); +SELECT * FROM t2 WHERE f IN ( SELECT LEFT('foo',0) FROM t1 ORDER BY 1 ); +DROP TABLE t1, t2; + --echo # --echo # MDEV-9489: Assertion `0' failed in Protocol::end_statement() on --echo # UNION ALL diff --git a/mysql-test/t/subselect_sj.test b/mysql-test/t/subselect_sj.test index f90f1e2e9..623e41431 100644 --- a/mysql-test/t/subselect_sj.test +++ b/mysql-test/t/subselect_sj.test @@ -2845,5 +2845,35 @@ eval EXPLAIN EXTENDED $q2; DROP TABLE t1,t2,t3,t4; +--echo # +--echo # MDEV-13699: Assertion `!new_field->field_name.str || +--echo # strlen(new_field->field_name.str) == new_field->field_name.length' +--echo # failed in create_tmp_table on 2nd execution of PS with semijoin +--echo # + +CREATE TABLE t1 (a INT); +INSERT INTO t1 VALUES (1),(2); + +CREATE TABLE t2 (b INT); +INSERT INTO t2 VALUES (3),(4); + +CREATE TABLE t3 (c INT); +CREATE ALGORITHM=MERGE VIEW v3 AS SELECT * FROM t3; +INSERT INTO t3 VALUES (5),(6); + +PREPARE stmt FROM + "SELECT * FROM t1 + WHERE EXISTS ( + SELECT * FROM t2 WHERE t1.a IN ( SELECT c AS fld FROM v3 ) + )"; +EXECUTE stmt; +EXECUTE stmt; +EXECUTE stmt; + +drop view v3; +drop table t1,t2,t3; + +--echo # End of 5.5 test + # The following command must be the last one the file set optimizer_switch=@subselect_sj_tmp; diff --git a/mysql-test/t/subselect_sj2_mat.test b/mysql-test/t/subselect_sj2_mat.test index cfb6c8c28..0665cdf68 100644 --- a/mysql-test/t/subselect_sj2_mat.test +++ b/mysql-test/t/subselect_sj2_mat.test @@ -303,3 +303,45 @@ eval $q; eval explain $q; DROP TABLE t1,t2; + +--echo # +--echo # MDEV-16225: wrong resultset from query with semijoin=on +--echo # + +CREATE TABLE t1 ( + `id` int(10) NOT NULL AUTO_INCREMENT, + `local_name` varchar(64) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=latin1; + +insert into t1(`id`,`local_name`) values +(1,'Cash Advance'), +(2,'Cash Advance'), +(3,'Rollover'), +(4,'AL Installment'), +(5,'AL Installment'), +(6,'AL Installment'), +(7,'AL Installment'), +(8,'AL Installment'), +(9,'AL Installment'), +(10,'Internet Payday'), +(11,'Rollover - Internet Payday'), +(12,'AL Monthly Installment'), +(13,'AL Semi-Monthly Installment'); + +explain +SELECT SQL_NO_CACHE t.id +FROM t1 t +WHERE ( + t.id IN (SELECT A.id FROM t1 AS A WHERE A.local_name IN (SELECT B.local_name FROM t1 AS B WHERE B.id IN (0,4,12,13,1,10,3,11))) + OR + (t.id IN (0,4,12,13,1,10,3,11)) +); +SELECT SQL_NO_CACHE t.id +FROM t1 t +WHERE ( + t.id IN (SELECT A.id FROM t1 AS A WHERE A.local_name IN (SELECT B.local_name FROM t1 AS B WHERE B.id IN (0,4,12,13,1,10,3,11))) + OR + (t.id IN (0,4,12,13,1,10,3,11)) +); +drop table t1; diff --git a/mysql-test/t/trigger.test b/mysql-test/t/trigger.test index ff6f38b71..a6d4107e5 100644 --- a/mysql-test/t/trigger.test +++ b/mysql-test/t/trigger.test @@ -2656,5 +2656,17 @@ insert into t2 value (2); DROP VIEW v1; DROP TABLE t1,t2,t3; +--echo # +--echo # MDEV-16093 +--echo # Assertion `global_status_var.global_memory_used == 0' failed or +--echo # bytes lost after inserting into table with non-null blob and trigger +--echo # + +CREATE TABLE t1 (b BLOB NOT NULL); +CREATE TRIGGER tr BEFORE UPDATE ON t1 FOR EACH ROW BEGIN END; +INSERT INTO t1 VALUES ('foo'); +DROP TABLE t1; ---echo End of 10.1 tests. +--echo # +--echo # End of 10.1 tests. +--echo # diff --git a/mysql-test/t/type_time.test b/mysql-test/t/type_time.test index 27679b9ec..10b75f275 100644 --- a/mysql-test/t/type_time.test +++ b/mysql-test/t/type_time.test @@ -723,6 +723,29 @@ INSERT INTO t1 VALUES ('10:10:10'),('10:20:30'); SELECT MAX(a), MAX(COALESCE(a)) FROM t1; DROP TABLE t1; +--echo # +--echo # MDEV-15321: different results when using value of optimizer_use_condition_selectivity=4 and =1 +--echo # + +SET @save_old_mode=@@old_mode; +SET @@old_mode=zero_date_time_cast; +CREATE TABLE t1 (a TIME); +INSERT INTO t1 VALUES ('0000-00-00 10:20:30'),('0000-00-00 10:20:31'); +INSERT INTO t1 VALUES ('0000-00-01 10:20:30'),('0000-00-01 10:20:31'); +INSERT INTO t1 VALUES ('31 10:20:30'),('32 10:20:30'),('33 10:20:30'),('34 10:20:30'); + +SET @save_optimizer_use_condition_selectivity= @@optimizer_use_condition_selectivity; +SET @@optimizer_use_condition_selectivity=1; +SELECT * FROM t1 WHERE a='0000-00-01 10:20:30' AND LENGTH(a)=8; +EXPLAIN EXTENDED SELECT * FROM t1 WHERE a='0000-00-01 10:20:30' AND LENGTH(a)=8; + +SET @@optimizer_use_condition_selectivity=4; +SELECT * FROM t1 WHERE a='0000-00-01 10:20:30' AND LENGTH(a)=8; +EXPLAIN EXTENDED SELECT * FROM t1 WHERE a='0000-00-01 10:20:30' AND LENGTH(a)=8; +drop table t1; +SET @@optimizer_use_condition_selectivity= @save_optimizer_use_condition_selectivity; +set @@old_mode= @save_old_mode; + --echo # --echo # End of 10.1 tests --echo # diff --git a/mysql-test/t/type_time_6065.test b/mysql-test/t/type_time_6065.test index 6e29b849b..fc91c5307 100644 --- a/mysql-test/t/type_time_6065.test +++ b/mysql-test/t/type_time_6065.test @@ -172,6 +172,29 @@ eval $query; DROP TABLE t1,t2,t3; SET TIMESTAMP=0; # back to current time + +--echo # +--echo # MDEV-15262 Wrong results for SELECT..WHERE non_indexed_datetime_column=indexed_time_column +--echo # + +SET TIMESTAMP=UNIX_TIMESTAMP('2012-01-31 10:14:35'); +CREATE TABLE t1 (col_time_key TIME, KEY(col_time_key)); +CREATE TABLE t2 (col_datetime_key DATETIME); +INSERT INTO t1 VALUES ('-760:00:00'),('760:00:00'); +INSERT INTO t1 VALUES ('-770:00:00'),('770:00:00'); +INSERT INTO t2 SELECT * FROM t1; +SELECT * FROM t2 STRAIGHT_JOIN t1 IGNORE INDEX(col_time_key) WHERE col_time_key = col_datetime_key; +SELECT * FROM t2 STRAIGHT_JOIN t1 FORCE INDEX (col_time_key) WHERE col_time_key = col_datetime_key; +INSERT INTO t1 VALUES ('-838:59:59'),('838:59:59'); +INSERT INTO t2 VALUES (DATE_ADD(CURRENT_DATE, INTERVAL '-838:59:59' HOUR_SECOND)); +INSERT INTO t2 VALUES (DATE_ADD(CURRENT_DATE, INTERVAL '838:59:59' HOUR_SECOND)); +INSERT INTO t2 VALUES (DATE_ADD(CURRENT_DATE, INTERVAL '-839:00:00' HOUR_SECOND)); +INSERT INTO t2 VALUES (DATE_ADD(CURRENT_DATE, INTERVAL '839:00:00' HOUR_SECOND)); +SELECT * FROM t2 STRAIGHT_JOIN t1 IGNORE INDEX(col_time_key) WHERE col_time_key = col_datetime_key; +SELECT * FROM t2 STRAIGHT_JOIN t1 FORCE INDEX (col_time_key) WHERE col_time_key = col_datetime_key; +DROP TABLE t1, t2; +SET TIMESTAMP=DEFAULT; + # # End of 10.0 tests # diff --git a/mysql-test/t/variables.test b/mysql-test/t/variables.test index 8f29528ac..458327328 100644 --- a/mysql-test/t/variables.test +++ b/mysql-test/t/variables.test @@ -343,6 +343,7 @@ set sql_select_limit=1; # reset it, so later tests don't get confused set sql_select_limit=default; set sql_warnings=1; +set @save_table_open_cache=@@table_open_cache; set global table_open_cache=100; set default_storage_engine=myisam; set global thread_cache_size=100; @@ -502,7 +503,7 @@ SELECT * FROM INFORMATION_SCHEMA.SESSION_VARIABLES WHERE VARIABLE_NAME LIKE 'MYI SET GLOBAL table_open_cache=-1; SHOW VARIABLES LIKE 'table_open_cache'; SELECT * FROM INFORMATION_SCHEMA.SESSION_VARIABLES WHERE VARIABLE_NAME LIKE 'table_open_cache'; -SET GLOBAL table_open_cache=DEFAULT; +SET GLOBAL table_open_cache=@save_table_open_cache; # # Bugs12363: character_set_results is nullable, diff --git a/mysql-test/t/view.test b/mysql-test/t/view.test index 68adc6e19..6ff226d73 100644 --- a/mysql-test/t/view.test +++ b/mysql-test/t/view.test @@ -5182,118 +5182,6 @@ deallocate prepare stmt1; drop view v1,v2; drop table t1,t2; ---echo # ---echo # MDEV-6251: SIGSEGV in query optimizer (in set_check_materialized ---echo # with MERGE view) ---echo # - -CREATE TABLE t1 (a1 INT(11) NOT NULL DEFAULT NULL AUTO_INCREMENT PRIMARY KEY); -CREATE TABLE t2 (b1 INT(11) NOT NULL DEFAULT NULL AUTO_INCREMENT PRIMARY KEY); -CREATE TABLE t3 (c1 INT(11) NOT NULL DEFAULT NULL AUTO_INCREMENT PRIMARY KEY); -CREATE TABLE t4 (d1 INT(11) NOT NULL DEFAULT NULL AUTO_INCREMENT PRIMARY KEY); -CREATE TABLE t5 (e1 INT(11) NOT NULL DEFAULT NULL AUTO_INCREMENT PRIMARY KEY); -CREATE TABLE t6 (f1 INT(11) NOT NULL DEFAULT NULL AUTO_INCREMENT PRIMARY KEY); - -CREATE OR REPLACE view v1 AS - SELECT 1 - FROM t1 a_alias_1 - LEFT JOIN (t2 b_alias_1 JOIN t1 a_alias_2) ON b_alias_1.b1 = a_alias_1.a1 AND a_alias_2.a1 = a_alias_1.a1 - LEFT JOIN t3 c_alias_1 ON c_alias_1.c1 = a_alias_1.a1 - LEFT JOIN t4 d_alias_1 ON d_alias_1.d1 = a_alias_1.a1 - LEFT JOIN t3 c_alias_2 ON c_alias_2.c1 = a_alias_1.a1 - LEFT JOIN t5 e_alias_1 ON e_alias_1.e1 = a_alias_1.a1 - LEFT JOIN t6 f_alias_1 ON f_alias_1.f1 = a_alias_1.a1 -; - -SELECT 1 -FROM (( SELECT 1 - FROM t1 a_alias_1 - LEFT JOIN (t2 b_alias_1 JOIN t1 a_alias_2) ON b_alias_1.b1 = a_alias_1.a1 AND a_alias_2.a1 = a_alias_1.a1 - LEFT JOIN t3 c_alias_1 ON c_alias_1.c1 = a_alias_1.a1 - LEFT JOIN t4 d_alias_1 ON d_alias_1.d1 = a_alias_1.a1 - LEFT JOIN t3 c_alias_2 ON c_alias_2.c1 = a_alias_1.a1 - LEFT JOIN t5 e_alias_1 ON e_alias_1.e1 = a_alias_1.a1 - LEFT JOIN t6 f_alias_1 ON f_alias_1.f1 = a_alias_1.a1 -) t1) -LEFT OUTER JOIN (( SELECT 1 - FROM t1 a_alias_1 - LEFT JOIN (t2 b_alias_1 JOIN t1 a_alias_2) ON b_alias_1.b1 = a_alias_1.a1 AND a_alias_2.a1 = a_alias_1.a1 - LEFT JOIN t3 c_alias_1 ON c_alias_1.c1 = a_alias_1.a1 - LEFT JOIN t4 d_alias_1 ON d_alias_1.d1 = a_alias_1.a1 - LEFT JOIN t3 c_alias_2 ON c_alias_2.c1 = a_alias_1.a1 - LEFT JOIN t5 e_alias_1 ON e_alias_1.e1 = a_alias_1.a1 - LEFT JOIN t6 f_alias_1 ON f_alias_1.f1 = a_alias_1.a1 -) t2) ON 1=1 -LEFT OUTER JOIN (( SELECT 1 - FROM t1 a_alias_1 - LEFT JOIN (t2 b_alias_1 JOIN t1 a_alias_2) ON b_alias_1.b1 = a_alias_1.a1 AND a_alias_2.a1 = a_alias_1.a1 - LEFT JOIN t3 c_alias_1 ON c_alias_1.c1 = a_alias_1.a1 - LEFT JOIN t4 d_alias_1 ON d_alias_1.d1 = a_alias_1.a1 - LEFT JOIN t3 c_alias_2 ON c_alias_2.c1 = a_alias_1.a1 - LEFT JOIN t5 e_alias_1 ON e_alias_1.e1 = a_alias_1.a1 - LEFT JOIN t6 f_alias_1 ON f_alias_1.f1 = a_alias_1.a1 -) t3) ON 1=1 -LEFT OUTER JOIN (( SELECT 1 - FROM t1 a_alias_1 - LEFT JOIN (t2 b_alias_1 JOIN t1 a_alias_2) ON b_alias_1.b1 = a_alias_1.a1 AND a_alias_2.a1 = a_alias_1.a1 - LEFT JOIN t3 c_alias_1 ON c_alias_1.c1 = a_alias_1.a1 - LEFT JOIN t4 d_alias_1 ON d_alias_1.d1 = a_alias_1.a1 - LEFT JOIN t3 c_alias_2 ON c_alias_2.c1 = a_alias_1.a1 - LEFT JOIN t5 e_alias_1 ON e_alias_1.e1 = a_alias_1.a1 - LEFT JOIN t6 f_alias_1 ON f_alias_1.f1 = a_alias_1.a1 -) t4) ON 1=1 -LEFT OUTER JOIN (( SELECT 1 - FROM t1 a_alias_1 - LEFT JOIN (t2 b_alias_1 JOIN t1 a_alias_2) ON b_alias_1.b1 = a_alias_1.a1 AND a_alias_2.a1 = a_alias_1.a1 - LEFT JOIN t3 c_alias_1 ON c_alias_1.c1 = a_alias_1.a1 - LEFT JOIN t4 d_alias_1 ON d_alias_1.d1 = a_alias_1.a1 - LEFT JOIN t3 c_alias_2 ON c_alias_2.c1 = a_alias_1.a1 - LEFT JOIN t5 e_alias_1 ON e_alias_1.e1 = a_alias_1.a1 - LEFT JOIN t6 f_alias_1 ON f_alias_1.f1 = a_alias_1.a1 -) t5) ON 1=1 -LEFT OUTER JOIN (( SELECT 1 - FROM t1 a_alias_1 - LEFT JOIN (t2 b_alias_1 JOIN t1 a_alias_2) ON b_alias_1.b1 = a_alias_1.a1 AND a_alias_2.a1 = a_alias_1.a1 - LEFT JOIN t3 c_alias_1 ON c_alias_1.c1 = a_alias_1.a1 - LEFT JOIN t4 d_alias_1 ON d_alias_1.d1 = a_alias_1.a1 - LEFT JOIN t3 c_alias_2 ON c_alias_2.c1 = a_alias_1.a1 - LEFT JOIN t5 e_alias_1 ON e_alias_1.e1 = a_alias_1.a1 - LEFT JOIN t6 f_alias_1 ON f_alias_1.f1 = a_alias_1.a1 -) t6) ON 1=1 -LEFT OUTER JOIN (( SELECT 1 - FROM t1 a_alias_1 - LEFT JOIN (t2 b_alias_1 JOIN t1 a_alias_2) ON b_alias_1.b1 = a_alias_1.a1 AND a_alias_2.a1 = a_alias_1.a1 - LEFT JOIN t3 c_alias_1 ON c_alias_1.c1 = a_alias_1.a1 - LEFT JOIN t4 d_alias_1 ON d_alias_1.d1 = a_alias_1.a1 - LEFT JOIN t3 c_alias_2 ON c_alias_2.c1 = a_alias_1.a1 - LEFT JOIN t5 e_alias_1 ON e_alias_1.e1 = a_alias_1.a1 - LEFT JOIN t6 f_alias_1 ON f_alias_1.f1 = a_alias_1.a1 -) t7) ON 1=1 -LEFT OUTER JOIN (( SELECT 1 - FROM t1 a_alias_1 - LEFT JOIN (t2 b_alias_1 JOIN t1 a_alias_2) ON b_alias_1.b1 = a_alias_1.a1 AND a_alias_2.a1 = a_alias_1.a1 - LEFT JOIN t3 c_alias_1 ON c_alias_1.c1 = a_alias_1.a1 - LEFT JOIN t4 d_alias_1 ON d_alias_1.d1 = a_alias_1.a1 - LEFT JOIN t3 c_alias_2 ON c_alias_2.c1 = a_alias_1.a1 - LEFT JOIN t5 e_alias_1 ON e_alias_1.e1 = a_alias_1.a1 - LEFT JOIN t6 f_alias_1 ON f_alias_1.f1 = a_alias_1.a1 -) t8) ON 1=1 -; - -SELECT 1 -FROM (v1 t1) -LEFT OUTER JOIN (v1 t2) ON 1=1 -LEFT OUTER JOIN (v1 t3) ON 1=1 -LEFT OUTER JOIN (v1 t4) ON 1=1 -LEFT OUTER JOIN (v1 t5) ON 1=1 -LEFT OUTER JOIN (v1 t6) ON 1=1 -LEFT OUTER JOIN (v1 t7) ON 1=1 -LEFT OUTER JOIN (v1 t8) ON 1=1 -; - -drop view v1; -drop table t1,t2,t3,t4,t5,t6; - --echo # ----------------------------------------------------------------- --echo # -- End of 5.3 tests. --echo # ----------------------------------------------------------------- @@ -5603,6 +5491,202 @@ SHOW CREATE VIEW v1; drop view v1; drop table t1; +CREATE TABLE IF NOT EXISTS t0 (f0 INT); +CREATE TABLE IF NOT EXISTS t1 (f1 INT); +CREATE TABLE IF NOT EXISTS t2 (f2 INT); +CREATE TABLE IF NOT EXISTS t3 (f3 INT); +CREATE TABLE IF NOT EXISTS t4 (f4 INT); +CREATE TABLE IF NOT EXISTS t5 (f5 INT); +CREATE TABLE IF NOT EXISTS t6 (f6 INT); +CREATE TABLE IF NOT EXISTS t7 (f7 INT); +CREATE TABLE IF NOT EXISTS t8 (f8 INT); +CREATE TABLE IF NOT EXISTS t9 (f9 INT); +CREATE TABLE IF NOT EXISTS t10 (f10 INT); +CREATE TABLE IF NOT EXISTS t11 (f11 INT); +CREATE TABLE IF NOT EXISTS t12 (f12 INT); +CREATE TABLE IF NOT EXISTS t13 (f13 INT); +CREATE TABLE IF NOT EXISTS t14 (f14 INT); +CREATE TABLE IF NOT EXISTS t15 (f15 INT); +CREATE TABLE IF NOT EXISTS t16 (f16 INT); +CREATE TABLE IF NOT EXISTS t17 (f17 INT); +CREATE TABLE IF NOT EXISTS t18 (f18 INT); +CREATE TABLE IF NOT EXISTS t19 (f19 INT); +CREATE TABLE IF NOT EXISTS t20 (f20 INT); +CREATE TABLE IF NOT EXISTS t21 (f21 INT); +CREATE TABLE IF NOT EXISTS t22 (f22 INT); +CREATE TABLE IF NOT EXISTS t23 (f23 INT); +CREATE TABLE IF NOT EXISTS t24 (f24 INT); +CREATE TABLE IF NOT EXISTS t25 (f25 INT); +CREATE TABLE IF NOT EXISTS t26 (f26 INT); +CREATE TABLE IF NOT EXISTS t27 (f27 INT); +CREATE TABLE IF NOT EXISTS t28 (f28 INT); +CREATE TABLE IF NOT EXISTS t29 (f29 INT); +CREATE TABLE IF NOT EXISTS t30 (f30 INT); +CREATE TABLE IF NOT EXISTS t31 (f31 INT); +CREATE TABLE IF NOT EXISTS t32 (f32 INT); +CREATE TABLE IF NOT EXISTS t33 (f33 INT); +CREATE TABLE IF NOT EXISTS t34 (f34 INT); +CREATE TABLE IF NOT EXISTS t35 (f35 INT); +CREATE TABLE IF NOT EXISTS t36 (f36 INT); +CREATE TABLE IF NOT EXISTS t37 (f37 INT); +CREATE TABLE IF NOT EXISTS t38 (f38 INT); +CREATE TABLE IF NOT EXISTS t39 (f39 INT); +CREATE TABLE IF NOT EXISTS t40 (f40 INT); +CREATE TABLE IF NOT EXISTS t41 (f41 INT); +CREATE TABLE IF NOT EXISTS t42 (f42 INT); +CREATE TABLE IF NOT EXISTS t43 (f43 INT); +CREATE TABLE IF NOT EXISTS t44 (f44 INT); +CREATE TABLE IF NOT EXISTS t45 (f45 INT); +CREATE TABLE IF NOT EXISTS t46 (f46 INT); +CREATE TABLE IF NOT EXISTS t47 (f47 INT); +CREATE TABLE IF NOT EXISTS t48 (f48 INT); +CREATE TABLE IF NOT EXISTS t49 (f49 INT); +CREATE TABLE IF NOT EXISTS t50 (f50 INT); +CREATE TABLE IF NOT EXISTS t51 (f51 INT); +CREATE TABLE IF NOT EXISTS t52 (f52 INT); +CREATE TABLE IF NOT EXISTS t53 (f53 INT); +CREATE TABLE IF NOT EXISTS t54 (f54 INT); +CREATE TABLE IF NOT EXISTS t55 (f55 INT); +CREATE TABLE IF NOT EXISTS t56 (f56 INT); +CREATE TABLE IF NOT EXISTS t57 (f57 INT); +CREATE TABLE IF NOT EXISTS t58 (f58 INT); +CREATE TABLE IF NOT EXISTS t59 (f59 INT); +CREATE TABLE IF NOT EXISTS t60 (f60 INT); +CREATE OR REPLACE VIEW v60 AS SELECT * FROM t60; + +EXPLAIN + SELECT t0.* +FROM t0 +JOIN t1 + ON t1.f1 = t0.f0 +LEFT JOIN t2 + ON t0.f0 = t2.f2 +LEFT JOIN t3 + ON t0.f0 = t3.f3 +LEFT JOIN t4 + ON t0.f0 = t4.f4 +LEFT JOIN t5 + ON t4.f4 = t5.f5 +LEFT JOIN t6 + ON t0.f0 = t6.f6 +LEFT JOIN t7 + ON t0.f0 = t7.f7 +LEFT JOIN t8 + ON t0.f0 = t8.f8 +LEFT JOIN t9 + ON t0.f0 = t9.f9 +LEFT JOIN t10 + ON t0.f0 = t10.f10 +LEFT JOIN t11 + ON t0.f0 = t11.f11 +LEFT JOIN t12 + ON t0.f0 = t12.f12 +LEFT JOIN t13 + ON t0.f0 = t13.f13 +LEFT JOIN t14 + ON t0.f0 = t14.f14 +LEFT JOIN t15 + ON t0.f0 = t15.f15 +LEFT JOIN t16 + ON t0.f0 = t16.f16 +LEFT JOIN t17 + ON t0.f0 = t17.f17 +LEFT JOIN t18 + ON t0.f0 = t18.f18 +LEFT JOIN t19 + ON t18.f18 = t19.f19 +LEFT JOIN t20 + ON t20.f20 = t19.f19 +LEFT JOIN t21 + ON t20.f20 = t21.f21 +LEFT JOIN t22 + ON t19.f19 = t22.f22 +LEFT JOIN t23 + ON t23.f23 = t0.f0 +LEFT JOIN t24 + ON t24.f24 = t23.f23 +LEFT JOIN t25 + ON t0.f0 = t25.f25 +LEFT JOIN t26 + ON t26.f26 = t0.f0 +LEFT JOIN t27 + ON t27.f27 = t0.f0 +LEFT JOIN t28 + ON t0.f0 = t28.f28 +LEFT JOIN t29 + ON t0.f0 = t29.f29 +LEFT JOIN t30 + ON t30.f30 = t0.f0 +LEFT JOIN t31 + ON t0.f0 = t31.f31 +LEFT JOIN t32 + ON t32.f32 = t31.f31 +LEFT JOIN t33 + ON t33.f33 = t0.f0 +LEFT JOIN t34 + ON t33.f33 = t34.f34 +LEFT JOIN t35 + ON t33.f33 = t35.f35 +LEFT JOIN t36 + ON t36.f36 = t0.f0 +LEFT JOIN t37 + ON t32.f32 = t37.f37 +LEFT JOIN t38 + ON t31.f31 = t38.f38 +LEFT JOIN t39 + ON t39.f39 = t0.f0 +LEFT JOIN t40 + ON t40.f40 = t39.f39 +LEFT JOIN t41 + ON t41.f41 = t0.f0 +LEFT JOIN t42 + ON t42.f42 = t41.f41 +LEFT JOIN t43 + ON t43.f43 = t41.f41 +LEFT JOIN t44 + ON t44.f44 = t0.f0 +LEFT JOIN t45 + ON t45.f45 = t0.f0 +LEFT JOIN t46 + ON t46.f46 = t0.f0 +LEFT JOIN t47 + ON t47.f47 = t0.f0 +LEFT JOIN t48 + ON t48.f48 = t0.f0 +LEFT JOIN t49 + ON t0.f0 = t49.f49 +LEFT JOIN t50 + ON t0.f0 = t50.f50 +LEFT JOIN t51 + ON t0.f0 = t51.f51 +LEFT JOIN t52 + ON t52.f52 = t0.f0 +LEFT JOIN t53 + ON t53.f53 = t0.f0 +LEFT JOIN t54 + ON t54.f54 = t0.f0 +LEFT JOIN t55 + ON t55.f55 = t0.f0 +LEFT JOIN t56 + ON t56.f56 = t0.f0 +LEFT JOIN t57 + ON t57.f57 = t0.f0 +LEFT JOIN t58 + ON t58.f58 = t57.f57 +LEFT JOIN t59 + ON t36.f36 = t59.f59 +LEFT JOIN v60 + ON t36.f36 = v60.f60 +; +drop table t0, t1, t2, t3, t4, t5, t6, t7, t8, t9, +t10, t11, t12, t13, t14, t15, t16, t17, t18, +t19, t20, t21, t22, t23, t24, t25, t26, t27, +t28, t29, t30, t31, t32, t33, t34, t35, t36, +t37, t38, t39, t40, t41, t42, t43, t44, t45, +t46, t47, t48, t49, t50, t51, t52, t53, t54, +t55, t56, t57, t58, t59,t60; +drop view v60; + --echo # ----------------------------------------------------------------- --echo # -- End of 5.5 tests. --echo # ----------------------------------------------------------------- diff --git a/mysql-test/unstable-tests b/mysql-test/unstable-tests index 34639ef32..9b0057994 100644 --- a/mysql-test/unstable-tests +++ b/mysql-test/unstable-tests @@ -23,70 +23,82 @@ # ############################################################################## +# Based on 10.1 c22ab56f0d690feee471e173a3d95acb642cd6dc + +main.alter_table : Modified in 10.1.34 main.alter_table_trans : MDEV-12084 - timeout main.analyze_stmt_slow_query_log : MDEV-12237 - Wrong result +main.assign_key_cache : Added in 10.1.34 +main.assign_key_cache_debug : Added in 10.1.34 main.auth_named_pipe : MDEV-14724 - System error 2 -main.create : Modified in 10.1.31 +main.connect : Modified in 10.1.33 +main.connect_debug : Added in 10.1.33 main.create_delayed : MDEV-10605 - failed with timeout +main.create_or_replace : Modified in 10.1.34 +main.ctype_ucs : Modified in 10.1.33 main.ctype_utf16le : MDEV-10675: timeout or extra warnings -main.ctype_utf8 : Modified in 10.1.30 -main.ctype_utf8mb4 : Modified in 10.1.30 -main.derived : Modified in 10.1.31 -main.dyncol : Modified in 10.1.31 +main.ctype_utf8mb4 : Modified in 10.1.33 +main.grant : Modified in 10.1.34 +main.grant_not_windows : Added in 10.1.34 main.events_2 : MDEV-13277 - Server crash main.events_bugs : MDEV-12892 - Crash in fill_schema_processlist +main.events_slowlog : MDEV-12821 - Wrong result main.events_restart : MDEV-12236 - Server shutdown problem -main.fulltext : Modified in 10.1.31 -main.func_concat : Modified in 10.1.31 -main.func_isnull : Modified in 10.1.31 -main.func_set : Modified in 10.1.30 -main.func_str : Modified in 10.1.30 -main.group_by : Modified in 10.1.30 -main.having : Modified in 10.1.30 +main.func_misc : Modified in 10.1.33 +main.func_str : Modified in 10.1.33 main.host_cache_size_functionality : MDEV-10606 - sporadic failure on shutdown main.index_intersect_innodb : MDEV-10643 - failed with timeout main.index_merge_innodb : MDEV-7142 - Wrong execution plan, timeout with valgrind main.innodb_mysql_lock : MDEV-7861 - sporadic lock detection failure -main.join_cache : Modified in 10.1.31 -main.join_outer : Modified in 10.1.30 +main.insert_select : Modified in 10.1.34 main.kill_processlist-6619 : MDEV-10793 - wrong result in processlist -main.mdev_14586 : Added in 10.1.31 +main.limit : Modified in 10.1.34 main.mdev-504 : MDEV-10607 - sporadic "can't connect" -main.mdev375 : MDEV-10607 - sporadic "can't connect" -main.merge : MDEV-10607 - sporadic "can't connect"; modified in 10.1.31 -main.myisam_optimize : Modified in 10.1.31 +main.mdev375 : MDEV-10607 - sporadic "can't connect"; modified in 10.1.33 +main.merge : MDEV-10607 - sporadic "can't connect" +main.myisam : Modified in 10.1.34 +main.myisam_recover : Modified in 10.1.33 +main.mysql : Modified in 10.1.34 main.mysql_client_test_nonblock : MDEV-15096 - exec failed +main.mysql_cp932 : Modified in 10.1.34 main.mysql_upgrade_noengine : MDEV-14355 - Plugin is busy -main.mysqldump-nl : Modified in 10.1.31 -main.mysqlslap : MDEV-11801 - timeout +main.mysqldump : Modified in 10.1.34 +main.mysqlslap : MDEV-11801 - timeout; modified in 10.1.34 main.mysqltest : MDEV-9269 - fails on Alpha -main.order_by : Modified in 10.1.31 +main.olap : Modified in 10.1.34 main.order_by_optimizer_innodb : MDEV-10683 - wrong execution plan -main.partition : Modified in 10.1.31 +main.parser : Modified in 10.1.33 +main.partition_debug_sync : MDEV-15669 - Deadlock found when trying to get lock main.partition_innodb_plugin : MDEV-12901 - Valgrind warnings -main.ps : MDEV-11017 - sporadic wrong Prepared_stmt_count; modified in 10.1.31 +main.ps : MDEV-11017 - sporadic wrong Prepared_stmt_count; modified in 10.1.34 main.query_cache : MDEV-12895 - Wrong result -main.query_cache_debug : Modified in 10.1.31 -main.range_vs_index_merge_innodb : MDEV-12637 - Timeout -main.repair : Modified in 10.1.31 +main.query_cache_debug : MDEV-15281 - Resize or similar command in progress +main.range_vs_index_merge_innodb : MDEV-15283 - Server has gone away +main.read_only_innodb : Modified in 10.1.34 +main.rename : Modified in 10.1.34 +main.selectivity : Modified in 10.1.34 main.set_statement : MDEV-13183 - Wrong result main.show_explain : MDEV-10674 - sporadic failure -main.sp : Modified in 10.1.31 +main.sp : Modified in 10.1.34 +main.sp-destruct : Modified in 10.1.33 +main.sp-innodb : Modified in 10.1.33 main.sp-security : MDEV-10607 - sporadic "can't connect" +main.stat_tables_par_innodb : MDEV-14155 - Wrong rounding +main.statistics : Modified in 10.1.33 +main.statistics_close : Added in 10.1.34 main.status : MDEV-8510 - sporadic wrong result -main.subselect : Modified in 10.1.31 +main.subselect4 : Modified in 10.1.33 main.subselect_innodb : MDEV-10614 - sporadic wrong results +main.subselect_sj : Modified in 10.1.33 +main.subselect_sj2_mat : Modified in 10.1.34 main.symlink-aria-11902 : MDEV-15098 - error 40 from storage engine main.symlink-myisam-11902 : MDEV-15098 - error 40 from storage engine main.tc_heuristic_recover : MDEV-15200 - wrong error on mysqld_stub_cmd -main.trigger : Modified in 10.1.30 +main.trigger : Modified in 10.1.34 main.type_blob : MDEV-15195 - Wrong result main.type_datetime_hires : MDEV-10687 - timeout -main.union : Modified in 10.1.31 -main.update_innodb : Modified in 10.1.31 -main.view : Modified in 10.1.30 -main.xa : Modified in 10.1.31 -main.xml : Modified in 10.1.31 +main.variables : Modified in 10.1.33 +main.view : Modified in 10.1.33 #---------------------------------------------------------------- @@ -97,8 +109,7 @@ archive.mysqlhotcopy_archive : MDEV-14726 - Table is marked as crashed #---------------------------------------------------------------- binlog.binlog_commit_wait : MDEV-10150 - Error: too much time elapsed -binlog.binlog_flush_binlogs_delete_domain : MDEV-14431 - Wrong error code; added in 10.1.30 -binlog.binlog_gtid_delete_domain_debug : Added in 10.1.30 +binlog.binlog_flush_binlogs_delete_domain : MDEV-14431 - Wrong error code binlog.binlog_killed : MDEV-12925 - Wrong result binlog.binlog_xa_recover : MDEV-8517 - Extra checkpoint @@ -114,28 +125,48 @@ binlog_encryption.rpl_typeconv : MDEV-14362 - Lost connection to MySQL serve #---------------------------------------------------------------- +connect.jdbc : Included file modified in 10.1.33 +connect.jdbc_new : Included file modified in 10.1.33 +connect.jdbc_oracle : Included file modified in 10.1.33 +connect.jdbc_postgresql : Modified in 10.1.33 +connect.json_java_2 : Included file modified in 10.1.33 +connect.json_java_3 : Included file modified in 10.1.33 +connect.json_mongo_c : Included file modified in 10.1.33 +connect.json_udf : Modified in 10.1.33 +connect.mongo_c : Included file modified in 10.1.33 +connect.mongo_java_2 : Included file modified in 10.1.33 +connect.mongo_java_3 : Included file modified in 10.1.33 +connect.mongo_test : Modified in 10.1.33 connect.pivot : MDEV-14803 - failed to discover table +connect.tbl_thread : Modified in 10.1.33 +connect.vcol : Added in 10.1.33 connect.zip : MDEV-13884 - Wrong result #---------------------------------------------------------------- -encryption.create_or_replace : MDEV-9359 - Assertion failure, MDEV-13516 - Assertion failure -encryption.debug_key_management : MDEV-13841 - Timeout on wait condition; modified in 10.1.31 -encryption.encrypt_and_grep : MDEV-13765 - Wrong result; modified in 10.1.31 -encryption.innodb-bad-key-change2 : MDEV-12632 - Valgrind warnings -encryption.innodb-compressed-blob : MDEV-14728 - Unable to get certificate -encryption.innodb-discard-import-change : MDEV-12632 - Valgrind warnings -encryption.innodb_encryption : Modified in 10.1.31 -encryption.innodb_encryption_discard_import : MDEV-12903 - Wrong result -encryption.innodb_encryption_filekeys : MDEV-9962 - timeouts +encryption.create_or_replace : MDEV-16115 - Trying to access tablespace +encryption.debug_key_management : MDEV-13841 - Timeout on wait condition +encryption.encrypt_and_grep : MDEV-13765 - Wrong result +encryption.innodb-bad-key-change : Modified in 10.1.34 +encryption.innodb-bad-key-change2 : Modified in 10.1.34 +encryption.innodb-bad-key-change4 : Modified in 10.1.34 +encryption.innodb-compressed-blob : MDEV-14728 - Unable to get certificate; modified in 10.1.34 +encryption.innodb-discard-import : Modified in 10.1.34 +encryption.innodb-encryption-disable : Modified in 10.1.34 +encryption.innodb_encryption_discard_import : MDEV-16116 - Wrong result; modified in 10.1.33 +encryption.innodb_encryption_filekeys : Modified in 10.1.33 encryption.innodb_encryption-page-compression : MDEV-12630 - crash or assertion failure -encryption.innodb_encryption_tables : MDEV-9359 - Assertion failure -encryption.innodb_first_page : MDEV-10689 - crashes +encryption.innodb_encryption_row_compressed : MDEV-16113 - Crash +encryption.innodb_first_page : MDEV-10689 - Crash encryption.innodb-first-page-read : MDEV-14356 - Timeout on wait condition -encryption.innodb_lotoftables : MDEV-11531 - InnoDB error -encryption.innodb-missing-key : MDEV-9359 - assertion failure +encryption.innodb-force-corrupt : Modified in 10.1.34 +encryption.innodb_lotoftables : MDEV-16111 - Wrong result +encryption.innodb-missing-key : Modified in 10.1.34 encryption.innodb-page_encryption : MDEV-10641 - mutex problem -encryption.innodb-redo-badkey : MDEV-12898 - Server hang on startup +encryption.innodb-read-only : MDEV-14728 - Unable to get certificate +encryption.innodb-redo-badkey : MDEV-12898 - Server hang on startup; modified in 10.1.34 +encryption.innodb-redo-nokeys : Modified in 10.1.34 +encryption.innodb-remove-encryption : MDEV-16493 - Timeout in wait condition; a dded in 10.1.33 encryption.innodb_scrub : MDEV-8139 - scrubbing tests need fixing encryption.innodb_scrub_background : MDEV-8139 - scrubbing tests need fixing encryption.innodb_scrub_compressed : MDEV-8139 - scrubbing tests need fixing @@ -152,7 +183,6 @@ federated.federated_innodb : MDEV-10617, MDEV-10417 - Wrong checksum, time federated.federated_partition : MDEV-10417 - Fails on Mips federated.federated_transactions : MDEV-10617, MDEV-10417 - Wrong checksum, timeouts, fails on Mips federated.federatedx : MDEV-10617 - Wrong checksum, timeouts -federated.net_thd_crash-12951 : Added in 10.1.31 #---------------------------------------------------------------- @@ -181,48 +211,60 @@ galera.MW-328A : MDEV-13876 - Wrong result #---------------------------------------------------------------- +handler.ps : Added in 10.1.34 + +#---------------------------------------------------------------- + +innodb.alter_partitioned_xa : Added in 10.1.33 innodb.binlog_consistent : MDEV-10618 - Server fails to start innodb.doublewrite : MDEV-12905 - Lost connection to MySQL server -innodb_fts.fulltext2 : MDEV-14727 - Long semaphore wait -innodb.innodb : Opt file modified in 10.1.31 innodb.innodb-64k-crash : MDEV-13872 - Failure and crash on startup +innodb.innodb-alter : Added in 10.1.34 innodb.innodb-alter-debug : MDEV-13182 - InnoDB: adjusting FSP_SPACE_FLAGS +innodb.innodb-alter-nullable : Modified in 10.1.33 innodb.innodb-alter-table : MDEV-10619 - Testcase timeout -innodb.innodb-autoinc : Modified in 10.1.30 -innodb.innodb-blob : MDEV-12053 - Client crash +innodb.innodb-blob : MDEV-12053 - Client crash; modified in 10.1.34 innodb.innodb_bug14147491 : MDEV-11808 - wrong error codes innodb.innodb_bug30423 : MDEV-7311 - Wrong number of rows in the plan innodb.innodb_bug48024 : MDEV-14352 - Assertion failure -innodb.innodb_corrupt_bit : Modified in 10.1.31 +innodb.innodb_bug54044 : Modified in 10.1.34 +innodb.innodb_defragment_small : Modified in 10.1.34 innodb.innodb-fk : MDEV-13832 - Assertion failure on shutdown -innodb.innodb-index-online : Modified in 10.1.31 -innodb.innodb-lru-force-no-free-page : Added in 10.1.31 innodb.innodb_max_recordsize_64k : MDEV-15203 - wrong result +innodb.innodb-mdev7046 : Modified in 10.1.34 +innodb.innodb-page_compression_default : Modified in 10.1.34 innodb.innodb-page_compression_lzma : MDEV-14353 - wrong result on Fedora 25 +innodb.innodb-page_compression_snappy : Modified in 10.1.34 innodb.innodb-page_compression_zip : MDEV-10641 - mutex problem -innodb.innodb-replace-debug : Modified in 10.1.31 innodb.innodb_stats : MDEV-10682 - wrong result innodb.innodb_sys_semaphore_waits : MDEV-10331 - wrong result innodb.innodb_zip_innochecksum2 : MDEV-13882 - Warning: difficult to find free blocks -innodb.log_file_size : MDEV-15202 - Cannot resize log files in read-only mode -innodb.recovery_shutdown : Added in 10.1.30 +innodb.lock_deleted : Added in 10.1.34 +innodb.log_file_size : MDEV-15668 - Not found pattern +innodb.recovery_shutdown : MDEV-15671 - Warning: database page corruption +innodb.rename_table : Added in 10.1.34 innodb.row_format_redundant : MDEV-15192 - Trying to access missing tablespace -innodb.table_definition_cache_debug : MDEV-14206 - Extra warning; opt file modified in 10.1.31 +innodb.table_definition_cache_debug : MDEV-14206 - Extra warning innodb.table_flags : MDEV-14363 - Operating system error number 2 -innodb_fts.fulltext_misc : MDEV-12636 - Valgrind warnings +#---------------------------------------------------------------- + +innodb_fts.basic : Added in 10.1.34 #---------------------------------------------------------------- -maria.lock : Modified in 10.1.31 -maria.maria : MDEV-14430 - Wrong result; modified in 10.1.31 -maria.repair : Added in 10.1.31 +maria.alter : Modified in 10.1.34 +maria.insert_select : MDEV-12757 - Timeout +maria.insert_select-7314 : MDEV-16492 - Timeout +maria.lock : Modified in 10.1.34 +maria.maria : MDEV-14430 - Wrong result; modified in 10.1.34 #---------------------------------------------------------------- -mariabackup.huge_lsn : Added in 10.1.31 -mariabackup.mdev-14447 : MDEV-15201 - Timeout; added in 10.1.30 -mariabackup.missing_ibd : Added in 10.1.31 +mariabackup.absolute_ibdata_paths : Added in 10.1.33 +mariabackup.backup_ssl : Added in 10.1.34 +mariabackup.incremental_encrypted : MDEV-15667 - Timeout +mariabackup.mdev-14447 : MDEV-15201 - Timeout mariabackup.xb_compressed_encrypted : MDEV-14812 - Segfault #---------------------------------------------------------------- @@ -235,12 +277,6 @@ mroonga/storage.index_multiple_column_unique_date_32bit_equal : Wrong resul mroonga/storage.index_multiple_column_unique_date_order_32bit_desc : Wrong result on Alpha mroonga/storage.index_multiple_column_unique_datetime_index_read : MDEV-8643 - valgrind warnings mroonga/storage.repair_table_no_index_file : MDEV-9364 - wrong result, MDEV-14807 - wrong error message -mroonga/storage.variable_query_log_file_disabled_empty_value : Modified in 10.1.30 -mroonga/storage.variable_query_log_file_disabled_null_value : Modified in 10.1.30 -mroonga/storage.variable_query_log_file_enabled_empty_value : Modified in 10.1.30 -mroonga/storage.variable_query_log_file_enabled_null_value : Modified in 10.1.30 -mroonga/storage.variable_query_log_file_new_value : Modified in 10.1.30 -mroonga/storage.variable_query_log_file_same_value : Modified in 10.1.30 mroonga/wrapper.repair_table_no_index_file : MDEV-14807 - Wrong error message @@ -255,10 +291,11 @@ multi_source.status_vars : MDEV-4632 - failed while waiting for Slave_received_h #---------------------------------------------------------------- -parts.partition_alter_innodb : Added in 10.1.30 -parts.partition_alter_maria : Modified in 10.1.30 -parts.partition_alter_myisam : Modified in 10.1.31 +parts.partition_alter_innodb : Include file modified in 10.1.33 +parts.partition_alter_maria : Include file modified in 10.1.33 +parts.partition_alter_myisam : Include file modified in 10.1.33 parts.partition_alter2_2_maria : MDEV-14364 - Lost connection to MySQL server during query +parts.partition_auto_increment_archive : MDEV-16491 - Table marked as crashed parts.partition_auto_increment_maria : MDEV-14430 - Wrong result parts.partition_debug_innodb : MDEV-15095 - table does not exist parts.partition_innodb_status_file : MDEV-12901 - Valgrind @@ -267,9 +304,10 @@ parts.partition_innodb_status_file : MDEV-12901 - Valgrind perfschema.func_file_io : MDEV-5708 - fails for s390x perfschema.func_mutex : MDEV-5708 - fails for s390x -perfschema.misc : Modified in 10.1.30 +perfschema.hostcache_ipv4_max_con : Modified in 10.1.33 +perfschema.hostcache_ipv6_max_con : Modified in 10.1.33 +perfschema.partition : Added in 10.1.34 perfschema.privilege_table_io : MDEV-13184 - Extra lines -perfschema.setup_actors : MDEV-10679 - rare crash perfschema.socket_summary_by_event_name_func : MDEV-10622 - Socket summary tables do not match perfschema.stage_mdl_global : MDEV-11803 - wrong result on slow builders perfschema.stage_mdl_table : MDEV-12638 - Wrong result @@ -277,29 +315,26 @@ perfschema.threads_mysql : MDEV-10677 - sporadic wrong resul #---------------------------------------------------------------- -plugins.binlog-simple_plugin_check : Added in 10.1.30 plugins.feedback_plugin_send : MDEV-7932 - ssl failed for url -plugins.server_audit : MDEV-9562 - crashes on sol10-sparc +plugins.processlist : Added in 10.1.34 +plugins.server_audit : MDEV-9562 - crashes on sol10-sparc; modified in 10.1.34 plugins.thread_pool_server_audit : MDEV-9562 - crashes on sol10-sparc #---------------------------------------------------------------- -roles.flush_roles-12366 : Added in 10.1.30 -roles.set_role-13655 : Added in 10.1.30 - -#---------------------------------------------------------------- - rpl.last_insert_id : MDEV-10625 - warnings in error log +rpl.rename : Added in 10.1.34 rpl.rpl_auto_increment : MDEV-10417 - Fails on Mips rpl.rpl_auto_increment_bug45679 : MDEV-10417 - Fails on Mips rpl.rpl_auto_increment_update_failure : MDEV-10625 - warnings in error log rpl.rpl_binlog_index : MDEV-9501 - Warning: failed registering on master +rpl.rpl_colSize : MDEV-16112 - Server crash rpl.rpl_ddl : MDEV-10417 - Fails on Mips rpl.rpl_domain_id_filter_io_crash : MDEV-14357 - Wrong result rpl.rpl_domain_id_filter_restart : MDEV-10684 - Wrong result rpl.rpl_gtid_basic : MDEV-10681 - server startup problem rpl.rpl_gtid_crash : MDEV-9501 - Warning: failed registering on master -rpl.rpl_gtid_delete_domain : MDEV-14463 - Timeout in include; added in 10.1.30 +rpl.rpl_gtid_delete_domain : MDEV-14463 - Timeout in include rpl.rpl_gtid_mdev9033 : MDEV-10680 - warnings rpl.rpl_gtid_reconnect : MDEV-14497 - Timeout rpl.rpl_gtid_stop_start : MDEV-10629 - Crash on shutdown, MDEV-12629 - Valgrind warnings @@ -310,29 +345,27 @@ rpl.rpl_insert_delayed : MDEV-9329 - Fails on Ubuntu/s390x rpl.rpl_insert_id : MDEV-15197 - Wrong result rpl.rpl_insert_ignore : MDEV-14365 - Lost connection to MySQL server during query rpl.rpl_invoked_features : MDEV-10417 - Fails on Mips -rpl.rpl_manual_change_index_file : Modified in 10.1.31 rpl.rpl_mariadb_slave_capability : MDEV-11018 - sporadic wrong events in binlog -rpl.rpl_mdev6020 : MDEV-10630, MDEV-10417 - Timeouts, fails on Mips +rpl.rpl_mdev6020 : MDEV-10417 - Fails on Mips +rpl.rpl_mixed_implicit_commit_binlog : Modified in 10.1.34 rpl.rpl_mixed_mixing_engines : MDEV-14489 - Sync slave with master failed rpl.rpl_non_direct_mixed_mixing_engines : MDEV-14489 - Sync slave with master failed -rpl.rpl_non_direct_row_mixing_engines : MDEV-14491 - Long semaphore wait rpl.rpl_non_direct_stm_mixing_engines : MDEV-14489 - Sync slave with master failed rpl.rpl_parallel : MDEV-10653 - Timeouts rpl.rpl_parallel_mdev6589 : MDEV-12979 - Assertion failure rpl.rpl_parallel_multilevel2 : MDEV-14723 - Timeout -rpl.rpl_parallel_optimistic : MDEV-10511 - Timeout +rpl.rpl_parallel_optimistic : MDEV-10511 - Timeout; modified in 10.1.34 rpl.rpl_parallel_retry : MDEV-11119 - Server crash rpl.rpl_parallel_temptable : MDEV-10356 - Crash in close_thread_tables rpl.rpl_partition_innodb : MDEV-10417 - Fails on Mips rpl.rpl_password_boundaries : MDEV-11534 - Slave IO warnings +rpl.rpl_row_basic_2myisam : MDEV-13875 - command "diff_files" failed rpl.rpl_row_drop_create_temp_table : MDEV-14487 - Wrong result rpl.rpl_row_img_blobs : MDEV-13875 - command "diff_files" failed rpl.rpl_row_img_eng_min : MDEV-13875 - command "diff_files" failed rpl.rpl_row_img_eng_noblob : MDEV-13875 - command "diff_files" failed +rpl.rpl_row_implicit_commit_binlog : Modified in 10.1.34 rpl.rpl_row_index_choice : MDEV-15196 - Slave crash -rpl.rpl_row_log : Include file modified in 10.1.30 -rpl.rpl_row_log_innodb : Include file modified in 10.1.30 -rpl.rpl_row_mixing_engines : MDEV-14491 - Long semaphore wait rpl.rpl_row_sp001 : MDEV-9329 - Fails on Ubuntu/s390x rpl.rpl_semi_sync : MDEV-11220 - Wrong result rpl.rpl_semi_sync_after_sync : MDEV-14366 - Wrong result @@ -344,7 +377,7 @@ rpl.rpl_show_slave_hosts : MDEV-10681 - server startup problem rpl.rpl_skip_replication : MDEV-9268 - Fails with timeout in sync_slave_with_master on Alpha rpl.rpl_slave_grp_exec : MDEV-10514 - Unexpected deadlock rpl.rpl_start_stop_slave : MDEV-13567 - Replication failure -rpl.rpl_stm_log : Include file modified in 10.1.30 +rpl.rpl_stm_implicit_commit_binlog : Modified in 10.1.34 rpl.rpl_stm_mixing_engines : MDEV-14489 - Sync slave with master failed rpl.rpl_stm_relay_ign_space : MDEV-14360 - Test assertion rpl.rpl_sync : MDEV-10633 - Database page corruption @@ -355,16 +388,11 @@ rpl.sec_behind_master-5114 : MDEV-13878 - Wrong result spider.* : MDEV-9329 - tests are too memory-consuming -spider.spider_fixes : MDEV-12900 - Valgrind -spider.spider_fixes_part : MDEV-12900 - Valgrind - -spider/bg.basic_sql : MDEV-12900 - Valgrind spider/bg.direct_aggregate : MDEV-7098 - Trying to unlock mutex that wasn't locked spider/bg.direct_aggregate_part : MDEV-7098 - Trying to unlock mutex that wasn't locked -spider/bg.function : MDEV-12900 - Valgrind -spider/bg.ha : MDEV-7914 - Crash, MDEV-9329 - failures on s390x -spider/bg.ha_part : MDEV-7914 - Crash, MDEV-9329 - Fails on Ubuntu/s390x -spider/bg.spider_fixes : MDEV-7098 -Mutex problem, MDEV-9329 - failures on s390x, MDEV-12900 - Valgrind +spider/bg.ha : MDEV-9329 - failures on s390x +spider/bg.ha_part : MDEV-9329 - Fails on Ubuntu/s390x +spider/bg.spider_fixes : MDEV-7098 -Mutex problem, MDEV-9329 - failures on s390x spider/bg.spider3_fixes : MDEV-12639 - Packets out of order spider/bg.vp_fixes : MDEV-9329 - Fails on Ubuntu/s390x @@ -386,16 +414,17 @@ stress.ddl_innodb : MDEV-10635 - Testcase timeout sys_vars.autocommit_func2 : MDEV-9329 - Fails on Ubuntu/s390x sys_vars.keep_files_on_create_basic : MDEV-10676 - timeout -sys_vars.innodb_fatal_semaphore_wait_threshold : MDEV-10513 - crashes -sys_vars.innodb_print_lock_wait_timeout_info_basic : Added in 10.1.31 sys_vars.log_slow_admin_statements_func : MDEV-12235 - Server crash +sys_vars.max_prepared_stmt_count_basic : Modified in 10.1.33 sys_vars.rpl_init_slave_func : MDEV-10149 - wrong results +sys_vars.sysvars_innodb : Opt file modified in 10.1.33 +sys_vars.sysvars_server_embedded : Opt file added in 10.1.33 +sys_vars.sysvars_server_notembedded : Opt file added in 10.1.33 sys_vars.thread_cache_size_func : MDEV-11775 - Wrong result sys_vars.wait_timeout_func : MDEV-12896 - Wrong result #---------------------------------------------------------------- -tokudb.card_scale_percent : Modified in 10.1.31 tokudb.change_column_all_1000_10 : MDEV-12640 - Crash tokudb.change_column_bin : MDEV-12640 - Crash tokudb.change_column_char : MDEV-12822 - Lost connection to MySQL server @@ -405,35 +434,25 @@ tokudb.cluster_filter_unpack_varchar : MDEV-10636 - Wrong execution plan tokudb.dir_per_db : MDEV-11537 - Wrong result tokudb.dir_per_db_rename_to_nonexisting_schema : MDEV-14359 - Directory not empty tokudb.hotindex-insert-bigchar : MDEV-12640 - Crash +tokudb.hotindex-insert-0 : MDEV-15271 - Timeout tokudb.hotindex-insert-1 : MDEV-13870 - Lost connection to MySQL server tokudb.hotindex-update-0 : MDEV-15198 - Timeout tokudb.hotindex-update-1 : MDEV-12640 - Crash -tokudb.locking-read-repeatable-read-1 : Added in 10.1.31 -tokudb.locking-read-repeatable-read-2 : Added in 10.1.31 -tokudb.nonflushing_analyze_debug : Added in 10.1.31 -tokudb.row_format : Modified in 10.1.31 tokudb.rows-32m-rand-insert : MDEV-12640 - Crash tokudb.rows-32m-seq-insert : MDEV-12640 - Crash +tokudb.savepoint-5 : MDEV-15280 - Wrong result tokudb.type_datetime : MDEV-15193 - Wrong result tokudb_bugs.checkpoint_lock : MDEV-10637 - Wrong processlist output tokudb_bugs.checkpoint_lock_3 : MDEV-10637 - Wrong processlist output +tokudb_bugs.db917 : Modified in 10.1.33 tokudb_bugs.xa : MDEV-11804 - Lock wait timeout -tokudb_mariadb.mdev6657 : MDEV-12737 - Wrong plan, valgrind warnings - -tokudb_parts.nonflushing_analyze_debug : Added in 10.1.31 - -tokudb_perfschema.crash_tokudb : Added in 10.1.31 -tokudb_perfschema.start_server_tokudb : Added in 10.1.31 - -rpl-tokudb.rpl_tokudb_row_log : Include file modified in 10.1.30 -rpl-tokudb.rpl_tokudb_stm_log : Include file modified in 10.1.30 - #---------------------------------------------------------------- unit.lf : MDEV-12897 - Signal 11 thrown unit.ma_test_loghandler : MDEV-10638 - record read not ok +unit.my_atomic : MDEV-15670 - Signal 11 thrown #---------------------------------------------------------------- @@ -446,5 +465,6 @@ wsrep.binlog_format : MDEV-11532 - WSREP has not yet prepared node wsrep.foreign_key : MDEV-14725 - WSREP has not yet prepared node wsrep.mdev_6832 : MDEV-14195 - Failure upon check-testcase wsrep.pool_of_threads : MDEV-12234 - Library problem on Power +wsrep.variables : Modified in 10.1.34 wsrep_info.plugin : MDEV-12909 - Wrong result diff --git a/mysys/lf_hash.c b/mysys/lf_hash.c index 7354b1699..5e407e9ca 100644 --- a/mysys/lf_hash.c +++ b/mysys/lf_hash.c @@ -1,5 +1,5 @@ -/* Copyright (c) 2006, 2010, Oracle and/or its affiliates. - Copyright (c) 2009, 2016, MariaDB +/* Copyright (c) 2006, 2018, Oracle and/or its affiliates. + Copyright (c) 2009, 2018, MariaDB 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 @@ -102,8 +102,8 @@ static int l_find(LF_SLIST * volatile *head, CHARSET_INFO *cs, uint32 hashnr, do { /* PTR() isn't necessary below, head is a dummy node */ cursor->curr= (LF_SLIST *)(*cursor->prev); lf_pin(pins, 1, cursor->curr); - } while (*cursor->prev != (intptr)cursor->curr && LF_BACKOFF); - + } while (my_atomic_loadptr((void**)cursor->prev) != cursor->curr && + LF_BACKOFF); for (;;) { if (unlikely(!cursor->curr)) diff --git a/mysys/ma_dyncol.c b/mysys/ma_dyncol.c index 1c5a41522..53edfc5d8 100644 --- a/mysys/ma_dyncol.c +++ b/mysys/ma_dyncol.c @@ -3833,7 +3833,7 @@ my_bool dynstr_append_json_quoted(DYNAMIC_STRING *str, for (i= 0; i < len; i++) { register char c= append[i]; - if (unlikely(c <= 0x1F)) + if (unlikely(((uchar)c) <= 0x1F)) { if (lim < 5) { diff --git a/mysys/mf_iocache.c b/mysys/mf_iocache.c index a0ddc3e40..56b1ae3fc 100644 --- a/mysys/mf_iocache.c +++ b/mysys/mf_iocache.c @@ -440,7 +440,7 @@ my_bool reinit_io_cache(IO_CACHE *info, enum cache_type type, info->read_end= info->buffer; _my_b_encr_read(info, 0, 0); /* prefill the buffer */ info->write_pos= info->read_pos; - info->pos_in_file+= info->buffer_length; + info->seek_not_done=1; } } else diff --git a/mysys/my_addr_resolve.c b/mysys/my_addr_resolve.c index 82043dc03..b82792fc4 100644 --- a/mysys/my_addr_resolve.c +++ b/mysys/my_addr_resolve.c @@ -214,7 +214,7 @@ int my_addr_resolve(void *ptr, my_addr_loc *loc) strnmov(addr2line_binary, info.dli_fname, sizeof(addr2line_binary)); } offset = info.dli_fbase; - len= my_snprintf(input, sizeof(input), "%p\n", ptr - offset); + len= my_snprintf(input, sizeof(input), "%08x\n", (ulonglong)(ptr - offset)); if (write(in[1], input, len) <= 0) return 1; diff --git a/mysys/my_default.c b/mysys/my_default.c index 2358aed8f..5c4e33141 100644 --- a/mysys/my_default.c +++ b/mysys/my_default.c @@ -631,7 +631,7 @@ int my_load_defaults(const char *conf_file, const char **groups, if (!my_getopt_is_args_separator((*argv)[i])) /* skip arguments separator */ printf("%s ", (*argv)[i]); puts(""); - exit(0); + DBUG_RETURN(4); } if (default_directories) @@ -641,7 +641,7 @@ int my_load_defaults(const char *conf_file, const char **groups, err: fprintf(stderr,"Fatal error in defaults handling. Program aborted\n"); - return 2; + DBUG_RETURN(2); } @@ -1099,10 +1099,12 @@ void print_defaults(const char *conf_file, const char **groups) } } puts("\nThe following options may be given as the first argument:\n\ ---print-defaults Print the program argument list and exit.\n\ ---no-defaults Don't read default options from any option file.\n\ ---defaults-file=# Only read default options from the given file #.\n\ ---defaults-extra-file=# Read this file after the global files are read."); +--print-defaults Print the program argument list and exit.\n\ +--no-defaults Don't read default options from any option file.\n\ +The following specify which files/extra groups are read (specified before remaining options):\n\ +--defaults-file=# Only read default options from the given file #.\n\ +--defaults-extra-file=# Read this file after the global files are read.\n\ +--defaults-group-suffix=# Additionally read default groups with # appended as a suffix."); } diff --git a/mysys/my_symlink.c b/mysys/my_symlink.c index 06f6a29e4..8580fac35 100644 --- a/mysys/my_symlink.c +++ b/mysys/my_symlink.c @@ -244,7 +244,7 @@ const char *my_open_parent_dir_nosymlinks(const char *pathname, int *pdfd) return pathname + (s - buf); } - fd = openat(dfd, s, O_NOFOLLOW | O_PATH); + fd = openat(dfd, s, O_NOFOLLOW | O_PATH | O_CLOEXEC); if (fd < 0) goto err; diff --git a/pcre/AUTHORS b/pcre/AUTHORS index 291657cae..eb9b1a44b 100644 --- a/pcre/AUTHORS +++ b/pcre/AUTHORS @@ -8,7 +8,7 @@ Email domain: cam.ac.uk University of Cambridge Computing Service, Cambridge, England. -Copyright (c) 1997-2017 University of Cambridge +Copyright (c) 1997-2018 University of Cambridge All rights reserved @@ -19,7 +19,7 @@ Written by: Zoltan Herczeg Email local part: hzmester Emain domain: freemail.hu -Copyright(c) 2010-2017 Zoltan Herczeg +Copyright(c) 2010-2018 Zoltan Herczeg All rights reserved. @@ -30,7 +30,7 @@ Written by: Zoltan Herczeg Email local part: hzmester Emain domain: freemail.hu -Copyright(c) 2009-2017 Zoltan Herczeg +Copyright(c) 2009-2018 Zoltan Herczeg All rights reserved. diff --git a/pcre/ChangeLog b/pcre/ChangeLog index 590a75428..7b53195f6 100644 --- a/pcre/ChangeLog +++ b/pcre/ChangeLog @@ -4,6 +4,59 @@ ChangeLog for PCRE Note that the PCRE 8.xx series (PCRE1) is now in a bugfix-only state. All development is happening in the PCRE2 10.xx series. + +Version 8.42 20-March-2018 +-------------------------- + +1. Fixed a MIPS issue in the JIT compiler reported by Joshua Kinard. + +2. Fixed outdated real_pcre definitions in pcre.h.in (patch by Evgeny Kotkov). + +3. pcregrep was truncating components of file names to 128 characters when +processing files with the -r option, and also (some very odd code) truncating +path names to 512 characters. There is now a check on the absolute length of +full path file names, which may be up to 2047 characters long. + +4. Using pcre_dfa_exec(), in UTF mode when UCP support was not defined, there +was the possibility of a false positive match when caselessly matching a "not +this character" item such as [^\x{1234}] (with a code point greater than 127) +because the "other case" variable was not being initialized. + +5. Although pcre_jit_exec checks whether the pattern is compiled +in a given mode, it was also expected that at least one mode is available. +This is fixed and pcre_jit_exec returns with PCRE_ERROR_JIT_BADOPTION +when the pattern is not optimized by JIT at all. + +6. The line number and related variables such as match counts in pcregrep +were all int variables, causing overflow when files with more than 2147483647 +lines were processed (assuming 32-bit ints). They have all been changed to +unsigned long ints. + +7. If a backreference with a minimum repeat count of zero was first in a +pattern, apart from assertions, an incorrect first matching character could be +recorded. For example, for the pattern /(?=(a))\1?b/, "b" was incorrectly set +as the first character of a match. + +8. Fix out-of-bounds read for partial matching of /./ against an empty string +when the newline type is CRLF. + +9. When matching using the the REG_STARTEND feature of the POSIX API with a +non-zero starting offset, unset capturing groups with lower numbers than a +group that did capture something were not being correctly returned as "unset" +(that is, with offset values of -1). + +10. Matching the pattern /(*UTF)\C[^\v]+\x80/ against an 8-bit string +containing multi-code-unit characters caused bad behaviour and possibly a +crash. This issue was fixed for other kinds of repeat in release 8.37 by change +38, but repeating character classes were overlooked. + +11. A small fix to pcregrep to avoid compiler warnings for -Wformat-overflow=2. + +12. Added --enable-jit=auto support to configure.ac. + +13. Fix misleading error message in configure.ac. + + Version 8.41 05-July-2017 ------------------------- diff --git a/pcre/INSTALL b/pcre/INSTALL index 209984075..8865734f8 100644 --- a/pcre/INSTALL +++ b/pcre/INSTALL @@ -1,8 +1,8 @@ Installation Instructions ************************* -Copyright (C) 1994-1996, 1999-2002, 2004-2013 Free Software Foundation, -Inc. + Copyright (C) 1994-1996, 1999-2002, 2004-2016 Free Software +Foundation, Inc. Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright @@ -12,97 +12,96 @@ without warranty of any kind. Basic Installation ================== - Briefly, the shell command `./configure && make && make install' + Briefly, the shell command './configure && make && make install' should configure, build, and install this package. The following -more-detailed instructions are generic; see the `README' file for +more-detailed instructions are generic; see the 'README' file for instructions specific to this package. Some packages provide this -`INSTALL' file but do not implement all of the features documented +'INSTALL' file but do not implement all of the features documented below. The lack of an optional feature in a given package is not necessarily a bug. More recommendations for GNU packages can be found in *note Makefile Conventions: (standards)Makefile Conventions. - The `configure' shell script attempts to guess correct values for + The 'configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses -those values to create a `Makefile' in each directory of the package. -It may also create one or more `.h' files containing system-dependent -definitions. Finally, it creates a shell script `config.status' that +those values to create a 'Makefile' in each directory of the package. +It may also create one or more '.h' files containing system-dependent +definitions. Finally, it creates a shell script 'config.status' that you can run in the future to recreate the current configuration, and a -file `config.log' containing compiler output (useful mainly for -debugging `configure'). +file 'config.log' containing compiler output (useful mainly for +debugging 'configure'). - It can also use an optional file (typically called `config.cache' -and enabled with `--cache-file=config.cache' or simply `-C') that saves -the results of its tests to speed up reconfiguring. Caching is -disabled by default to prevent problems with accidental use of stale -cache files. + It can also use an optional file (typically called 'config.cache' and +enabled with '--cache-file=config.cache' or simply '-C') that saves the +results of its tests to speed up reconfiguring. Caching is disabled by +default to prevent problems with accidental use of stale cache files. If you need to do unusual things to compile the package, please try -to figure out how `configure' could check whether to do them, and mail -diffs or instructions to the address given in the `README' so they can +to figure out how 'configure' could check whether to do them, and mail +diffs or instructions to the address given in the 'README' so they can be considered for the next release. If you are using the cache, and at -some point `config.cache' contains results you don't want to keep, you +some point 'config.cache' contains results you don't want to keep, you may remove or edit it. - The file `configure.ac' (or `configure.in') is used to create -`configure' by a program called `autoconf'. You need `configure.ac' if -you want to change it or regenerate `configure' using a newer version -of `autoconf'. + The file 'configure.ac' (or 'configure.in') is used to create +'configure' by a program called 'autoconf'. You need 'configure.ac' if +you want to change it or regenerate 'configure' using a newer version of +'autoconf'. The simplest way to compile this package is: - 1. `cd' to the directory containing the package's source code and type - `./configure' to configure the package for your system. + 1. 'cd' to the directory containing the package's source code and type + './configure' to configure the package for your system. - Running `configure' might take a while. While running, it prints + Running 'configure' might take a while. While running, it prints some messages telling which features it is checking for. - 2. Type `make' to compile the package. + 2. Type 'make' to compile the package. - 3. Optionally, type `make check' to run any self-tests that come with + 3. Optionally, type 'make check' to run any self-tests that come with the package, generally using the just-built uninstalled binaries. - 4. Type `make install' to install the programs and any data files and + 4. Type 'make install' to install the programs and any data files and documentation. When installing into a prefix owned by root, it is recommended that the package be configured and built as a regular - user, and only the `make install' phase executed with root + user, and only the 'make install' phase executed with root privileges. - 5. Optionally, type `make installcheck' to repeat any self-tests, but + 5. Optionally, type 'make installcheck' to repeat any self-tests, but this time using the binaries in their final installed location. This target does not install anything. Running this target as a - regular user, particularly if the prior `make install' required + regular user, particularly if the prior 'make install' required root privileges, verifies that the installation completed correctly. 6. You can remove the program binaries and object files from the - source code directory by typing `make clean'. To also remove the - files that `configure' created (so you can compile the package for - a different kind of computer), type `make distclean'. There is - also a `make maintainer-clean' target, but that is intended mainly + source code directory by typing 'make clean'. To also remove the + files that 'configure' created (so you can compile the package for + a different kind of computer), type 'make distclean'. There is + also a 'make maintainer-clean' target, but that is intended mainly for the package's developers. If you use it, you may have to get all sorts of other programs in order to regenerate files that came with the distribution. - 7. Often, you can also type `make uninstall' to remove the installed + 7. Often, you can also type 'make uninstall' to remove the installed files again. In practice, not all packages have tested that uninstallation works correctly, even though it is required by the GNU Coding Standards. - 8. Some packages, particularly those that use Automake, provide `make + 8. Some packages, particularly those that use Automake, provide 'make distcheck', which can by used by developers to test that all other - targets like `make install' and `make uninstall' work correctly. + targets like 'make install' and 'make uninstall' work correctly. This target is generally not run by end users. Compilers and Options ===================== Some systems require unusual options for compilation or linking that -the `configure' script does not know about. Run `./configure --help' +the 'configure' script does not know about. Run './configure --help' for details on some of the pertinent environment variables. - You can give `configure' initial values for configuration parameters -by setting variables in the command line or in the environment. Here -is an example: + You can give 'configure' initial values for configuration parameters +by setting variables in the command line or in the environment. Here is +an example: ./configure CC=c99 CFLAGS=-g LIBS=-lposix @@ -113,21 +112,21 @@ Compiling For Multiple Architectures You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their -own directory. To do this, you can use GNU `make'. `cd' to the +own directory. To do this, you can use GNU 'make'. 'cd' to the directory where you want the object files and executables to go and run -the `configure' script. `configure' automatically checks for the -source code in the directory that `configure' is in and in `..'. This -is known as a "VPATH" build. +the 'configure' script. 'configure' automatically checks for the source +code in the directory that 'configure' is in and in '..'. This is known +as a "VPATH" build. - With a non-GNU `make', it is safer to compile the package for one + With a non-GNU 'make', it is safer to compile the package for one architecture at a time in the source code directory. After you have -installed the package for one architecture, use `make distclean' before +installed the package for one architecture, use 'make distclean' before reconfiguring for another architecture. On MacOS X 10.5 and later systems, you can create libraries and executables that work on multiple system types--known as "fat" or -"universal" binaries--by specifying multiple `-arch' options to the -compiler but only a single `-arch' option to the preprocessor. Like +"universal" binaries--by specifying multiple '-arch' options to the +compiler but only a single '-arch' option to the preprocessor. Like this: ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ @@ -136,105 +135,104 @@ this: This is not guaranteed to produce working output in all cases, you may have to build one architecture at a time and combine the results -using the `lipo' tool if you have problems. +using the 'lipo' tool if you have problems. Installation Names ================== - By default, `make install' installs the package's commands under -`/usr/local/bin', include files under `/usr/local/include', etc. You -can specify an installation prefix other than `/usr/local' by giving -`configure' the option `--prefix=PREFIX', where PREFIX must be an + By default, 'make install' installs the package's commands under +'/usr/local/bin', include files under '/usr/local/include', etc. You +can specify an installation prefix other than '/usr/local' by giving +'configure' the option '--prefix=PREFIX', where PREFIX must be an absolute file name. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you -pass the option `--exec-prefix=PREFIX' to `configure', the package uses +pass the option '--exec-prefix=PREFIX' to 'configure', the package uses PREFIX as the prefix for installing programs and libraries. Documentation and other data files still use the regular prefix. In addition, if you use an unusual directory layout you can give -options like `--bindir=DIR' to specify different values for particular -kinds of files. Run `configure --help' for a list of the directories -you can set and what kinds of files go in them. In general, the -default for these options is expressed in terms of `${prefix}', so that -specifying just `--prefix' will affect all of the other directory +options like '--bindir=DIR' to specify different values for particular +kinds of files. Run 'configure --help' for a list of the directories +you can set and what kinds of files go in them. In general, the default +for these options is expressed in terms of '${prefix}', so that +specifying just '--prefix' will affect all of the other directory specifications that were not explicitly provided. The most portable way to affect installation locations is to pass the -correct locations to `configure'; however, many packages provide one or +correct locations to 'configure'; however, many packages provide one or both of the following shortcuts of passing variable assignments to the -`make install' command line to change installation locations without +'make install' command line to change installation locations without having to reconfigure or recompile. The first method involves providing an override variable for each -affected directory. For example, `make install +affected directory. For example, 'make install prefix=/alternate/directory' will choose an alternate location for all directory configuration variables that were expressed in terms of -`${prefix}'. Any directories that were specified during `configure', -but not in terms of `${prefix}', must each be overridden at install -time for the entire installation to be relocated. The approach of -makefile variable overrides for each directory variable is required by -the GNU Coding Standards, and ideally causes no recompilation. -However, some platforms have known limitations with the semantics of -shared libraries that end up requiring recompilation when using this -method, particularly noticeable in packages that use GNU Libtool. - - The second method involves providing the `DESTDIR' variable. For -example, `make install DESTDIR=/alternate/directory' will prepend -`/alternate/directory' before all installation names. The approach of -`DESTDIR' overrides is not required by the GNU Coding Standards, and +'${prefix}'. Any directories that were specified during 'configure', +but not in terms of '${prefix}', must each be overridden at install time +for the entire installation to be relocated. The approach of makefile +variable overrides for each directory variable is required by the GNU +Coding Standards, and ideally causes no recompilation. However, some +platforms have known limitations with the semantics of shared libraries +that end up requiring recompilation when using this method, particularly +noticeable in packages that use GNU Libtool. + + The second method involves providing the 'DESTDIR' variable. For +example, 'make install DESTDIR=/alternate/directory' will prepend +'/alternate/directory' before all installation names. The approach of +'DESTDIR' overrides is not required by the GNU Coding Standards, and does not work on platforms that have drive letters. On the other hand, it does better at avoiding recompilation issues, and works well even -when some directory options were not specified in terms of `${prefix}' -at `configure' time. +when some directory options were not specified in terms of '${prefix}' +at 'configure' time. Optional Features ================= If the package supports it, you can cause programs to be installed -with an extra prefix or suffix on their names by giving `configure' the -option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. - - Some packages pay attention to `--enable-FEATURE' options to -`configure', where FEATURE indicates an optional part of the package. -They may also pay attention to `--with-PACKAGE' options, where PACKAGE -is something like `gnu-as' or `x' (for the X Window System). The -`README' should mention any `--enable-' and `--with-' options that the +with an extra prefix or suffix on their names by giving 'configure' the +option '--program-prefix=PREFIX' or '--program-suffix=SUFFIX'. + + Some packages pay attention to '--enable-FEATURE' options to +'configure', where FEATURE indicates an optional part of the package. +They may also pay attention to '--with-PACKAGE' options, where PACKAGE +is something like 'gnu-as' or 'x' (for the X Window System). The +'README' should mention any '--enable-' and '--with-' options that the package recognizes. - For packages that use the X Window System, `configure' can usually + For packages that use the X Window System, 'configure' can usually find the X include and library files automatically, but if it doesn't, -you can use the `configure' options `--x-includes=DIR' and -`--x-libraries=DIR' to specify their locations. +you can use the 'configure' options '--x-includes=DIR' and +'--x-libraries=DIR' to specify their locations. Some packages offer the ability to configure how verbose the -execution of `make' will be. For these packages, running `./configure +execution of 'make' will be. For these packages, running './configure --enable-silent-rules' sets the default to minimal output, which can be -overridden with `make V=1'; while running `./configure +overridden with 'make V=1'; while running './configure --disable-silent-rules' sets the default to verbose, which can be -overridden with `make V=0'. +overridden with 'make V=0'. Particular systems ================== - On HP-UX, the default C compiler is not ANSI C compatible. If GNU -CC is not installed, it is recommended to use the following options in + On HP-UX, the default C compiler is not ANSI C compatible. If GNU CC +is not installed, it is recommended to use the following options in order to use an ANSI C compiler: ./configure CC="cc -Ae -D_XOPEN_SOURCE=500" and if that doesn't work, install pre-built binaries of GCC for HP-UX. - HP-UX `make' updates targets which have the same time stamps as -their prerequisites, which makes it generally unusable when shipped -generated files such as `configure' are involved. Use GNU `make' -instead. + HP-UX 'make' updates targets which have the same time stamps as their +prerequisites, which makes it generally unusable when shipped generated +files such as 'configure' are involved. Use GNU 'make' instead. On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot -parse its `' header file. The option `-nodtk' can be used as -a workaround. If GNU CC is not installed, it is therefore recommended -to try +parse its '' header file. The option '-nodtk' can be used as a +workaround. If GNU CC is not installed, it is therefore recommended to +try ./configure CC="cc" @@ -242,26 +240,26 @@ and if that doesn't work, try ./configure CC="cc -nodtk" - On Solaris, don't put `/usr/ucb' early in your `PATH'. This + On Solaris, don't put '/usr/ucb' early in your 'PATH'. This directory contains several dysfunctional programs; working variants of -these programs are available in `/usr/bin'. So, if you need `/usr/ucb' -in your `PATH', put it _after_ `/usr/bin'. +these programs are available in '/usr/bin'. So, if you need '/usr/ucb' +in your 'PATH', put it _after_ '/usr/bin'. - On Haiku, software installed for all users goes in `/boot/common', -not `/usr/local'. It is recommended to use the following options: + On Haiku, software installed for all users goes in '/boot/common', +not '/usr/local'. It is recommended to use the following options: ./configure --prefix=/boot/common Specifying the System Type ========================== - There may be some features `configure' cannot figure out + There may be some features 'configure' cannot figure out automatically, but needs to determine by the type of machine the package will run on. Usually, assuming the package is built to be run on the -_same_ architectures, `configure' can figure that out, but if it prints +_same_ architectures, 'configure' can figure that out, but if it prints a message saying it cannot guess the machine type, give it the -`--build=TYPE' option. TYPE can either be a short name for the system -type, such as `sun4', or a canonical name which has the form: +'--build=TYPE' option. TYPE can either be a short name for the system +type, such as 'sun4', or a canonical name which has the form: CPU-COMPANY-SYSTEM @@ -270,101 +268,101 @@ where SYSTEM can have one of these forms: OS KERNEL-OS - See the file `config.sub' for the possible values of each field. If -`config.sub' isn't included in this package, then this package doesn't + See the file 'config.sub' for the possible values of each field. If +'config.sub' isn't included in this package, then this package doesn't need to know the machine type. If you are _building_ compiler tools for cross-compiling, you should -use the option `--target=TYPE' to select the type of system they will +use the option '--target=TYPE' to select the type of system they will produce code for. If you want to _use_ a cross compiler, that generates code for a platform different from the build platform, you should specify the "host" platform (i.e., that on which the generated programs will -eventually be run) with `--host=TYPE'. +eventually be run) with '--host=TYPE'. Sharing Defaults ================ - If you want to set default values for `configure' scripts to share, -you can create a site shell script called `config.site' that gives -default values for variables like `CC', `cache_file', and `prefix'. -`configure' looks for `PREFIX/share/config.site' if it exists, then -`PREFIX/etc/config.site' if it exists. Or, you can set the -`CONFIG_SITE' environment variable to the location of the site script. -A warning: not all `configure' scripts look for a site script. + If you want to set default values for 'configure' scripts to share, +you can create a site shell script called 'config.site' that gives +default values for variables like 'CC', 'cache_file', and 'prefix'. +'configure' looks for 'PREFIX/share/config.site' if it exists, then +'PREFIX/etc/config.site' if it exists. Or, you can set the +'CONFIG_SITE' environment variable to the location of the site script. +A warning: not all 'configure' scripts look for a site script. Defining Variables ================== Variables not defined in a site shell script can be set in the -environment passed to `configure'. However, some packages may run +environment passed to 'configure'. However, some packages may run configure again during the build, and the customized values of these variables may be lost. In order to avoid this problem, you should set -them in the `configure' command line, using `VAR=value'. For example: +them in the 'configure' command line, using 'VAR=value'. For example: ./configure CC=/usr/local2/bin/gcc -causes the specified `gcc' to be used as the C compiler (unless it is +causes the specified 'gcc' to be used as the C compiler (unless it is overridden in the site shell script). -Unfortunately, this technique does not work for `CONFIG_SHELL' due to -an Autoconf limitation. Until the limitation is lifted, you can use -this workaround: +Unfortunately, this technique does not work for 'CONFIG_SHELL' due to an +Autoconf limitation. Until the limitation is lifted, you can use this +workaround: CONFIG_SHELL=/bin/bash ./configure CONFIG_SHELL=/bin/bash -`configure' Invocation +'configure' Invocation ====================== - `configure' recognizes the following options to control how it + 'configure' recognizes the following options to control how it operates. -`--help' -`-h' - Print a summary of all of the options to `configure', and exit. +'--help' +'-h' + Print a summary of all of the options to 'configure', and exit. -`--help=short' -`--help=recursive' +'--help=short' +'--help=recursive' Print a summary of the options unique to this package's - `configure', and exit. The `short' variant lists options used - only in the top level, while the `recursive' variant lists options - also present in any nested packages. + 'configure', and exit. The 'short' variant lists options used only + in the top level, while the 'recursive' variant lists options also + present in any nested packages. -`--version' -`-V' - Print the version of Autoconf used to generate the `configure' +'--version' +'-V' + Print the version of Autoconf used to generate the 'configure' script, and exit. -`--cache-file=FILE' +'--cache-file=FILE' Enable the cache: use and save the results of the tests in FILE, - traditionally `config.cache'. FILE defaults to `/dev/null' to + traditionally 'config.cache'. FILE defaults to '/dev/null' to disable caching. -`--config-cache' -`-C' - Alias for `--cache-file=config.cache'. +'--config-cache' +'-C' + Alias for '--cache-file=config.cache'. -`--quiet' -`--silent' -`-q' +'--quiet' +'--silent' +'-q' Do not print messages saying which checks are being made. To - suppress all normal output, redirect it to `/dev/null' (any error + suppress all normal output, redirect it to '/dev/null' (any error messages will still be shown). -`--srcdir=DIR' +'--srcdir=DIR' Look for the package's source code in directory DIR. Usually - `configure' can determine that directory automatically. + 'configure' can determine that directory automatically. -`--prefix=DIR' - Use DIR as the installation prefix. *note Installation Names:: - for more details, including other options available for fine-tuning - the installation locations. +'--prefix=DIR' + Use DIR as the installation prefix. *note Installation Names:: for + more details, including other options available for fine-tuning the + installation locations. -`--no-create' -`-n' +'--no-create' +'-n' Run the configure checks, but stop before creating any output files. -`configure' also accepts some other, not widely useful, options. Run -`configure --help' for more details. +'configure' also accepts some other, not widely useful, options. Run +'configure --help' for more details. diff --git a/pcre/LICENCE b/pcre/LICENCE index dd9071a8d..f6ef7fd76 100644 --- a/pcre/LICENCE +++ b/pcre/LICENCE @@ -25,7 +25,7 @@ Email domain: cam.ac.uk University of Cambridge Computing Service, Cambridge, England. -Copyright (c) 1997-2017 University of Cambridge +Copyright (c) 1997-2018 University of Cambridge All rights reserved. @@ -36,7 +36,7 @@ Written by: Zoltan Herczeg Email local part: hzmester Emain domain: freemail.hu -Copyright(c) 2010-2017 Zoltan Herczeg +Copyright(c) 2010-2018 Zoltan Herczeg All rights reserved. @@ -47,7 +47,7 @@ Written by: Zoltan Herczeg Email local part: hzmester Emain domain: freemail.hu -Copyright(c) 2009-2017 Zoltan Herczeg +Copyright(c) 2009-2018 Zoltan Herczeg All rights reserved. diff --git a/pcre/NEWS b/pcre/NEWS index 36be07cb8..09b4ad360 100644 --- a/pcre/NEWS +++ b/pcre/NEWS @@ -1,6 +1,12 @@ News about PCRE releases ------------------------ +Release 8.42 20-March-2018 +-------------------------- + +This is a bug-fix release. + + Release 8.41 13-June-2017 ------------------------- diff --git a/pcre/NON-AUTOTOOLS-BUILD b/pcre/NON-AUTOTOOLS-BUILD index 391005910..37f616447 100644 --- a/pcre/NON-AUTOTOOLS-BUILD +++ b/pcre/NON-AUTOTOOLS-BUILD @@ -760,13 +760,14 @@ The character code used is EBCDIC, not ASCII or Unicode. In z/OS, UNIX APIs and applications can be supported through UNIX System Services, and in such an environment PCRE can be built in the same way as in other systems. However, in native z/OS (without UNIX System Services) and in z/VM, special ports are -required. For details, please see this web site: +required. PCRE1 version 8.39 is available in file 882 on this site: - http://www.zaconsultants.net + http://www.cbttape.org -You may download PCRE from WWW.CBTTAPE.ORG, file 882.  Everything, source and -executable, is in EBCDIC and native z/OS file formats and this is the -recommended download site. +Everything, source and executable, is in EBCDIC and native z/OS file formats. +However, this software is not maintained and will not be upgraded. If you are +new to PCRE you should be looking at PCRE2 (version 10.30 or later). -========================== -Last Updated: 25 June 2015 +=============================== +Last Updated: 13 September 2017 +=============================== diff --git a/pcre/configure.ac b/pcre/configure.ac index 718a18508..dcdef6a94 100644 --- a/pcre/configure.ac +++ b/pcre/configure.ac @@ -9,18 +9,18 @@ dnl The PCRE_PRERELEASE feature is for identifying release candidates. It might dnl be defined as -RC2, for example. For real releases, it should be empty. m4_define(pcre_major, [8]) -m4_define(pcre_minor, [41]) +m4_define(pcre_minor, [42]) m4_define(pcre_prerelease, []) -m4_define(pcre_date, [2017-07-05]) +m4_define(pcre_date, [2018-03-20]) # NOTE: The CMakeLists.txt file searches for the above variables in the first # 50 lines of this file. Please update that if the variables above are moved. # Libtool shared library interface versions (current:revision:age) -m4_define(libpcre_version, [3:9:2]) -m4_define(libpcre16_version, [2:9:2]) -m4_define(libpcre32_version, [0:9:0]) -m4_define(libpcreposix_version, [0:5:0]) +m4_define(libpcre_version, [3:10:2]) +m4_define(libpcre16_version, [2:10:2]) +m4_define(libpcre32_version, [0:10:0]) +m4_define(libpcreposix_version, [0:6:0]) m4_define(libpcrecpp_version, [0:1:0]) AC_PREREQ(2.57) @@ -155,6 +155,18 @@ AC_ARG_ENABLE(jit, [enable Just-In-Time compiling support]), , enable_jit=no) +# This code enables JIT if the hardware supports it. + +if test "$enable_jit" = "auto"; then + AC_LANG(C) + AC_COMPILE_IFELSE([AC_LANG_SOURCE([[ + #define SLJIT_CONFIG_AUTO 1 + #include "sljit/sljitConfigInternal.h" + #if (defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED) + #error unsupported + #endif]])], enable_jit=yes, enable_jit=no) +fi + # Handle --disable-pcregrep-jit (enabled by default) AC_ARG_ENABLE(pcregrep-jit, AS_HELP_STRING([--disable-pcregrep-jit], @@ -469,7 +481,7 @@ pcre_have_type_traits="0" pcre_have_bits_type_traits="0" if test "x$enable_cpp" = "xyes" -a -z "$CXX"; then - AC_MSG_ERROR([You need a C++ compiler for C++ support.]) + AC_MSG_ERROR([Invalid C++ compiler or C++ compiler flags]) fi if test "x$enable_cpp" = "xyes" -a -n "$CXX" diff --git a/pcre/doc/html/NON-AUTOTOOLS-BUILD.txt b/pcre/doc/html/NON-AUTOTOOLS-BUILD.txt index 391005910..37f616447 100644 --- a/pcre/doc/html/NON-AUTOTOOLS-BUILD.txt +++ b/pcre/doc/html/NON-AUTOTOOLS-BUILD.txt @@ -760,13 +760,14 @@ The character code used is EBCDIC, not ASCII or Unicode. In z/OS, UNIX APIs and applications can be supported through UNIX System Services, and in such an environment PCRE can be built in the same way as in other systems. However, in native z/OS (without UNIX System Services) and in z/VM, special ports are -required. For details, please see this web site: +required. PCRE1 version 8.39 is available in file 882 on this site: - http://www.zaconsultants.net + http://www.cbttape.org -You may download PCRE from WWW.CBTTAPE.ORG, file 882.  Everything, source and -executable, is in EBCDIC and native z/OS file formats and this is the -recommended download site. +Everything, source and executable, is in EBCDIC and native z/OS file formats. +However, this software is not maintained and will not be upgraded. If you are +new to PCRE you should be looking at PCRE2 (version 10.30 or later). -========================== -Last Updated: 25 June 2015 +=============================== +Last Updated: 13 September 2017 +=============================== diff --git a/pcre/pcre.h.in b/pcre/pcre.h.in index 667a45ed5..d4d789269 100644 --- a/pcre/pcre.h.in +++ b/pcre/pcre.h.in @@ -321,11 +321,11 @@ these bits, just add new ones on the end, in order to remain compatible. */ /* Types */ -struct real_pcre; /* declaration; the definition is private */ -typedef struct real_pcre pcre; +struct real_pcre8_or_16; /* declaration; the definition is private */ +typedef struct real_pcre8_or_16 pcre; -struct real_pcre16; /* declaration; the definition is private */ -typedef struct real_pcre16 pcre16; +struct real_pcre8_or_16; /* declaration; the definition is private */ +typedef struct real_pcre8_or_16 pcre16; struct real_pcre32; /* declaration; the definition is private */ typedef struct real_pcre32 pcre32; diff --git a/pcre/pcre_compile.c b/pcre/pcre_compile.c index 1a916693e..9b9da46f0 100644 --- a/pcre/pcre_compile.c +++ b/pcre/pcre_compile.c @@ -8063,7 +8063,7 @@ for (;; ptr++) single group (i.e. not to a duplicated name. */ HANDLE_REFERENCE: - if (firstcharflags == REQ_UNSET) firstcharflags = REQ_NONE; + if (firstcharflags == REQ_UNSET) zerofirstcharflags = firstcharflags = REQ_NONE; previous = code; item_hwm_offset = cd->hwm - cd->start_workspace; *code++ = ((options & PCRE_CASELESS) != 0)? OP_REFI : OP_REF; diff --git a/pcre/pcre_dfa_exec.c b/pcre/pcre_dfa_exec.c index bc09ced3a..f333381d0 100644 --- a/pcre/pcre_dfa_exec.c +++ b/pcre/pcre_dfa_exec.c @@ -2287,12 +2287,14 @@ for (;;) case OP_NOTI: if (clen > 0) { - unsigned int otherd; + pcre_uint32 otherd; #ifdef SUPPORT_UTF if (utf && d >= 128) { #ifdef SUPPORT_UCP otherd = UCD_OTHERCASE(d); +#else + otherd = d; #endif /* SUPPORT_UCP */ } else diff --git a/pcre/pcre_exec.c b/pcre/pcre_exec.c index fa84d924a..93256d324 100644 --- a/pcre/pcre_exec.c +++ b/pcre/pcre_exec.c @@ -6,7 +6,7 @@ and semantics are as close as possible to those of the Perl 5 language. Written by Philip Hazel - Copyright (c) 1997-2014 University of Cambridge + Copyright (c) 1997-2018 University of Cambridge ----------------------------------------------------------------------------- Redistribution and use in source and binary forms, with or without @@ -2313,7 +2313,7 @@ for (;;) case OP_ANY: if (IS_NEWLINE(eptr)) RRETURN(MATCH_NOMATCH); if (md->partial != 0 && - eptr + 1 >= md->end_subject && + eptr == md->end_subject - 1 && NLBLOCK->nltype == NLTYPE_FIXED && NLBLOCK->nllen == 2 && UCHAR21TEST(eptr) == NLBLOCK->nl[0]) @@ -3061,7 +3061,7 @@ for (;;) { RMATCH(eptr, ecode, offset_top, md, eptrb, RM18); if (rrc != MATCH_NOMATCH) RRETURN(rrc); - if (eptr-- == pp) break; /* Stop if tried at original pos */ + if (eptr-- <= pp) break; /* Stop if tried at original pos */ BACKCHAR(eptr); } } @@ -3218,7 +3218,7 @@ for (;;) { RMATCH(eptr, ecode, offset_top, md, eptrb, RM21); if (rrc != MATCH_NOMATCH) RRETURN(rrc); - if (eptr-- == pp) break; /* Stop if tried at original pos */ + if (eptr-- <= pp) break; /* Stop if tried at original pos */ #ifdef SUPPORT_UTF if (utf) BACKCHAR(eptr); #endif diff --git a/pcre/pcre_jit_compile.c b/pcre/pcre_jit_compile.c index 249edbe8e..2bad74b02 100644 --- a/pcre/pcre_jit_compile.c +++ b/pcre/pcre_jit_compile.c @@ -164,7 +164,6 @@ typedef struct jit_arguments { const pcre_uchar *begin; const pcre_uchar *end; int *offsets; - pcre_uchar *uchar_ptr; pcre_uchar *mark_ptr; void *callout_data; /* Everything else after. */ @@ -214,7 +213,7 @@ enum control_types { type_then_trap = 1 }; -typedef int (SLJIT_CALL *jit_function)(jit_arguments *args); +typedef int (SLJIT_FUNC *jit_function)(jit_arguments *args); /* The following structure is the key data type for the recursive code generator. It is allocated by compile_matchingpath, and contains @@ -489,9 +488,24 @@ typedef struct compare_context { /* Used for accessing the elements of the stack. */ #define STACK(i) ((i) * (int)sizeof(sljit_sw)) +#ifdef SLJIT_PREF_SHIFT_REG +#if SLJIT_PREF_SHIFT_REG == SLJIT_R2 +/* Nothing. */ +#elif SLJIT_PREF_SHIFT_REG == SLJIT_R3 +#define SHIFT_REG_IS_R3 +#else +#error "Unsupported shift register" +#endif +#endif + #define TMP1 SLJIT_R0 +#ifdef SHIFT_REG_IS_R3 +#define TMP2 SLJIT_R3 +#define TMP3 SLJIT_R2 +#else #define TMP2 SLJIT_R2 #define TMP3 SLJIT_R3 +#endif #define STR_PTR SLJIT_S0 #define STR_END SLJIT_S1 #define STACK_TOP SLJIT_R1 @@ -520,13 +534,10 @@ the start pointers when the end of the capturing group has not yet reached. */ #if defined COMPILE_PCRE8 #define MOV_UCHAR SLJIT_MOV_U8 -#define MOVU_UCHAR SLJIT_MOVU_U8 #elif defined COMPILE_PCRE16 #define MOV_UCHAR SLJIT_MOV_U16 -#define MOVU_UCHAR SLJIT_MOVU_U16 #elif defined COMPILE_PCRE32 #define MOV_UCHAR SLJIT_MOV_U32 -#define MOVU_UCHAR SLJIT_MOVU_U32 #else #error Unsupported compiling mode #endif @@ -2383,12 +2394,25 @@ if (length < 8) } else { - GET_LOCAL_BASE(SLJIT_R1, 0, OVECTOR_START); - OP1(SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, length - 1); - loop = LABEL(); - OP1(SLJIT_MOVU, SLJIT_MEM1(SLJIT_R1), sizeof(sljit_sw), SLJIT_R0, 0); - OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_R2, 0, SLJIT_R2, 0, SLJIT_IMM, 1); - JUMPTO(SLJIT_NOT_ZERO, loop); + if (sljit_emit_mem(compiler, SLJIT_MOV | SLJIT_MEM_SUPP | SLJIT_MEM_STORE | SLJIT_MEM_PRE, SLJIT_R0, SLJIT_MEM1(SLJIT_R1), sizeof(sljit_sw)) == SLJIT_SUCCESS) + { + GET_LOCAL_BASE(SLJIT_R1, 0, OVECTOR_START); + OP1(SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, length - 1); + loop = LABEL(); + sljit_emit_mem(compiler, SLJIT_MOV | SLJIT_MEM_STORE | SLJIT_MEM_PRE, SLJIT_R0, SLJIT_MEM1(SLJIT_R1), sizeof(sljit_sw)); + OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_R2, 0, SLJIT_R2, 0, SLJIT_IMM, 1); + JUMPTO(SLJIT_NOT_ZERO, loop); + } + else + { + GET_LOCAL_BASE(SLJIT_R1, 0, OVECTOR_START + sizeof(sljit_sw)); + OP1(SLJIT_MOV, SLJIT_R2, 0, SLJIT_IMM, length - 1); + loop = LABEL(); + OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_R1), 0, SLJIT_R0, 0); + OP2(SLJIT_ADD, SLJIT_R1, 0, SLJIT_R1, 0, SLJIT_IMM, sizeof(sljit_sw)); + OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_R2, 0, SLJIT_R2, 0, SLJIT_IMM, 1); + JUMPTO(SLJIT_NOT_ZERO, loop); + } } } @@ -2421,12 +2445,25 @@ if (length < 8) } else { - GET_LOCAL_BASE(TMP2, 0, OVECTOR_START + sizeof(sljit_sw)); - OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_IMM, length - 2); - loop = LABEL(); - OP1(SLJIT_MOVU, SLJIT_MEM1(TMP2), sizeof(sljit_sw), TMP1, 0); - OP2(SLJIT_SUB | SLJIT_SET_Z, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, 1); - JUMPTO(SLJIT_NOT_ZERO, loop); + if (sljit_emit_mem(compiler, SLJIT_MOV | SLJIT_MEM_SUPP | SLJIT_MEM_STORE | SLJIT_MEM_PRE, TMP1, SLJIT_MEM1(TMP2), sizeof(sljit_sw)) == SLJIT_SUCCESS) + { + GET_LOCAL_BASE(TMP2, 0, OVECTOR_START + sizeof(sljit_sw)); + OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_IMM, length - 2); + loop = LABEL(); + sljit_emit_mem(compiler, SLJIT_MOV | SLJIT_MEM_STORE | SLJIT_MEM_PRE, TMP1, SLJIT_MEM1(TMP2), sizeof(sljit_sw)); + OP2(SLJIT_SUB | SLJIT_SET_Z, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, 1); + JUMPTO(SLJIT_NOT_ZERO, loop); + } + else + { + GET_LOCAL_BASE(TMP2, 0, OVECTOR_START + 2 * sizeof(sljit_sw)); + OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_IMM, length - 2); + loop = LABEL(); + OP1(SLJIT_MOV, SLJIT_MEM1(TMP2), 0, TMP1, 0); + OP2(SLJIT_ADD, TMP2, 0, TMP2, 0, SLJIT_IMM, sizeof(sljit_sw)); + OP2(SLJIT_SUB | SLJIT_SET_Z, STACK_TOP, 0, STACK_TOP, 0, SLJIT_IMM, 1); + JUMPTO(SLJIT_NOT_ZERO, loop); + } } OP1(SLJIT_MOV, STACK_TOP, 0, ARGUMENTS, 0); @@ -2436,10 +2473,10 @@ if (common->control_head_ptr != 0) OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr, SLJIT_IMM, 0); OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(STACK_TOP), SLJIT_OFFSETOF(jit_arguments, stack)); OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), common->start_ptr); -OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(STACK_TOP), SLJIT_OFFSETOF(struct sljit_stack, base)); +OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(STACK_TOP), SLJIT_OFFSETOF(struct sljit_stack, end)); } -static sljit_sw SLJIT_CALL do_search_mark(sljit_sw *current, const pcre_uchar *skip_arg) +static sljit_sw SLJIT_FUNC do_search_mark(sljit_sw *current, const pcre_uchar *skip_arg) { while (current != NULL) { @@ -2460,7 +2497,7 @@ while (current != NULL) SLJIT_ASSERT(current[0] == 0 || current < (sljit_sw*)current[0]); current = (sljit_sw*)current[0]; } -return -1; +return 0; } static SLJIT_INLINE void copy_ovector(compiler_common *common, int topbracket) @@ -2468,6 +2505,7 @@ static SLJIT_INLINE void copy_ovector(compiler_common *common, int topbracket) DEFINE_COMPILER; struct sljit_label *loop; struct sljit_jump *early_quit; +BOOL has_pre; /* At this point we can freely use all registers. */ OP1(SLJIT_MOV, SLJIT_S2, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(1)); @@ -2481,17 +2519,30 @@ if (common->mark_ptr != 0) OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_R0), SLJIT_OFFSETOF(jit_arguments, mark_ptr), SLJIT_R2, 0); OP2(SLJIT_SUB, SLJIT_R2, 0, SLJIT_MEM1(SLJIT_R0), SLJIT_OFFSETOF(jit_arguments, offsets), SLJIT_IMM, sizeof(int)); OP1(SLJIT_MOV, SLJIT_R0, 0, SLJIT_MEM1(SLJIT_R0), SLJIT_OFFSETOF(jit_arguments, begin)); -GET_LOCAL_BASE(SLJIT_S0, 0, OVECTOR_START); + +has_pre = sljit_emit_mem(compiler, SLJIT_MOV | SLJIT_MEM_SUPP | SLJIT_MEM_PRE, SLJIT_S1, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw)) == SLJIT_SUCCESS; +GET_LOCAL_BASE(SLJIT_S0, 0, OVECTOR_START - (has_pre ? sizeof(sljit_sw) : 0)); + /* Unlikely, but possible */ early_quit = CMP(SLJIT_EQUAL, SLJIT_R1, 0, SLJIT_IMM, 0); loop = LABEL(); -OP2(SLJIT_SUB, SLJIT_S1, 0, SLJIT_MEM1(SLJIT_S0), 0, SLJIT_R0, 0); -OP2(SLJIT_ADD, SLJIT_S0, 0, SLJIT_S0, 0, SLJIT_IMM, sizeof(sljit_sw)); + +if (has_pre) + sljit_emit_mem(compiler, SLJIT_MOV | SLJIT_MEM_PRE, SLJIT_S1, SLJIT_MEM1(SLJIT_S0), sizeof(sljit_sw)); +else + { + OP1(SLJIT_MOV, SLJIT_S1, 0, SLJIT_MEM1(SLJIT_S0), 0); + OP2(SLJIT_ADD, SLJIT_S0, 0, SLJIT_S0, 0, SLJIT_IMM, sizeof(sljit_sw)); + } + +OP2(SLJIT_ADD, SLJIT_R2, 0, SLJIT_R2, 0, SLJIT_IMM, sizeof(int)); +OP2(SLJIT_SUB, SLJIT_S1, 0, SLJIT_S1, 0, SLJIT_R0, 0); /* Copy the integer value to the output buffer */ #if defined COMPILE_PCRE16 || defined COMPILE_PCRE32 OP2(SLJIT_ASHR, SLJIT_S1, 0, SLJIT_S1, 0, SLJIT_IMM, UCHAR_SHIFT); #endif -OP1(SLJIT_MOVU_S32, SLJIT_MEM1(SLJIT_R2), sizeof(int), SLJIT_S1, 0); + +OP1(SLJIT_MOV_S32, SLJIT_MEM1(SLJIT_R2), 0, SLJIT_S1, 0); OP2(SLJIT_SUB | SLJIT_SET_Z, SLJIT_R1, 0, SLJIT_R1, 0, SLJIT_IMM, 1); JUMPTO(SLJIT_NOT_ZERO, loop); JUMPHERE(early_quit); @@ -2499,14 +2550,29 @@ JUMPHERE(early_quit); /* Calculate the return value, which is the maximum ovector value. */ if (topbracket > 1) { - GET_LOCAL_BASE(SLJIT_R0, 0, OVECTOR_START + topbracket * 2 * sizeof(sljit_sw)); - OP1(SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, topbracket + 1); + if (sljit_emit_mem(compiler, SLJIT_MOV | SLJIT_MEM_SUPP | SLJIT_MEM_PRE, SLJIT_R2, SLJIT_MEM1(SLJIT_R0), -(2 * (sljit_sw)sizeof(sljit_sw))) == SLJIT_SUCCESS) + { + GET_LOCAL_BASE(SLJIT_R0, 0, OVECTOR_START + topbracket * 2 * sizeof(sljit_sw)); + OP1(SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, topbracket + 1); - /* OVECTOR(0) is never equal to SLJIT_S2. */ - loop = LABEL(); - OP1(SLJIT_MOVU, SLJIT_R2, 0, SLJIT_MEM1(SLJIT_R0), -(2 * (sljit_sw)sizeof(sljit_sw))); - OP2(SLJIT_SUB, SLJIT_R1, 0, SLJIT_R1, 0, SLJIT_IMM, 1); - CMPTO(SLJIT_EQUAL, SLJIT_R2, 0, SLJIT_S2, 0, loop); + /* OVECTOR(0) is never equal to SLJIT_S2. */ + loop = LABEL(); + sljit_emit_mem(compiler, SLJIT_MOV | SLJIT_MEM_PRE, SLJIT_R2, SLJIT_MEM1(SLJIT_R0), -(2 * (sljit_sw)sizeof(sljit_sw))); + OP2(SLJIT_SUB, SLJIT_R1, 0, SLJIT_R1, 0, SLJIT_IMM, 1); + CMPTO(SLJIT_EQUAL, SLJIT_R2, 0, SLJIT_S2, 0, loop); + } + else + { + GET_LOCAL_BASE(SLJIT_R0, 0, OVECTOR_START + (topbracket - 1) * 2 * sizeof(sljit_sw)); + OP1(SLJIT_MOV, SLJIT_R1, 0, SLJIT_IMM, topbracket + 1); + + /* OVECTOR(0) is never equal to SLJIT_S2. */ + loop = LABEL(); + OP1(SLJIT_MOV, SLJIT_R2, 0, SLJIT_MEM1(SLJIT_R0), 0); + OP2(SLJIT_SUB, SLJIT_R0, 0, SLJIT_R0, 0, SLJIT_IMM, 2 * (sljit_sw)sizeof(sljit_sw)); + OP2(SLJIT_SUB, SLJIT_R1, 0, SLJIT_R1, 0, SLJIT_IMM, 1); + CMPTO(SLJIT_EQUAL, SLJIT_R2, 0, SLJIT_S2, 0, loop); + } OP1(SLJIT_MOV, SLJIT_RETURN_REG, 0, SLJIT_R1, 0); } else @@ -5167,93 +5233,190 @@ OP_FLAGS(SLJIT_OR | SLJIT_SET_Z, TMP2, 0, SLJIT_EQUAL); sljit_emit_fast_return(compiler, RETURN_ADDR, 0); } -#define CHAR1 STR_END -#define CHAR2 STACK_TOP - static void do_casefulcmp(compiler_common *common) { DEFINE_COMPILER; struct sljit_jump *jump; struct sljit_label *label; +int char1_reg; +int char2_reg; -sljit_emit_fast_enter(compiler, RETURN_ADDR, 0); +if (sljit_get_register_index(TMP3) < 0) + { + char1_reg = STR_END; + char2_reg = STACK_TOP; + } +else + { + char1_reg = TMP3; + char2_reg = RETURN_ADDR; + } + +sljit_emit_fast_enter(compiler, SLJIT_MEM1(SLJIT_SP), LOCALS0); OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, TMP2, 0); -OP1(SLJIT_MOV, TMP3, 0, CHAR1, 0); -OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), LOCALS0, CHAR2, 0); -OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, IN_UCHARS(1)); -OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); -label = LABEL(); -OP1(MOVU_UCHAR, CHAR1, 0, SLJIT_MEM1(TMP1), IN_UCHARS(1)); -OP1(MOVU_UCHAR, CHAR2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(1)); -jump = CMP(SLJIT_NOT_EQUAL, CHAR1, 0, CHAR2, 0); -OP2(SLJIT_SUB | SLJIT_SET_Z, TMP2, 0, TMP2, 0, SLJIT_IMM, IN_UCHARS(1)); -JUMPTO(SLJIT_NOT_ZERO, label); +if (char1_reg == STR_END) + { + OP1(SLJIT_MOV, TMP3, 0, char1_reg, 0); + OP1(SLJIT_MOV, RETURN_ADDR, 0, char2_reg, 0); + } -JUMPHERE(jump); -OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); -OP1(SLJIT_MOV, CHAR1, 0, TMP3, 0); -OP1(SLJIT_MOV, CHAR2, 0, SLJIT_MEM1(SLJIT_SP), LOCALS0); -sljit_emit_fast_return(compiler, RETURN_ADDR, 0); -} +if (sljit_emit_mem(compiler, MOV_UCHAR | SLJIT_MEM_SUPP | SLJIT_MEM_POST, char1_reg, SLJIT_MEM1(TMP1), IN_UCHARS(1)) == SLJIT_SUCCESS) + { + label = LABEL(); + sljit_emit_mem(compiler, MOV_UCHAR | SLJIT_MEM_POST, char1_reg, SLJIT_MEM1(TMP1), IN_UCHARS(1)); + sljit_emit_mem(compiler, MOV_UCHAR | SLJIT_MEM_POST, char2_reg, SLJIT_MEM1(STR_PTR), IN_UCHARS(1)); + jump = CMP(SLJIT_NOT_EQUAL, char1_reg, 0, char2_reg, 0); + OP2(SLJIT_SUB | SLJIT_SET_Z, TMP2, 0, TMP2, 0, SLJIT_IMM, IN_UCHARS(1)); + JUMPTO(SLJIT_NOT_ZERO, label); + + JUMPHERE(jump); + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), LOCALS0); + } +else if (sljit_emit_mem(compiler, MOV_UCHAR | SLJIT_MEM_SUPP | SLJIT_MEM_PRE, char1_reg, SLJIT_MEM1(TMP1), IN_UCHARS(1)) == SLJIT_SUCCESS) + { + OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, IN_UCHARS(1)); + OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); + + label = LABEL(); + sljit_emit_mem(compiler, MOV_UCHAR | SLJIT_MEM_PRE, char1_reg, SLJIT_MEM1(TMP1), IN_UCHARS(1)); + sljit_emit_mem(compiler, MOV_UCHAR | SLJIT_MEM_PRE, char2_reg, SLJIT_MEM1(STR_PTR), IN_UCHARS(1)); + jump = CMP(SLJIT_NOT_EQUAL, char1_reg, 0, char2_reg, 0); + OP2(SLJIT_SUB | SLJIT_SET_Z, TMP2, 0, TMP2, 0, SLJIT_IMM, IN_UCHARS(1)); + JUMPTO(SLJIT_NOT_ZERO, label); -#define LCC_TABLE STACK_LIMIT + JUMPHERE(jump); + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), LOCALS0); + OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); + } +else + { + label = LABEL(); + OP1(MOV_UCHAR, char1_reg, 0, SLJIT_MEM1(TMP1), 0); + OP1(MOV_UCHAR, char2_reg, 0, SLJIT_MEM1(STR_PTR), 0); + OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, IN_UCHARS(1)); + OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); + jump = CMP(SLJIT_NOT_EQUAL, char1_reg, 0, char2_reg, 0); + OP2(SLJIT_SUB | SLJIT_SET_Z, TMP2, 0, TMP2, 0, SLJIT_IMM, IN_UCHARS(1)); + JUMPTO(SLJIT_NOT_ZERO, label); + + JUMPHERE(jump); + OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), LOCALS0); + } + +if (char1_reg == STR_END) + { + OP1(SLJIT_MOV, char1_reg, 0, TMP3, 0); + OP1(SLJIT_MOV, char2_reg, 0, RETURN_ADDR, 0); + } + +sljit_emit_fast_return(compiler, TMP1, 0); +} static void do_caselesscmp(compiler_common *common) { DEFINE_COMPILER; struct sljit_jump *jump; struct sljit_label *label; +int char1_reg = STR_END; +int char2_reg; +int lcc_table; +int opt_type = 0; -sljit_emit_fast_enter(compiler, RETURN_ADDR, 0); +if (sljit_get_register_index(TMP3) < 0) + { + char2_reg = STACK_TOP; + lcc_table = STACK_LIMIT; + } +else + { + char2_reg = RETURN_ADDR; + lcc_table = TMP3; + } + +if (sljit_emit_mem(compiler, MOV_UCHAR | SLJIT_MEM_SUPP | SLJIT_MEM_POST, char1_reg, SLJIT_MEM1(TMP1), IN_UCHARS(1)) == SLJIT_SUCCESS) + opt_type = 1; +else if (sljit_emit_mem(compiler, MOV_UCHAR | SLJIT_MEM_SUPP | SLJIT_MEM_PRE, char1_reg, SLJIT_MEM1(TMP1), IN_UCHARS(1)) == SLJIT_SUCCESS) + opt_type = 2; + +sljit_emit_fast_enter(compiler, SLJIT_MEM1(SLJIT_SP), LOCALS0); OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, TMP2, 0); -OP1(SLJIT_MOV, TMP3, 0, LCC_TABLE, 0); -OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), LOCALS0, CHAR1, 0); -OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), LOCALS1, CHAR2, 0); -OP1(SLJIT_MOV, LCC_TABLE, 0, SLJIT_IMM, common->lcc); -OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, IN_UCHARS(1)); -OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); +OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), LOCALS1, char1_reg, 0); + +if (char2_reg == STACK_TOP) + { + OP1(SLJIT_MOV, TMP3, 0, char2_reg, 0); + OP1(SLJIT_MOV, RETURN_ADDR, 0, lcc_table, 0); + } + +OP1(SLJIT_MOV, lcc_table, 0, SLJIT_IMM, common->lcc); + +if (opt_type == 1) + { + label = LABEL(); + sljit_emit_mem(compiler, MOV_UCHAR | SLJIT_MEM_POST, char1_reg, SLJIT_MEM1(TMP1), IN_UCHARS(1)); + sljit_emit_mem(compiler, MOV_UCHAR | SLJIT_MEM_POST, char2_reg, SLJIT_MEM1(STR_PTR), IN_UCHARS(1)); + } +else if (opt_type == 2) + { + OP2(SLJIT_SUB, TMP1, 0, TMP1, 0, SLJIT_IMM, IN_UCHARS(1)); + OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); + + label = LABEL(); + sljit_emit_mem(compiler, MOV_UCHAR | SLJIT_MEM_PRE, char1_reg, SLJIT_MEM1(TMP1), IN_UCHARS(1)); + sljit_emit_mem(compiler, MOV_UCHAR | SLJIT_MEM_PRE, char2_reg, SLJIT_MEM1(STR_PTR), IN_UCHARS(1)); + } +else + { + label = LABEL(); + OP1(MOV_UCHAR, char1_reg, 0, SLJIT_MEM1(TMP1), 0); + OP1(MOV_UCHAR, char2_reg, 0, SLJIT_MEM1(STR_PTR), 0); + OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, IN_UCHARS(1)); + } -label = LABEL(); -OP1(MOVU_UCHAR, CHAR1, 0, SLJIT_MEM1(TMP1), IN_UCHARS(1)); -OP1(MOVU_UCHAR, CHAR2, 0, SLJIT_MEM1(STR_PTR), IN_UCHARS(1)); #ifndef COMPILE_PCRE8 -jump = CMP(SLJIT_GREATER, CHAR1, 0, SLJIT_IMM, 255); +jump = CMP(SLJIT_GREATER, char1_reg, 0, SLJIT_IMM, 255); #endif -OP1(SLJIT_MOV_U8, CHAR1, 0, SLJIT_MEM2(LCC_TABLE, CHAR1), 0); +OP1(SLJIT_MOV_U8, char1_reg, 0, SLJIT_MEM2(lcc_table, char1_reg), 0); #ifndef COMPILE_PCRE8 JUMPHERE(jump); -jump = CMP(SLJIT_GREATER, CHAR2, 0, SLJIT_IMM, 255); +jump = CMP(SLJIT_GREATER, char2_reg, 0, SLJIT_IMM, 255); #endif -OP1(SLJIT_MOV_U8, CHAR2, 0, SLJIT_MEM2(LCC_TABLE, CHAR2), 0); +OP1(SLJIT_MOV_U8, char2_reg, 0, SLJIT_MEM2(lcc_table, char2_reg), 0); #ifndef COMPILE_PCRE8 JUMPHERE(jump); #endif -jump = CMP(SLJIT_NOT_EQUAL, CHAR1, 0, CHAR2, 0); + +if (opt_type == 0) + OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); + +jump = CMP(SLJIT_NOT_EQUAL, char1_reg, 0, char2_reg, 0); OP2(SLJIT_SUB | SLJIT_SET_Z, TMP2, 0, TMP2, 0, SLJIT_IMM, IN_UCHARS(1)); JUMPTO(SLJIT_NOT_ZERO, label); JUMPHERE(jump); -OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); -OP1(SLJIT_MOV, LCC_TABLE, 0, TMP3, 0); -OP1(SLJIT_MOV, CHAR1, 0, SLJIT_MEM1(SLJIT_SP), LOCALS0); -OP1(SLJIT_MOV, CHAR2, 0, SLJIT_MEM1(SLJIT_SP), LOCALS1); -sljit_emit_fast_return(compiler, RETURN_ADDR, 0); -} +OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), LOCALS0); + +if (opt_type == 2) + OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); -#undef LCC_TABLE -#undef CHAR1 -#undef CHAR2 +if (char2_reg == STACK_TOP) + { + OP1(SLJIT_MOV, char2_reg, 0, TMP3, 0); + OP1(SLJIT_MOV, lcc_table, 0, RETURN_ADDR, 0); + } + +OP1(SLJIT_MOV, char1_reg, 0, SLJIT_MEM1(SLJIT_SP), LOCALS1); +sljit_emit_fast_return(compiler, TMP1, 0); +} #if defined SUPPORT_UTF && defined SUPPORT_UCP -static const pcre_uchar * SLJIT_CALL do_utf_caselesscmp(pcre_uchar *src1, jit_arguments *args, pcre_uchar *end1) +static const pcre_uchar * SLJIT_FUNC do_utf_caselesscmp(pcre_uchar *src1, pcre_uchar *src2, pcre_uchar *end1, pcre_uchar *end2) { /* This function would be ineffective to do in JIT level. */ sljit_u32 c1, c2; -const pcre_uchar *src2 = args->uchar_ptr; -const pcre_uchar *end2 = args->end; const ucd_record *ur; const sljit_u32 *pp; @@ -6776,32 +6939,37 @@ else #if defined SUPPORT_UTF && defined SUPPORT_UCP if (common->utf && *cc == OP_REFI) { - SLJIT_ASSERT(TMP1 == SLJIT_R0 && STACK_TOP == SLJIT_R1 && TMP2 == SLJIT_R2); + SLJIT_ASSERT(TMP1 == SLJIT_R0 && STACK_TOP == SLJIT_R1); if (ref) - OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset + 1)); + OP1(SLJIT_MOV, SLJIT_R2, 0, SLJIT_MEM1(SLJIT_SP), OVECTOR(offset + 1)); else - OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(TMP2), sizeof(sljit_sw)); + OP1(SLJIT_MOV, SLJIT_R2, 0, SLJIT_MEM1(TMP2), sizeof(sljit_sw)); if (withchecks) - jump = CMP(SLJIT_EQUAL, TMP1, 0, TMP2, 0); + jump = CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_R2, 0); - /* Needed to save important temporary registers. */ + /* No free saved registers so save data on stack. */ OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), LOCALS0, STACK_TOP, 0); - OP1(SLJIT_MOV, SLJIT_R1, 0, ARGUMENTS, 0); - OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_R1), SLJIT_OFFSETOF(jit_arguments, uchar_ptr), STR_PTR, 0); - sljit_emit_ijump(compiler, SLJIT_CALL3, SLJIT_IMM, SLJIT_FUNC_OFFSET(do_utf_caselesscmp)); + OP1(SLJIT_MOV, SLJIT_R1, 0, STR_PTR, 0); + OP1(SLJIT_MOV, SLJIT_R3, 0, STR_END, 0); + sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_RET(SW) | SLJIT_ARG1(SW) | SLJIT_ARG2(SW) | SLJIT_ARG3(SW) | SLJIT_ARG4(SW), SLJIT_IMM, SLJIT_FUNC_OFFSET(do_utf_caselesscmp)); OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), LOCALS0); + OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_RETURN_REG, 0); + if (common->mode == JIT_COMPILE) add_jump(compiler, backtracks, CMP(SLJIT_LESS_EQUAL, SLJIT_RETURN_REG, 0, SLJIT_IMM, 1)); else { - add_jump(compiler, backtracks, CMP(SLJIT_EQUAL, SLJIT_RETURN_REG, 0, SLJIT_IMM, 0)); - nopartial = CMP(SLJIT_NOT_EQUAL, SLJIT_RETURN_REG, 0, SLJIT_IMM, 1); + OP2(SLJIT_SUB | SLJIT_SET_Z | SLJIT_SET_LESS, SLJIT_UNUSED, 0, SLJIT_RETURN_REG, 0, SLJIT_IMM, 1); + + add_jump(compiler, backtracks, JUMP(SLJIT_LESS)); + + nopartial = JUMP(SLJIT_NOT_EQUAL); + OP1(SLJIT_MOV, STR_PTR, 0, STR_END, 0); check_partial(common, FALSE); add_jump(compiler, backtracks, JUMP(SLJIT_JUMP)); JUMPHERE(nopartial); } - OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_RETURN_REG, 0); } else #endif /* SUPPORT_UTF && SUPPORT_UCP */ @@ -7125,7 +7293,7 @@ add_jump(compiler, &backtrack->topbacktracks, CMP(SLJIT_EQUAL, TMP1, 0, SLJIT_IM return cc + 1 + LINK_SIZE; } -static int SLJIT_CALL do_callout(struct jit_arguments *arguments, PUBL(callout_block) *callout_block, pcre_uchar **jit_ovector) +static sljit_s32 SLJIT_FUNC do_callout(struct jit_arguments *arguments, PUBL(callout_block) *callout_block, pcre_uchar **jit_ovector) { const pcre_uchar *begin = arguments->begin; int *offset_vector = arguments->offsets; @@ -7207,18 +7375,17 @@ OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), LOCALS0, STACK_TOP, 0); /* SLJIT_R0 = arguments */ OP1(SLJIT_MOV, SLJIT_R1, 0, STACK_TOP, 0); GET_LOCAL_BASE(SLJIT_R2, 0, OVECTOR_START); -sljit_emit_ijump(compiler, SLJIT_CALL3, SLJIT_IMM, SLJIT_FUNC_OFFSET(do_callout)); -OP1(SLJIT_MOV_S32, SLJIT_RETURN_REG, 0, SLJIT_RETURN_REG, 0); +sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_RET(S32) | SLJIT_ARG1(SW) | SLJIT_ARG2(SW) | SLJIT_ARG3(SW), SLJIT_IMM, SLJIT_FUNC_OFFSET(do_callout)); OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), LOCALS0); free_stack(common, CALLOUT_ARG_SIZE / sizeof(sljit_sw)); /* Check return value. */ -OP2(SLJIT_SUB | SLJIT_SET_Z | SLJIT_SET_SIG_GREATER, SLJIT_UNUSED, 0, SLJIT_RETURN_REG, 0, SLJIT_IMM, 0); -add_jump(compiler, &backtrack->topbacktracks, JUMP(SLJIT_SIG_GREATER)); +OP2(SLJIT_SUB32 | SLJIT_SET_Z | SLJIT_SET_SIG_GREATER, SLJIT_UNUSED, 0, SLJIT_RETURN_REG, 0, SLJIT_IMM, 0); +add_jump(compiler, &backtrack->topbacktracks, JUMP(SLJIT_SIG_GREATER32)); if (common->forced_quit_label == NULL) - add_jump(compiler, &common->forced_quit, JUMP(SLJIT_NOT_EQUAL) /* SIG_LESS */); + add_jump(compiler, &common->forced_quit, JUMP(SLJIT_NOT_EQUAL32) /* SIG_LESS */); else - JUMPTO(SLJIT_NOT_EQUAL /* SIG_LESS */, common->forced_quit_label); + JUMPTO(SLJIT_NOT_EQUAL32 /* SIG_LESS */, common->forced_quit_label); return cc + 2 + 2 * LINK_SIZE; } @@ -10439,11 +10606,11 @@ if (opcode == OP_SKIP_ARG) OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), common->control_head_ptr); OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), LOCALS0, STACK_TOP, 0); OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_IMM, (sljit_sw)(current->cc + 2)); - sljit_emit_ijump(compiler, SLJIT_CALL2, SLJIT_IMM, SLJIT_FUNC_OFFSET(do_search_mark)); + sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_RET(SW) | SLJIT_ARG1(SW) | SLJIT_ARG2(SW), SLJIT_IMM, SLJIT_FUNC_OFFSET(do_search_mark)); OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), LOCALS0); OP1(SLJIT_MOV, STR_PTR, 0, TMP1, 0); - add_jump(compiler, &common->reset_match, CMP(SLJIT_NOT_EQUAL, STR_PTR, 0, SLJIT_IMM, -1)); + add_jump(compiler, &common->reset_match, CMP(SLJIT_NOT_EQUAL, STR_PTR, 0, SLJIT_IMM, 0)); return; } @@ -11031,7 +11198,7 @@ if (!compiler) common->compiler = compiler; /* Main pcre_jit_exec entry. */ -sljit_emit_enter(compiler, 0, 1, 5, 5, 0, 0, private_data_size); +sljit_emit_enter(compiler, 0, SLJIT_ARG1(SW), 5, 5, 0, 0, private_data_size); /* Register init. */ reset_ovector(common, (re->top_bracket + 1) * 2); @@ -11044,8 +11211,8 @@ OP1(SLJIT_MOV, STR_PTR, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, str)) OP1(SLJIT_MOV, STR_END, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, end)); OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, stack)); OP1(SLJIT_MOV_U32, TMP1, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, limit_match)); -OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(TMP2), SLJIT_OFFSETOF(struct sljit_stack, base)); -OP1(SLJIT_MOV, STACK_LIMIT, 0, SLJIT_MEM1(TMP2), SLJIT_OFFSETOF(struct sljit_stack, limit)); +OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(TMP2), SLJIT_OFFSETOF(struct sljit_stack, end)); +OP1(SLJIT_MOV, STACK_LIMIT, 0, SLJIT_MEM1(TMP2), SLJIT_OFFSETOF(struct sljit_stack, start)); OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, SLJIT_IMM, 1); OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), LIMIT_MATCH, TMP1, 0); @@ -11251,20 +11418,22 @@ common->quit_label = quit_label; set_jumps(common->stackalloc, LABEL()); /* RETURN_ADDR is not a saved register. */ sljit_emit_fast_enter(compiler, SLJIT_MEM1(SLJIT_SP), LOCALS0); -OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), LOCALS1, TMP2, 0); -OP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0); -OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, stack)); -OP1(SLJIT_MOV, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(struct sljit_stack, top), STACK_TOP, 0); -OP2(SLJIT_SUB, TMP2, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(struct sljit_stack, limit), SLJIT_IMM, STACK_GROWTH_RATE); -sljit_emit_ijump(compiler, SLJIT_CALL2, SLJIT_IMM, SLJIT_FUNC_OFFSET(sljit_stack_resize)); -jump = CMP(SLJIT_NOT_EQUAL, SLJIT_RETURN_REG, 0, SLJIT_IMM, 0); -OP1(SLJIT_MOV, TMP1, 0, ARGUMENTS, 0); -OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(jit_arguments, stack)); -OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(struct sljit_stack, top)); -OP1(SLJIT_MOV, STACK_LIMIT, 0, SLJIT_MEM1(TMP1), SLJIT_OFFSETOF(struct sljit_stack, limit)); -OP1(SLJIT_MOV, TMP2, 0, SLJIT_MEM1(SLJIT_SP), LOCALS1); -sljit_emit_fast_return(compiler, SLJIT_MEM1(SLJIT_SP), LOCALS0); +SLJIT_ASSERT(TMP1 == SLJIT_R0 && STACK_TOP == SLJIT_R1); + +OP1(SLJIT_MOV, SLJIT_MEM1(SLJIT_SP), LOCALS1, STACK_TOP, 0); +OP1(SLJIT_MOV, SLJIT_R0, 0, ARGUMENTS, 0); +OP2(SLJIT_SUB, SLJIT_R1, 0, STACK_LIMIT, 0, SLJIT_IMM, STACK_GROWTH_RATE); +OP1(SLJIT_MOV, SLJIT_R0, 0, SLJIT_MEM1(SLJIT_R0), SLJIT_OFFSETOF(jit_arguments, stack)); +OP1(SLJIT_MOV, STACK_LIMIT, 0, TMP2, 0); + +sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_RET(SW) | SLJIT_ARG1(SW) | SLJIT_ARG2(SW), SLJIT_IMM, SLJIT_FUNC_OFFSET(sljit_stack_resize)); +jump = CMP(SLJIT_EQUAL, SLJIT_RETURN_REG, 0, SLJIT_IMM, 0); +OP1(SLJIT_MOV, TMP2, 0, STACK_LIMIT, 0); +OP1(SLJIT_MOV, STACK_LIMIT, 0, SLJIT_RETURN_REG, 0); +OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(SLJIT_SP), LOCALS0); +OP1(SLJIT_MOV, STACK_TOP, 0, SLJIT_MEM1(SLJIT_SP), LOCALS1); +sljit_emit_fast_return(compiler, TMP1, 0); /* Allocation failed. */ JUMPHERE(jump); @@ -11409,9 +11578,9 @@ union { sljit_u8 local_space[MACHINE_STACK_SIZE]; struct sljit_stack local_stack; -local_stack.max_limit = local_space; -local_stack.limit = local_space; -local_stack.base = local_space + MACHINE_STACK_SIZE; +local_stack.min_start = local_space; +local_stack.start = local_space; +local_stack.end = local_space + MACHINE_STACK_SIZE; local_stack.top = local_space + MACHINE_STACK_SIZE; arguments->stack = &local_stack; convert_executable_func.executable_func = executable_func; @@ -11529,7 +11698,7 @@ if ((options & PCRE_PARTIAL_HARD) != 0) else if ((options & PCRE_PARTIAL_SOFT) != 0) mode = JIT_PARTIAL_SOFT_COMPILE; -if (functions->executable_funcs[mode] == NULL) +if (functions == NULL || functions->executable_funcs[mode] == NULL) return PCRE_ERROR_JIT_BADOPTION; /* Sanity checks should be handled by pcre_exec. */ diff --git a/pcre/pcregrep.c b/pcre/pcregrep.c index 317f7454e..a406be962 100644 --- a/pcre/pcregrep.c +++ b/pcre/pcregrep.c @@ -1387,8 +1387,8 @@ Returns: nothing */ static void -do_after_lines(int lastmatchnumber, char *lastmatchrestart, char *endptr, - char *printname) +do_after_lines(unsigned long int lastmatchnumber, char *lastmatchrestart, + char *endptr, char *printname) { if (after_context > 0 && lastmatchnumber > 0) { @@ -1398,7 +1398,7 @@ if (after_context > 0 && lastmatchnumber > 0) int ellength; char *pp = lastmatchrestart; if (printname != NULL) fprintf(stdout, "%s-", printname); - if (number) fprintf(stdout, "%d-", lastmatchnumber++); + if (number) fprintf(stdout, "%lu-", lastmatchnumber++); pp = end_of_line(pp, endptr, &ellength); FWRITE(lastmatchrestart, 1, pp - lastmatchrestart, stdout); lastmatchrestart = pp; @@ -1502,11 +1502,11 @@ static int pcregrep(void *handle, int frtype, char *filename, char *printname) { int rc = 1; -int linenumber = 1; -int lastmatchnumber = 0; -int count = 0; int filepos = 0; int offsets[OFFSET_SIZE]; +unsigned long int linenumber = 1; +unsigned long int lastmatchnumber = 0; +unsigned long int count = 0; char *lastmatchrestart = NULL; char *ptr = main_buffer; char *endptr; @@ -1609,7 +1609,7 @@ while (ptr < endptr) if (endlinelength == 0 && t == main_buffer + bufsize) { - fprintf(stderr, "pcregrep: line %d%s%s is too long for the internal buffer\n" + fprintf(stderr, "pcregrep: line %lu%s%s is too long for the internal buffer\n" "pcregrep: check the --buffer-size option\n", linenumber, (filename == NULL)? "" : " of file ", @@ -1747,7 +1747,7 @@ while (ptr < endptr) prevoffsets[1] = offsets[1]; if (printname != NULL) fprintf(stdout, "%s:", printname); - if (number) fprintf(stdout, "%d:", linenumber); + if (number) fprintf(stdout, "%lu:", linenumber); /* Handle --line-offsets */ @@ -1862,7 +1862,7 @@ while (ptr < endptr) { char *pp = lastmatchrestart; if (printname != NULL) fprintf(stdout, "%s-", printname); - if (number) fprintf(stdout, "%d-", lastmatchnumber++); + if (number) fprintf(stdout, "%lu-", lastmatchnumber++); pp = end_of_line(pp, endptr, &ellength); FWRITE(lastmatchrestart, 1, pp - lastmatchrestart, stdout); lastmatchrestart = pp; @@ -1902,7 +1902,7 @@ while (ptr < endptr) int ellength; char *pp = p; if (printname != NULL) fprintf(stdout, "%s-", printname); - if (number) fprintf(stdout, "%d-", linenumber - linecount--); + if (number) fprintf(stdout, "%lu-", linenumber - linecount--); pp = end_of_line(pp, endptr, &ellength); FWRITE(p, 1, pp - p, stdout); p = pp; @@ -1916,7 +1916,7 @@ while (ptr < endptr) endhyphenpending = TRUE; if (printname != NULL) fprintf(stdout, "%s:", printname); - if (number) fprintf(stdout, "%d:", linenumber); + if (number) fprintf(stdout, "%lu:", linenumber); /* In multiline mode, we want to print to the end of the line in which the end of the matched string is found, so we adjust linelength and the @@ -2112,7 +2112,7 @@ if (count_only && !quiet) { if (printname != NULL && filenames != FN_NONE) fprintf(stdout, "%s:", printname); - fprintf(stdout, "%d\n", count); + fprintf(stdout, "%lu\n", count); } } @@ -2234,7 +2234,7 @@ if (isdirectory(pathname)) if (dee_action == dee_RECURSE) { - char buffer[1024]; + char buffer[2048]; char *nextfile; directory_type *dir = opendirectory(pathname); @@ -2249,7 +2249,14 @@ if (isdirectory(pathname)) while ((nextfile = readdirectory(dir)) != NULL) { int frc; - sprintf(buffer, "%.512s%c%.128s", pathname, FILESEP, nextfile); + int fnlength = strlen(pathname) + strlen(nextfile) + 2; + if (fnlength > 2048) + { + fprintf(stderr, "pcre2grep: recursive filename is too long\n"); + rc = 2; + break; + } + sprintf(buffer, "%s%c%s", pathname, FILESEP, nextfile); frc = grep_or_recurse(buffer, dir_recurse, FALSE); if (frc > 1) rc = frc; else if (frc == 0 && rc == 1) rc = 0; @@ -2520,7 +2527,14 @@ if ((popts & PO_FIXED_STRINGS) != 0) } } -sprintf(buffer, "%s%.*s%s", prefix[popts], patlen, ps, suffix[popts]); +if (snprintf(buffer, PATBUFSIZE, "%s%.*s%s", prefix[popts], patlen, ps, + suffix[popts]) > PATBUFSIZE) + { + fprintf(stderr, "pcregrep: Buffer overflow while compiling \"%s\"\n", + ps); + return FALSE; + } + p->compiled = pcre_compile(buffer, options, &error, &errptr, pcretables); if (p->compiled != NULL) return TRUE; @@ -2756,8 +2770,15 @@ for (i = 1; i < argc; i++) int arglen = (argequals == NULL || equals == NULL)? (int)strlen(arg) : (int)(argequals - arg); - sprintf(buff1, "%.*s", baselen, op->long_name); - sprintf(buff2, "%s%.*s", buff1, fulllen - baselen - 2, opbra + 1); + if (snprintf(buff1, sizeof(buff1), "%.*s", baselen, op->long_name) > + (int)sizeof(buff1) || + snprintf(buff2, sizeof(buff2), "%s%.*s", buff1, + fulllen - baselen - 2, opbra + 1) > (int)sizeof(buff2)) + { + fprintf(stderr, "pcregrep: Buffer overflow when parsing %s option\n", + op->long_name); + pcregrep_exit(2); + } if (strncmp(arg, buff1, arglen) == 0 || strncmp(arg, buff2, arglen) == 0) diff --git a/pcre/pcreposix.c b/pcre/pcreposix.c index 7b404a711..a76d6bfca 100644 --- a/pcre/pcreposix.c +++ b/pcre/pcreposix.c @@ -6,7 +6,7 @@ and semantics are as close as possible to those of the Perl 5 language. Written by Philip Hazel - Copyright (c) 1997-2017 University of Cambridge + Copyright (c) 1997-2018 University of Cambridge ----------------------------------------------------------------------------- Redistribution and use in source and binary forms, with or without @@ -389,8 +389,8 @@ if (rc >= 0) { for (i = 0; i < (size_t)rc; i++) { - pmatch[i].rm_so = ovector[i*2] + so; - pmatch[i].rm_eo = ovector[i*2+1] + so; + pmatch[i].rm_so = (ovector[i*2] < 0)? -1 : ovector[i*2] + so; + pmatch[i].rm_eo = (ovector[i*2+1] < 0)? -1: ovector[i*2+1] + so; } if (allocated_ovector) free(ovector); for (; i < nmatch; i++) pmatch[i].rm_so = pmatch[i].rm_eo = -1; diff --git a/pcre/testdata/testinput2 b/pcre/testdata/testinput2 index 08c6f39a5..8ba4dc4dd 100644 --- a/pcre/testdata/testinput2 +++ b/pcre/testdata/testinput2 @@ -4249,4 +4249,12 @@ backtracking verbs. --/ /(?=.*[A-Z])/I +"(?<=(a))\1?b" + ab + aaab + +"(?=(a))\1?b" + ab + aaab + /-- End of testinput2 --/ diff --git a/pcre/testdata/testinput5 b/pcre/testdata/testinput5 index 28561a935..c94008c3f 100644 --- a/pcre/testdata/testinput5 +++ b/pcre/testdata/testinput5 @@ -798,4 +798,10 @@ /(?<=\K\x{17f})/8G+ \x{17f}\x{17f}\x{17f}\x{17f}\x{17f} +/\C[^\v]+\x80/8 + [Aá¿»BÅ€C] + +/\C[^\d]+\x80/8 + [Aá¿»BÅ€C] + /-- End of testinput5 --/ diff --git a/pcre/testdata/testoutput2 b/pcre/testdata/testoutput2 index 811bbefc8..61ed8d9d4 100644 --- a/pcre/testdata/testoutput2 +++ b/pcre/testdata/testoutput2 @@ -14705,4 +14705,20 @@ No options No first char No need char +"(?<=(a))\1?b" + ab + 0: b + 1: a + aaab + 0: ab + 1: a + +"(?=(a))\1?b" + ab + 0: ab + 1: a + aaab + 0: ab + 1: a + /-- End of testinput2 --/ diff --git a/pcre/testdata/testoutput5 b/pcre/testdata/testoutput5 index bab989ca7..090e1e1c8 100644 --- a/pcre/testdata/testoutput5 +++ b/pcre/testdata/testoutput5 @@ -1942,4 +1942,12 @@ Need char = 'z' 0: \x{17f} 0+ +/\C[^\v]+\x80/8 + [Aá¿»BÅ€C] +No match + +/\C[^\d]+\x80/8 + [Aá¿»BÅ€C] +No match + /-- End of testinput5 --/ diff --git a/plugin/auth_pam/mapper/pam_user_map.c b/plugin/auth_pam/mapper/pam_user_map.c index e62be946c..c03ea12be 100644 --- a/plugin/auth_pam/mapper/pam_user_map.c +++ b/plugin/auth_pam/mapper/pam_user_map.c @@ -22,14 +22,24 @@ top: accounting @group_ro: readonly ========================================================= +If something doesn't work as expected you can get verbose +comments with the 'debug' option like this +========================================================= +auth required pam_user_map.so debug +========================================================= +These comments are written to the syslog as 'authpriv.debug' +and usually end up in /var/log/secure file. */ #include #include +#include +#include #include #include #include +#include #include #define FILENAME "/etc/security/user_map.conf" @@ -90,9 +100,42 @@ static int user_in_group(const gid_t *user_groups, int ng,const char *group) } +static void print_groups(pam_handle_t *pamh, const gid_t *user_groups, int ng) +{ + char buf[256]; + char *c_buf= buf, *buf_end= buf+sizeof(buf)-2; + struct group *gr; + int cg; + + for (cg=0; cg < ng; cg++) + { + char *c; + if (c_buf == buf_end) + break; + *(c_buf++)= ','; + if (!(gr= getgrgid(user_groups[cg])) || + !(c= gr->gr_name)) + continue; + while (*c) + { + if (c_buf == buf_end) + break; + *(c_buf++)= *(c++); + } + } + c_buf[0]= c_buf[1]= 0; + pam_syslog(pamh, LOG_DEBUG, "User belongs to %d %s [%s].\n", + ng, (ng == 1) ? "group" : "groups", buf+1); +} + + +static const char debug_keyword[]= "debug"; +#define SYSLOG_DEBUG if (mode_debug) pam_syslog + int pam_sm_authenticate(pam_handle_t *pamh, int flags, int argc, const char *argv[]) { + int mode_debug= 0; int pam_err, line= 0; const char *username; char buf[256]; @@ -101,6 +144,14 @@ int pam_sm_authenticate(pam_handle_t *pamh, int flags, gid_t *groups= group_buffer; int n_groups= -1; + for (; argc > 0; argc--) + { + if (strcasecmp(argv[argc-1], debug_keyword) == 0) + mode_debug= 1; + } + + SYSLOG_DEBUG(pamh, LOG_DEBUG, "Opening file '%s'.\n", FILENAME); + f= fopen(FILENAME, "r"); if (f == NULL) { @@ -110,12 +161,18 @@ int pam_sm_authenticate(pam_handle_t *pamh, int flags, pam_err = pam_get_item(pamh, PAM_USER, (const void**)&username); if (pam_err != PAM_SUCCESS) + { + pam_syslog(pamh, LOG_ERR, "Cannot get username.\n"); goto ret; + } + + SYSLOG_DEBUG(pamh, LOG_DEBUG, "Incoming username '%s'.\n", username); while (fgets(buf, sizeof(buf), f) != NULL) { char *s= buf, *from, *to, *end_from, *end_to; int check_group; + int cmp_result; line++; @@ -124,7 +181,11 @@ int pam_sm_authenticate(pam_handle_t *pamh, int flags, if ((check_group= *s == '@')) { if (n_groups < 0) + { n_groups= populate_user_groups(username, &groups); + if (mode_debug) + print_groups(pamh, groups, n_groups); + } s++; } from= s; @@ -139,14 +200,30 @@ int pam_sm_authenticate(pam_handle_t *pamh, int flags, if (end_to == to) goto syntax_error; *end_from= *end_to= 0; - if (check_group ? - user_in_group(groups, n_groups, from) : - (strcmp(username, from) == 0)) + + if (check_group) + { + cmp_result= user_in_group(groups, n_groups, from); + SYSLOG_DEBUG(pamh, LOG_DEBUG, "Check if user is in group '%s': %s\n", + from, cmp_result ? "YES":"NO"); + } + else + { + cmp_result= (strcmp(username, from) == 0); + SYSLOG_DEBUG(pamh, LOG_DEBUG, "Check if username '%s': %s\n", + from, cmp_result ? "YES":"NO"); + } + if (cmp_result) { pam_err= pam_set_item(pamh, PAM_USER, to); + SYSLOG_DEBUG(pamh, LOG_DEBUG, + (pam_err == PAM_SUCCESS) ? "User mapped as '%s'\n" : + "Couldn't map as '%s'\n", to); goto ret; } } + + SYSLOG_DEBUG(pamh, LOG_DEBUG, "User not found in the list.\n"); pam_err= PAM_AUTH_ERR; goto ret; @@ -162,6 +239,7 @@ int pam_sm_authenticate(pam_handle_t *pamh, int flags, return pam_err; } + int pam_sm_setcred(pam_handle_t *pamh, int flags, int argc, const char *argv[]) { diff --git a/plugin/disks/CMakeLists.txt b/plugin/disks/CMakeLists.txt new file mode 100644 index 000000000..446c64d0f --- /dev/null +++ b/plugin/disks/CMakeLists.txt @@ -0,0 +1,5 @@ +IF("${CMAKE_SYSTEM}" MATCHES "Linux") + INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/sql) + MYSQL_ADD_PLUGIN(DISKS information_schema_disks.cc MODULE_ONLY RECOMPILE_FOR_EMBEDDED) +ENDIF() + diff --git a/plugin/disks/README.txt b/plugin/disks/README.txt new file mode 100644 index 000000000..b49db3c03 --- /dev/null +++ b/plugin/disks/README.txt @@ -0,0 +1,86 @@ +Information Schema Disks +------------------------ +This is a proof-of-concept information schema plugin that allows the +disk space situation to be monitored. When installed, it can be used +as follows: + + > select * from information_schema.disks; + +-----------+-----------------------+-----------+----------+-----------+ + | Disk | Path | Total | Used | Available | + +-----------+-----------------------+-----------+----------+-----------+ + | /dev/sda3 | / | 47929956 | 30666304 | 14805864 | + | /dev/sda1 | /boot/efi | 191551 | 3461 | 188090 | + | /dev/sda4 | /home | 174679768 | 80335392 | 85448120 | + | /dev/sdb1 | /mnt/hdd | 961301832 | 83764 | 912363644 | + | /dev/sdb1 | /home/wikman/Music | 961301832 | 83764 | 912363644 | + | /dev/sdb1 | /home/wikman/Videos | 961301832 | 83764 | 912363644 | + | /dev/sdb1 | /home/wikman/hdd | 961301832 | 83764 | 912363644 | + | /dev/sdb1 | /home/wikman/Pictures | 961301832 | 83764 | 912363644 | + | /dev/sda3 | /var/lib/docker/aufs | 47929956 | 30666304 | 14805864 | + +-----------+-----------------------+-----------+----------+-----------+ + 9 rows in set (0.00 sec) + +- 'Disk' is the name of the disk itself. +- 'Path' is the mount point of the disk. +- 'Total' is the total space in KiB. +- 'Used' is the used amount of space in KiB, and +- 'Available' is the amount of space in KiB available to non-root users. + +Note that as the amount of space available to root may be more that what +is available to non-root users, 'available' + 'used' may be less than 'total'. + +All paths to which a particular disk has been mounted are reported. The +rationale is that someone might want to take different action e.g. depending +on which disk is relevant for a particular path. This leads to the same disk +being reported multiple times. An alternative to this would be to have two +tables; disks and mounts. + + > select * from information_schema.disks; + +-----------+-----------+----------+-----------+ + | Disk | Total | Used | Available | + +-----------+-----------+----------+-----------+ + | /dev/sda3 | 47929956 | 30666304 | 14805864 | + | /dev/sda1 | 191551 | 3461 | 188090 | + | /dev/sda4 | 174679768 | 80335392 | 85448120 | + | /dev/sdb1 | 961301832 | 83764 | 912363644 | + +-----------+-----------+----------+-----------+ + + > select * from information_schema.mounts; + +-----------------------+-----------+ + | Path | Disk | + +-----------------------+-----------+ + | / | /dev/sda3 | + | /boot/efi | /dev/sda1 | + | /home | /dev/sda4 | + | /mnt/hdd | /dev/sdb1 | + | /home/wikman/Music | /dev/sdb1 | + ... + + +Installation +------------ + +- Use "install plugin" or "install soname" command: + + MariaDB [(none)]> install plugin disks soname 'disks.so'; + + or + + MariaDB [(none)]> install soname 'disks.so'; + +Usage +----- +The plugin appears as the table 'disks' in 'information_schema'. + + MariaDB [(none)]> select * from information_schema.disks; + +-----------+-----------------------+-----------+----------+-----------+ + | Disk | Path | Total | Used | Available | + +-----------+-----------------------+-----------+----------+-----------+ + | /dev/sda3 | / | 47929956 | 30666308 | 14805860 | + | /dev/sda1 | /boot/efi | 191551 | 3461 | 188090 | + | /dev/sda4 | /home | 174679768 | 80348148 | 85435364 | + | /dev/sdb1 | /mnt/hdd | 961301832 | 83764 | 912363644 | + | /dev/sdb1 | /home/wikman/Music | 961301832 | 83764 | 912363644 | + | /dev/sdb1 | /home/wikman/Videos | 961301832 | 83764 | 912363644 | + ... + diff --git a/plugin/disks/information_schema_disks.cc b/plugin/disks/information_schema_disks.cc new file mode 100644 index 000000000..122b3d3f1 --- /dev/null +++ b/plugin/disks/information_schema_disks.cc @@ -0,0 +1,155 @@ +/* + Copyright (c) 2017, MariaDB + + 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 Street, Fifth Floor, Boston, MA 02110-1301, USA */ + +#include +#include +#include +#include +#include + +bool schema_table_store_record(THD *thd, TABLE *table); + +namespace +{ + +struct st_mysql_information_schema disks_table_info = { MYSQL_INFORMATION_SCHEMA_INTERFACE_VERSION }; + +ST_FIELD_INFO disks_table_fields[]= +{ + { "Disk", PATH_MAX, MYSQL_TYPE_STRING, 0, 0 ,0, 0 }, + { "Path", PATH_MAX, MYSQL_TYPE_STRING, 0, 0 ,0, 0 }, + { "Total", 32, MYSQL_TYPE_LONG, 0, 0 ,0 ,0 }, // Total amount available + { "Used", 32, MYSQL_TYPE_LONG, 0, 0 ,0 ,0 }, // Amount of space used + { "Available", 32, MYSQL_TYPE_LONG, 0, 0 ,0 ,0 }, // Amount available to users other than root. + { 0, 0, MYSQL_TYPE_NULL, 0, 0, 0, 0 } +}; + +int disks_table_add_row(THD* pThd, + TABLE* pTable, + const char* zDisk, + const char* zPath, + const struct statvfs& info) +{ + // From: http://pubs.opengroup.org/onlinepubs/009695399/basedefs/sys/statvfs.h.html + // + // f_frsize Fundamental file system block size. + // f_blocks Total number of blocks on file system in units of f_frsize. + // f_bfree Total number of free blocks. + // f_bavail Number of free blocks available to non-privileged process. + + size_t total = (info.f_frsize * info.f_blocks) / 1024; + size_t used = (info.f_frsize * (info.f_blocks - info.f_bfree)) / 1024; + size_t avail = (info.f_frsize * info.f_bavail) / 1024; + + pTable->field[0]->store(zDisk, strlen(zDisk), system_charset_info); + pTable->field[1]->store(zPath, strlen(zPath), system_charset_info); + pTable->field[2]->store(total); + pTable->field[3]->store(used); + pTable->field[4]->store(avail); + + // 0 means success. + return (schema_table_store_record(pThd, pTable) != 0) ? 1 : 0; +} + +int disks_table_add_row(THD* pThd, TABLE* pTable, const char* zDisk, const char* zPath) +{ + int rv = 0; + + struct statvfs info; + + if (statvfs(zPath, &info) == 0) // We ignore failures. + { + rv = disks_table_add_row(pThd, pTable, zDisk, zPath, info); + } + + return rv; +} + +int disks_fill_table(THD* pThd, TABLE_LIST* pTables, Item* pCond) +{ + int rv = 1; + TABLE* pTable = pTables->table; + + FILE* pFile = setmntent("/etc/mtab", "r"); + + if (pFile) + { + const size_t BUFFER_SIZE = 4096; // 4K should be sufficient. + + char* pBuffer = new (std::nothrow) char [BUFFER_SIZE]; + + if (pBuffer) + { + rv = 0; + + struct mntent ent; + struct mntent* pEnt; + + while ((rv == 0) && (pEnt = getmntent_r(pFile, &ent, pBuffer, BUFFER_SIZE))) + { + // We only report the ones that refer to physical disks. + if (pEnt->mnt_fsname[0] == '/') + { + rv = disks_table_add_row(pThd, pTable, pEnt->mnt_fsname, pEnt->mnt_dir); + } + } + + delete [] pBuffer; + } + else + { + rv = 1; + } + + endmntent(pFile); + } + + return rv; +} + +int disks_table_init(void *ptr) +{ + ST_SCHEMA_TABLE* pSchema_table = (ST_SCHEMA_TABLE*)ptr; + + pSchema_table->fields_info = disks_table_fields; + pSchema_table->fill_table = disks_fill_table; + return 0; +} + +} + +extern "C" +{ + +maria_declare_plugin(disks) +{ + MYSQL_INFORMATION_SCHEMA_PLUGIN, + &disks_table_info, /* type-specific descriptor */ + "DISKS", /* table name */ + "Johan Wikman", /* author */ + "Disk space information", /* description */ + PLUGIN_LICENSE_GPL, /* license type */ + disks_table_init, /* init function */ + NULL, /* deinit function */ + 0x0100, /* version = 1.0 */ + NULL, /* no status variables */ + NULL, /* no system variables */ + "1.0", /* String version representation */ + MariaDB_PLUGIN_MATURITY_BETA /* Maturity (see include/mysql/plugin.h)*/ +} +mysql_declare_plugin_end; + +} diff --git a/plugin/disks/mysql-test/disks/disks.result b/plugin/disks/mysql-test/disks/disks.result new file mode 100644 index 000000000..bd6befc5e --- /dev/null +++ b/plugin/disks/mysql-test/disks/disks.result @@ -0,0 +1,12 @@ +show create table information_schema.disks; +Table Create Table +DISKS CREATE TEMPORARY TABLE `DISKS` ( + `Disk` varchar(4096) NOT NULL DEFAULT '', + `Path` varchar(4096) NOT NULL DEFAULT '', + `Total` int(32) NOT NULL DEFAULT '0', + `Used` int(32) NOT NULL DEFAULT '0', + `Available` int(32) NOT NULL DEFAULT '0' +) ENGINE=MEMORY DEFAULT CHARSET=utf8 +select sum(Total) > sum(Available), sum(Total)>sum(Used) from information_schema.disks; +sum(Total) > sum(Available) sum(Total)>sum(Used) +1 1 diff --git a/plugin/disks/mysql-test/disks/disks.test b/plugin/disks/mysql-test/disks/disks.test new file mode 100644 index 000000000..13a0762ae --- /dev/null +++ b/plugin/disks/mysql-test/disks/disks.test @@ -0,0 +1,2 @@ +show create table information_schema.disks; +select sum(Total) > sum(Available), sum(Total)>sum(Used) from information_schema.disks; diff --git a/plugin/disks/mysql-test/disks/suite.opt b/plugin/disks/mysql-test/disks/suite.opt new file mode 100644 index 000000000..afbbe2b01 --- /dev/null +++ b/plugin/disks/mysql-test/disks/suite.opt @@ -0,0 +1 @@ +--plugin-load-add=$DISKS_SO diff --git a/plugin/disks/mysql-test/disks/suite.pm b/plugin/disks/mysql-test/disks/suite.pm new file mode 100644 index 000000000..c64ef3b31 --- /dev/null +++ b/plugin/disks/mysql-test/disks/suite.pm @@ -0,0 +1,10 @@ +package My::Suite::Disks; + +@ISA = qw(My::Suite); + +return "No Disks plugin" unless $ENV{DISKS_SO}; + +sub is_default { 1 } + +bless { }; + diff --git a/plugin/server_audit/server_audit.c b/plugin/server_audit/server_audit.c index 0a266ab19..b5f6e996b 100644 --- a/plugin/server_audit/server_audit.c +++ b/plugin/server_audit/server_audit.c @@ -15,7 +15,7 @@ #define PLUGIN_VERSION 0x104 -#define PLUGIN_STR_VERSION "1.4.3" +#define PLUGIN_STR_VERSION "1.4.4" #define _my_thread_var loc_thread_var @@ -364,16 +364,17 @@ static MYSQL_SYSVAR_STR(excl_users, excl_users, PLUGIN_VAR_RQCMDARG, /* bits in the event filter. */ #define EVENT_CONNECT 1 #define EVENT_QUERY_ALL 2 -#define EVENT_QUERY 58 +#define EVENT_QUERY 122 #define EVENT_TABLE 4 #define EVENT_QUERY_DDL 8 #define EVENT_QUERY_DML 16 #define EVENT_QUERY_DCL 32 +#define EVENT_QUERY_DML_NO_SELECT 64 static const char *event_names[]= { "CONNECT", "QUERY", "TABLE", "QUERY_DDL", "QUERY_DML", "QUERY_DCL", - NULL + "QUERY_DML_NO_SELECT", NULL }; static TYPELIB events_typelib= { @@ -381,7 +382,7 @@ static TYPELIB events_typelib= }; static MYSQL_SYSVAR_SET(events, events, PLUGIN_VAR_RQCMDARG, "Specifies the set of events to monitor. Can be CONNECT, QUERY, TABLE," - " QUERY_DDL, QUERY_DML, QUERY_DCL.", + " QUERY_DDL, QUERY_DML, QUERY_DML_NO_SELECT, QUERY_DCL.", NULL, NULL, 0, &events_typelib); #define OUTPUT_SYSLOG 0 #define OUTPUT_FILE 1 @@ -855,6 +856,21 @@ struct sa_keyword dml_keywords[]= }; +struct sa_keyword dml_no_select_keywords[]= +{ + {2, "DO", 0, SQLCOM_DML}, + {4, "CALL", 0, SQLCOM_DML}, + {4, "LOAD", &data_word, SQLCOM_DML}, + {4, "LOAD", &xml_word, SQLCOM_DML}, + {6, "DELETE", 0, SQLCOM_DML}, + {6, "INSERT", 0, SQLCOM_DML}, + {6, "UPDATE", 0, SQLCOM_DML}, + {7, "HANDLER", 0, SQLCOM_DML}, + {7, "REPLACE", 0, SQLCOM_DML}, + {0, NULL, 0, SQLCOM_DML} +}; + + struct sa_keyword dcl_keywords[]= { {6, "CREATE", &user_word, SQLCOM_DCL}, @@ -1636,6 +1652,11 @@ static int log_statement_ex(const struct connection_info *cn, if (filter_query_type(query, dml_keywords)) goto do_log_query; } + if (events & EVENT_QUERY_DML_NO_SELECT) + { + if (filter_query_type(query, dml_no_select_keywords)) + goto do_log_query; + } if (events & EVENT_QUERY_DCL) { if (filter_query_type(query, dcl_keywords)) diff --git a/scripts/CMakeLists.txt b/scripts/CMakeLists.txt index 880458c15..b994c9f67 100644 --- a/scripts/CMakeLists.txt +++ b/scripts/CMakeLists.txt @@ -366,6 +366,22 @@ ELSE() COMPONENT ${${file}_COMPONENT} ) ENDFOREACH() + SET (wsrep_sst_rsync_wan ${CMAKE_CURRENT_BINARY_DIR}/wsrep_sst_rsync_wan) + ADD_CUSTOM_COMMAND( + OUTPUT ${wsrep_sst_rsync_wan} + COMMAND ${CMAKE_COMMAND} ARGS -E create_symlink + wsrep_sst_rsync + wsrep_sst_rsync_wan + ) + ADD_CUSTOM_TARGET(symlink_wsrep_sst_rsync + ALL + DEPENDS ${wsrep_sst_rsync_wan} + ) + INSTALL( + FILES ${wsrep_sst_rsync_wan} + DESTINATION ${INSTALL_BINDIR} + COMPONENT Server + ) FOREACH(file ${WSREP_SOURCE}) CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/${file}.sh @@ -379,7 +395,6 @@ ELSE() COMPONENT ${${file}_COMPONENT} ) ENDFOREACH() - ENDIF() # Install libgcc as mylibgcc.a diff --git a/scripts/wsrep_sst_common.sh b/scripts/wsrep_sst_common.sh index a8f671de2..e160bf5c7 100644 --- a/scripts/wsrep_sst_common.sh +++ b/scripts/wsrep_sst_common.sh @@ -35,18 +35,24 @@ case "$1" in # # Break address string into host:port/path parts # - readonly WSREP_SST_OPT_HOST=${WSREP_SST_OPT_ADDR%%[:/]*} - if [ ${WSREP_SST_OPT_HOST:0:1} = '[' ] - then - # IPv6 notation - readonly WSREP_SST_OPT_HOST_UNESCAPED=${WSREP_SST_OPT_HOST:1:-1} - else - readonly WSREP_SST_OPT_HOST_UNESCAPED=${WSREP_SST_OPT_HOST} - fi - readonly WSREP_SST_OPT_PORT=$(echo $WSREP_SST_OPT_ADDR | \ - cut -d ']' -f 2 | cut -s -d ':' -f 2 | cut -d '/' -f 1) + case "${WSREP_SST_OPT_ADDR}" in + \[*) + # IPv6 + addr_no_bracket=${WSREP_SST_OPT_ADDR#\[} + readonly WSREP_SST_OPT_HOST_UNESCAPED=${addr_no_bracket%%\]*} + readonly WSREP_SST_OPT_HOST="[${WSREP_SST_OPT_HOST_UNESCAPED}]" + ;; + *) + readonly WSREP_SST_OPT_HOST=${WSREP_SST_OPT_ADDR%%[:/]*} + readonly WSREP_SST_OPT_HOST_UNESCAPED=$WSREP_SST_OPT_HOST + ;; + esac + remain=${WSREP_SST_OPT_ADDR#${WSREP_SST_OPT_HOST}} + remain=${remain#:} + readonly WSREP_SST_OPT_ADDR_PORT=${remain%%/*} + remain=${remain#*/} + readonly WSREP_SST_OPT_MODULE=${remain%%/*} readonly WSREP_SST_OPT_PATH=${WSREP_SST_OPT_ADDR#*/} - readonly WSREP_SST_OPT_MODULE=${WSREP_SST_OPT_PATH%%/*} remain=${WSREP_SST_OPT_PATH#*/} readonly WSREP_SST_OPT_LSN=${remain%%/*} remain=${remain#*/} @@ -126,6 +132,17 @@ done readonly WSREP_SST_OPT_BYPASS readonly WSREP_SST_OPT_BINLOG +if [ -n "${WSREP_SST_OPT_ADDR_PORT:-}" ]; then + if [ -n "${WSREP_SST_OPT_PORT:-}" ]; then + if [ "$WSREP_SST_OPT_PORT" != "$WSREP_SST_OPT_ADDR_PORT" ]; then + echo "WSREP_SST: [ERROR] port in --port=$WSREP_SST_OPT_PORT differs from port in --address=$WSREP_SST_OPT_ADDR" >&2 + exit 2 + fi + else + readonly WSREP_SST_OPT_PORT="$WSREP_SST_OPT_ADDR_PORT" + fi +fi + # try to use my_print_defaults, mysql and mysqldump that come with the sources # (for MTR suite) SCRIPTS_DIR="$(cd $(dirname "$0"); pwd -P)" diff --git a/scripts/wsrep_sst_mariabackup.sh b/scripts/wsrep_sst_mariabackup.sh index 9e3fc5429..549161aa8 100644 --- a/scripts/wsrep_sst_mariabackup.sh +++ b/scripts/wsrep_sst_mariabackup.sh @@ -179,12 +179,26 @@ get_transfer() wsrep_log_info "Using netcat as streamer" if [[ "$WSREP_SST_OPT_ROLE" == "joiner" ]];then if nc -h 2>&1 | grep -q ncat;then + # Ncat tcmd="nc -l ${TSST_PORT}" - else + elif nc -h 2>&1 | grep -q -- '-d\>';then + # Debian netcat tcmd="nc -dl ${TSST_PORT}" + else + # traditional netcat + tcmd="nc -l -p ${TSST_PORT}" fi else - tcmd="nc ${REMOTEIP} ${TSST_PORT}" + if nc -h 2>&1 | grep -q ncat;then + # Ncat + tcmd="nc ${REMOTEIP} ${TSST_PORT}" + elif nc -h 2>&1 | grep -q -- '-d\>';then + # Debian netcat + tcmd="nc ${REMOTEIP} ${TSST_PORT}" + else + # traditional netcat + tcmd="nc -q0 ${REMOTEIP} ${TSST_PORT}" + fi fi else tfmt='socat' diff --git a/scripts/wsrep_sst_mysqldump.sh b/scripts/wsrep_sst_mysqldump.sh index 358247359..faa3f1063 100644 --- a/scripts/wsrep_sst_mysqldump.sh +++ b/scripts/wsrep_sst_mysqldump.sh @@ -108,22 +108,21 @@ then DROP PREPARE stmt;" fi -# Retrieve the donor's @@global.gtid_binlog_state. -GTID_BINLOG_STATE=$(echo "SHOW GLOBAL VARIABLES LIKE 'gtid_binlog_state'" |\ -$MYSQL_CLIENT $AUTH -S$WSREP_SST_OPT_SOCKET --disable-reconnect --connect_timeout=10 |\ -tail -1 | awk -F ' ' '{ print $2 }') - MYSQL="$MYSQL_CLIENT $WSREP_SST_OPT_CONF "\ "$AUTH -h${WSREP_SST_OPT_HOST_UNESCAPED} "\ "-P$WSREP_SST_OPT_PORT --disable-reconnect --connect_timeout=10" # Check if binary logging is enabled on the joiner node. # Note: SELECT cannot be used at this point. -LOG_BIN=$(echo "SHOW VARIABLES LIKE 'log_bin'" | $MYSQL |\ +LOG_BIN=$(echo "set statement wsrep_sync_wait=0 for SHOW VARIABLES LIKE 'log_bin'" | $MYSQL |\ tail -1 | awk -F ' ' '{ print $2 }') # Check the joiner node's server version. -SERVER_VERSION=$(echo "SHOW VARIABLES LIKE 'version'" | $MYSQL |\ +SERVER_VERSION=$(echo "set statement wsrep_sync_wait=0 for SHOW VARIABLES LIKE 'version'" | $MYSQL |\ +tail -1 | awk -F ' ' '{ print $2 }') + +# Retrieve the donor's @@global.gtid_binlog_state. +GTID_BINLOG_STATE=$(echo "SHOW GLOBAL VARIABLES LIKE 'gtid_binlog_state'" | $MYSQL |\ tail -1 | awk -F ' ' '{ print $2 }') RESET_MASTER="" @@ -131,7 +130,7 @@ SET_GTID_BINLOG_STATE="" SQL_LOG_BIN_OFF="" # Safety check -if echo $SERVER_VERSION | grep '^10.1' > /dev/null +if [ "${SERVER_VERSION%%.*}" != '5' ] then # If binary logging is enabled on the joiner node, we need to copy donor's # gtid_binlog_state to joiner. In order to do that, a RESET MASTER must be @@ -146,7 +145,7 @@ then fi # NOTE: we don't use --routines here because we're dumping mysql.proc table -MYSQLDUMP="$MYSQLDUMP $AUTH -S$WSREP_SST_OPT_SOCKET \ +MYSQLDUMP="$MYSQLDUMP $WSREP_SST_OPT_CONF $AUTH -S$WSREP_SST_OPT_SOCKET \ --add-drop-database --add-drop-table --skip-add-locks --create-options \ --disable-keys --extended-insert --skip-lock-tables --quick --set-charset \ --skip-comments --flush-privileges --all-databases --events" diff --git a/scripts/wsrep_sst_xtrabackup-v2.sh b/scripts/wsrep_sst_xtrabackup-v2.sh index 64dd182e2..00efdaeeb 100644 --- a/scripts/wsrep_sst_xtrabackup-v2.sh +++ b/scripts/wsrep_sst_xtrabackup-v2.sh @@ -268,13 +268,26 @@ get_transfer() wsrep_log_info "Using netcat as streamer" if [[ "$WSREP_SST_OPT_ROLE" == "joiner" ]];then if nc -h 2>&1 | grep -q ncat; then + # Ncat tcmd="nc $sockopt -l ${TSST_PORT}" - else + elif nc -h 2>&1 | grep -q -- '-d\>';then + # Debian netcat tcmd="nc $sockopt -dl ${TSST_PORT}" + else + # traditional netcat + tcmd="nc $sockopt -l -p ${TSST_PORT}" fi else - # netcat doesn't understand [] around IPv6 address - tcmd="nc ${WSREP_SST_OPT_HOST_UNESCAPED} ${TSST_PORT}" + if nc -h 2>&1 | grep -q ncat;then + # Ncat + tcmd="nc ${WSREP_SST_OPT_HOST_UNESCAPED} ${TSST_PORT}" + elif nc -h 2>&1 | grep -q -- '-d\>';then + # Debian netcat + tcmd="nc ${WSREP_SST_OPT_HOST_UNESCAPED} ${TSST_PORT}" + else + # traditional netcat + tcmd="nc -q0 ${WSREP_SST_OPT_HOST_UNESCAPED} ${TSST_PORT}" + fi fi else tfmt='socat' @@ -644,7 +657,7 @@ wait_for_listen() for i in {1..300} do - LSOF_OUT=$(lsof -sTCP:LISTEN -i TCP:${PORT} -a -c nc -c socat -F c) + LSOF_OUT=$(lsof -sTCP:LISTEN -i TCP:${PORT} -a -c nc -c socat -F c 2> /dev/null || :) [ -n "${LSOF_OUT}" ] && break sleep 0.2 done diff --git a/scripts/wsrep_sst_xtrabackup.sh b/scripts/wsrep_sst_xtrabackup.sh index 867aab622..5bf380a81 100644 --- a/scripts/wsrep_sst_xtrabackup.sh +++ b/scripts/wsrep_sst_xtrabackup.sh @@ -144,12 +144,26 @@ get_transfer() wsrep_log_info "Using netcat as streamer" if [[ "$WSREP_SST_OPT_ROLE" == "joiner" ]];then if nc -h 2>&1 | grep -q ncat;then + # Ncat tcmd="nc -l ${TSST_PORT}" - else + elif nc -h 2>&1 | grep -q -- '-d\>';then + # Debian netcat tcmd="nc -dl ${TSST_PORT}" + else + # traditional netcat + tcmd="nc -l -p ${TSST_PORT}" fi else - tcmd="nc ${WSREP_SST_OPT_HOST_UNESCAPED} ${TSST_PORT}" + if nc -h 2>&1 | grep -q ncat;then + # Ncat + tcmd="nc ${REMOTEIP} ${TSST_PORT}" + elif nc -h 2>&1 | grep -q -- '-d\>';then + # Debian netcat + tcmd="nc ${REMOTEIP} ${TSST_PORT}" + else + # traditional netcat + tcmd="nc -q0 ${REMOTEIP} ${TSST_PORT}" + fi fi else tfmt='socat' @@ -394,7 +408,6 @@ if [[ ! ${WSREP_SST_OPT_ROLE} == 'joiner' && ! ${WSREP_SST_OPT_ROLE} == 'donor' fi read_cnf -setup_ports get_stream get_transfer diff --git a/sql-common/client.c b/sql-common/client.c index da18a0fde..b1c2d9cf4 100644 --- a/sql-common/client.c +++ b/sql-common/client.c @@ -1348,7 +1348,9 @@ unpack_fields(MYSQL *mysql, MYSQL_DATA *data,MEM_ROOT *alloc,uint fields, { uchar *pos; /* fields count may be wrong */ - DBUG_ASSERT((uint) (field - result) < fields); + if (field - result >= fields) + goto err; + cli_fetch_lengths(&lengths[0], row->data, default_value ? 8 : 7); field->catalog= strmake_root(alloc,(char*) row->data[0], lengths[0]); field->db= strmake_root(alloc,(char*) row->data[1], lengths[1]); @@ -1366,12 +1368,7 @@ unpack_fields(MYSQL *mysql, MYSQL_DATA *data,MEM_ROOT *alloc,uint fields, /* Unpack fixed length parts */ if (lengths[6] != 12) - { - /* malformed packet. signal an error. */ - free_rows(data); /* Free old data */ - set_mysql_error(mysql, CR_MALFORMED_PACKET, unknown_sqlstate); - DBUG_RETURN(0); - } + goto err; pos= (uchar*) row->data[6]; field->charsetnr= uint2korr(pos); @@ -1398,6 +1395,8 @@ unpack_fields(MYSQL *mysql, MYSQL_DATA *data,MEM_ROOT *alloc,uint fields, /* old protocol, for backward compatibility */ for (row=data->data; row ; row = row->next,field++) { + if (field - result >= fields) + goto err; cli_fetch_lengths(&lengths[0], row->data, default_value ? 6 : 5); field->org_table= field->table= strdup_root(alloc,(char*) row->data[0]); field->name= strdup_root(alloc,(char*) row->data[1]); @@ -1434,8 +1433,17 @@ unpack_fields(MYSQL *mysql, MYSQL_DATA *data,MEM_ROOT *alloc,uint fields, } } #endif /* DELETE_SUPPORT_OF_4_0_PROTOCOL */ + if (field - result < fields) + goto err; free_rows(data); /* Free old data */ DBUG_RETURN(result); + +err: + /* malformed packet. signal an error. */ + free_rows(data); + free_root(alloc, MYF(0)); + set_mysql_error(mysql, CR_MALFORMED_PACKET, unknown_sqlstate); + DBUG_RETURN(0); } /* Read all rows (fields or data) from server */ @@ -1504,7 +1512,7 @@ MYSQL_DATA *cli_read_rows(MYSQL *mysql,MYSQL_FIELD *mysql_fields, else { cur->data[field] = to; - if (len > (ulong) (end_to - to)) + if (unlikely(len > (ulong)(end_to-to) || to > end_to)) { free_rows(result); set_mysql_error(mysql, CR_MALFORMED_PACKET, unknown_sqlstate); @@ -1576,7 +1584,7 @@ read_one_row(MYSQL *mysql,uint fields,MYSQL_ROW row, ulong *lengths) } else { - if (len > (ulong) (end_pos - pos)) + if (unlikely(len > (ulong)(end_pos - pos) || pos > end_pos)) { set_mysql_error(mysql, CR_UNKNOWN_ERROR, unknown_sqlstate); return -1; @@ -1821,7 +1829,8 @@ static int ssl_verify_server_cert(Vio *vio, const char* server_hostname, const c */ #ifdef HAVE_X509_check_host - ret_validation= X509_check_host(server_cert, server_hostname, 0, 0, 0) != 1; + ret_validation= X509_check_host(server_cert, server_hostname, + strlen(server_hostname), 0, 0) != 1; #else subject= X509_get_subject_name(server_cert); cn_loc= X509_NAME_get_index_by_NID(subject, NID_commonName, -1); @@ -2511,10 +2520,14 @@ static int send_client_reply_packet(MCPVIO_EXT *mpvio, if (mysql->client_flag & CLIENT_MULTI_STATEMENTS) mysql->client_flag|= CLIENT_MULTI_RESULTS; -#if defined(HAVE_OPENSSL) && !defined(EMBEDDED_LIBRARY) +#ifdef HAVE_OPENSSL + if (mysql->options.ssl_key || mysql->options.ssl_cert || + mysql->options.ssl_ca || mysql->options.ssl_capath || + mysql->options.ssl_cipher) + mysql->options.use_ssl = 1; if (mysql->options.use_ssl) mysql->client_flag|= CLIENT_SSL; -#endif /* HAVE_OPENSSL && !EMBEDDED_LIBRARY*/ +#endif /* HAVE_OPENSSL */ if (mpvio->db) mysql->client_flag|= CLIENT_CONNECT_WITH_DB; @@ -2737,7 +2750,7 @@ static int client_mpvio_read_packet(struct st_plugin_vio *mpv, uchar **buf) *buf= mysql->net.read_pos; /* was it a request to change plugins ? */ - if (**buf == 254) + if (pkt_len == packet_error || **buf == 254) return (int)packet_error; /* if yes, this plugin shan't continue */ /* @@ -2922,7 +2935,7 @@ int run_plugin_auth(MYSQL *mysql, char *data, uint data_len, compile_time_assert(CR_OK == -1); compile_time_assert(CR_ERROR == 0); - if (res > CR_OK && mysql->net.read_pos[0] != 254) + if (res > CR_OK && (mysql->net.last_errno || mysql->net.read_pos[0] != 254)) { /* the plugin returned an error. write it down in mysql, diff --git a/sql/contributors.h b/sql/contributors.h index 7369dcd14..a0d05af3f 100644 --- a/sql/contributors.h +++ b/sql/contributors.h @@ -41,13 +41,12 @@ struct show_table_contributors_st show_table_contributors[]= { {"Alibaba Cloud", "https://www.alibabacloud.com/", "Platinum Sponsor of the MariaDB Foundation"}, {"Tencent Cloud", "https://cloud.tencent.com", "Platinum Sponsor of the MariaDB Foundation"}, {"Microsoft", "https://microsoft.com/", "Platinum Sponsor of the MariaDB Foundation"}, - {"MariaDB Corporation", "https://mariadb.com", "Founding member, Gold Sponsor of the MariaDB Foundation"}, + {"MariaDB Corporation", "https://mariadb.com", "Founding member, Platinum Sponsor of the MariaDB Foundation"}, {"Visma", "https://visma.com", "Gold Sponsor of the MariaDB Foundation"}, {"DBS", "https://dbs.com", "Gold Sponsor of the MariaDB Foundation"}, {"IBM", "https://www.ibm.com", "Gold Sponsor of the MariaDB Foundation"}, {"Nexedi", "https://www.nexedi.com", "Silver Sponsor of the MariaDB Foundation"}, {"Acronis", "http://www.acronis.com", "Silver Sponsor of the MariaDB Foundation"}, - {"Auttomattic", "https://automattic.com", "Bronze Sponsor of the MariaDB Foundation"}, {"Verkkokauppa.com", "https://www.verkkokauppa.com", "Bronze Sponsor of the MariaDB Foundation"}, {"Virtuozzo", "https://virtuozzo.com", "Bronze Sponsor of the MariaDB Foundation"}, {"Tencent Game DBA", "http://tencentdba.com/about", "Bronze Sponsor of the MariaDB Foundation"}, diff --git a/sql/events.cc b/sql/events.cc index cb81e98a2..b7b263971 100644 --- a/sql/events.cc +++ b/sql/events.cc @@ -462,8 +462,7 @@ Events::update_event(THD *thd, Event_parse_data *parse_data, if (check_access(thd, EVENT_ACL, parse_data->dbname.str, NULL, NULL, 0, 0)) DBUG_RETURN(TRUE); - - WSREP_TO_ISOLATION_BEGIN(WSREP_MYSQL_DB, NULL, NULL) + WSREP_TO_ISOLATION_BEGIN(WSREP_MYSQL_DB, NULL, NULL); if (lock_object_name(thd, MDL_key::EVENT, parse_data->dbname.str, parse_data->name.str)) @@ -592,8 +591,7 @@ Events::drop_event(THD *thd, LEX_STRING dbname, LEX_STRING name, bool if_exists) if (check_access(thd, EVENT_ACL, dbname.str, NULL, NULL, 0, 0)) DBUG_RETURN(TRUE); - - WSREP_TO_ISOLATION_BEGIN(WSREP_MYSQL_DB, NULL, NULL) + WSREP_TO_ISOLATION_BEGIN(WSREP_MYSQL_DB, NULL, NULL); /* Turn off row binlogging of this statement and use statement-based so @@ -619,7 +617,7 @@ Events::drop_event(THD *thd, LEX_STRING dbname, LEX_STRING name, bool if_exists) #ifdef WITH_WSREP error: DBUG_RETURN(TRUE); -#endif +#endif /* WITH_WSREP */ } diff --git a/sql/field.cc b/sql/field.cc index 9bc1fcbff..64c51677c 100644 --- a/sql/field.cc +++ b/sql/field.cc @@ -5788,6 +5788,13 @@ static void calc_datetime_days_diff(MYSQL_TIME *ltime, long days) ltime->second) * 1000000LL + ltime->second_part); unpack_time(timediff, ltime); + /* + unpack_time() broke down hours into ltime members hour,day,month. + Mix them back to ltime->hour using the same factors + that pack_time()/unpack_time() use (i.e. 32 for month). + */ + ltime->hour+= (ltime->month * 32 + ltime->day) * 24; + ltime->month= ltime->day= 0; } ltime->time_type= MYSQL_TIMESTAMP_TIME; } diff --git a/sql/handler.cc b/sql/handler.cc index b2a00e48d..1027a8b10 100644 --- a/sql/handler.cc +++ b/sql/handler.cc @@ -1,5 +1,5 @@ /* Copyright (c) 2000, 2016, Oracle and/or its affiliates. - Copyright (c) 2009, 2016, MariaDB + Copyright (c) 2009, 2018, MariaDB Corporation. 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 @@ -794,7 +794,9 @@ static my_bool closecon_handlerton(THD *thd, plugin_ref plugin, */ void ha_close_connection(THD* thd) { - plugin_foreach(thd, closecon_handlerton, MYSQL_STORAGE_ENGINE_PLUGIN, 0); + plugin_foreach_with_mask(thd, closecon_handlerton, + MYSQL_STORAGE_ENGINE_PLUGIN, + PLUGIN_IS_DELETED|PLUGIN_IS_READY, 0); } static my_bool kill_handlerton(THD *thd, plugin_ref plugin, @@ -3637,12 +3639,15 @@ void handler::print_error(int error, myf errflag) if ((debug_assert_if_crashed_table || global_system_variables.log_warnings > 1)) { + THD *thd= ha_thd(); /* Log error to log before we crash or if extended warnings are requested */ errflag|= ME_NOREFRESH; + if (thd && thd->is_optimistic_slave_worker()) + errflag|= ME_LOG_AS_WARN; } - } + } /* if we got an OS error from a file-based engine, specify a path of error */ if (error < HA_ERR_FIRST && bas_ext()[0]) @@ -4273,18 +4278,6 @@ handler::check_if_supported_inplace_alter(TABLE *altered_table, DBUG_RETURN(HA_ALTER_INPLACE_NOT_SUPPORTED); } - -/* - Default implementation to support in-place alter table - and old online add/drop index API -*/ - -void handler::notify_table_changed() -{ - ha_create_partitioning_metadata(table->s->path.str, NULL, CHF_INDEX_FLAG); -} - - void Alter_inplace_info::report_unsupported_error(const char *not_supported, const char *try_instead) { @@ -4383,7 +4376,7 @@ handler::ha_create_partitioning_metadata(const char *name, */ DBUG_ASSERT(m_lock_type == F_UNLCK || (!old_name && strcmp(name, table_share->path.str))); - mark_trx_read_write(); + return create_partitioning_metadata(name, old_name, action_flag); } @@ -5769,8 +5762,6 @@ static int write_locked_table_maps(THD *thd) typedef bool Log_func(THD*, TABLE*, bool, const uchar*, const uchar*); -static int check_wsrep_max_ws_rows(); - static int binlog_log_row(TABLE* table, const uchar *before_record, const uchar *after_record, @@ -5824,13 +5815,6 @@ static int binlog_log_row(TABLE* table, bool const has_trans= thd->lex->sql_command == SQLCOM_CREATE_TABLE || table->file->has_transactions(); error= (*log_func)(thd, table, has_trans, before_record, after_record); - - /* - Now that the record has been logged, increment wsrep_affected_rows and - also check whether its within the allowable limits (wsrep_max_ws_rows). - */ - if (error == 0) - error= check_wsrep_max_ws_rows(); } } return error ? HA_ERR_RBR_LOGGING_FAILED : 0; @@ -5941,30 +5925,6 @@ int handler::ha_reset() } -static int check_wsrep_max_ws_rows() -{ -#ifdef WITH_WSREP - if (wsrep_max_ws_rows) - { - THD *thd= current_thd; - - if (!WSREP(thd)) - return 0; - - thd->wsrep_affected_rows++; - if (thd->wsrep_exec_mode != REPL_RECV && - thd->wsrep_affected_rows > wsrep_max_ws_rows) - { - trans_rollback_stmt(thd) || trans_rollback(thd); - my_message(ER_ERROR_DURING_COMMIT, "wsrep_max_ws_rows exceeded", MYF(0)); - return ER_ERROR_DURING_COMMIT; - } - } -#endif /* WITH_WSREP */ - return 0; -} - - int handler::ha_write_row(uchar *buf) { int error; @@ -6209,6 +6169,12 @@ void ha_fake_trx_id(THD *thd) DBUG_VOID_RETURN; } + if (thd->wsrep_ws_handle.trx_id != WSREP_UNDEFINED_TRX_ID) + { + WSREP_DEBUG("fake trx id skipped: %lu", thd->wsrep_ws_handle.trx_id); + DBUG_VOID_RETURN; + } + /* Try statement transaction if standard one is not set. */ THD_TRANS *trans= (thd->transaction.all.ha_list) ? &thd->transaction.all : &thd->transaction.stmt; diff --git a/sql/handler.h b/sql/handler.h index 68de7563d..a047f2763 100644 --- a/sql/handler.h +++ b/sql/handler.h @@ -3851,7 +3851,7 @@ class handler :public Sql_alloc @note No errors are allowed during notify_table_changed(). */ - virtual void notify_table_changed(); + virtual void notify_table_changed() { } public: /* End of On-line/in-place ALTER TABLE interface. */ diff --git a/sql/item.cc b/sql/item.cc index 2cc45dc60..e23829c75 100644 --- a/sql/item.cc +++ b/sql/item.cc @@ -166,19 +166,21 @@ bool Item::get_time_with_conversion(THD *thd, MYSQL_TIME *ltime, - truncate the YYYYMMDD part - add (MM*33+DD)*24 to hours - add (MM*31+DD)*24 to hours - Let's return NULL here, to disallow equal field propagation. + Let's return TRUE here, to disallow equal field propagation. Note, If we start to use this method in more pieces of the code other - than eqial field propagation, we should probably return - NULL only if some flag in fuzzydate is set. + than equal field propagation, we should probably return + TRUE only if some flag in fuzzydate is set. */ - return (null_value= true); + return true; } if (datetime_to_time_with_warn(thd, ltime, <ime2, TIME_SECOND_PART_DIGITS)) { /* - Time difference between CURRENT_DATE and ltime - did not fit into the supported TIME range + If the time difference between CURRENT_DATE and ltime + did not fit into the supported TIME range, then we set the + difference to the maximum possible value in the supported TIME range */ + DBUG_ASSERT(0); return (null_value= true); } *ltime= ltime2; @@ -470,7 +472,9 @@ Item::Item(THD *thd): maybe_null=null_value=with_sum_func=with_field=0; in_rollup= 0; with_subselect= 0; - /* Initially this item is not attached to any JOIN_TAB. */ + with_param= 0; + + /* Initially this item is not attached to any JOIN_TAB. */ join_tab_idx= MAX_TABLES; /* Put item in free list so that we can free all items at end */ @@ -512,6 +516,7 @@ Item::Item(THD *thd, Item *item): in_rollup(item->in_rollup), null_value(item->null_value), with_sum_func(item->with_sum_func), + with_param(item->with_param), with_field(item->with_field), fixed(item->fixed), is_autogenerated_name(item->is_autogenerated_name), @@ -1282,7 +1287,7 @@ bool Item::get_date(MYSQL_TIME *ltime,ulonglong fuzzydate) ltime, fuzzydate, field_name_or_null())) goto err; - break; + return null_value= false; } case REAL_RESULT: { @@ -1290,7 +1295,7 @@ bool Item::get_date(MYSQL_TIME *ltime,ulonglong fuzzydate) if (null_value || double_to_datetime_with_warn(value, ltime, fuzzydate, field_name_or_null())) goto err; - break; + return null_value= false; } case DECIMAL_RESULT: { @@ -1299,7 +1304,7 @@ bool Item::get_date(MYSQL_TIME *ltime,ulonglong fuzzydate) decimal_to_datetime_with_warn(res, ltime, fuzzydate, field_name_or_null())) goto err; - break; + return null_value= false; } case STRING_RESULT: { @@ -1309,15 +1314,20 @@ bool Item::get_date(MYSQL_TIME *ltime,ulonglong fuzzydate) str_to_datetime_with_warn(res->charset(), res->ptr(), res->length(), ltime, fuzzydate)) goto err; - break; + return null_value= false; } default: + null_value= true; DBUG_ASSERT(0); } - return null_value= 0; - err: + return null_value|= make_zero_date(ltime, fuzzydate); +} + + +bool Item::make_zero_date(MYSQL_TIME *ltime, ulonglong fuzzydate) +{ /* if the item was not null and convertion failed, we return a zero date if allowed, otherwise - null. @@ -1339,7 +1349,7 @@ bool Item::get_date(MYSQL_TIME *ltime,ulonglong fuzzydate) */ ltime->time_type= MYSQL_TIMESTAMP_TIME; } - return null_value|= !(fuzzydate & TIME_FUZZY_DATES); + return !(fuzzydate & TIME_FUZZY_DATES); } bool Item::get_seconds(ulonglong *sec, ulong *sec_part) @@ -1421,6 +1431,9 @@ bool Item_sp_variable::fix_fields(THD *thd, Item **) max_length= it->max_length; decimals= it->decimals; unsigned_flag= it->unsigned_flag; + with_param= 1; + if (thd->lex->current_select->master_unit()->item) + thd->lex->current_select->master_unit()->item->with_param= 1; fixed= 1; collation.set(it->collation.collation, it->collation.derivation); @@ -3124,6 +3137,15 @@ my_decimal *Item_null::val_decimal(my_decimal *decimal_value) } +bool Item_null::get_date(MYSQL_TIME *ltime, ulonglong fuzzydate) +{ + // following assert is redundant, because fixed=1 assigned in constructor + DBUG_ASSERT(fixed == 1); + make_zero_date(ltime, fuzzydate); + return (null_value= true); +} + + Item *Item_null::safe_charset_converter(THD *thd, CHARSET_INFO *tocs) { return this; @@ -7176,6 +7198,7 @@ void Item_ref::set_properties() split_sum_func() doesn't try to change the reference. */ with_sum_func= (*ref)->with_sum_func; + with_param= (*ref)->with_param; with_field= (*ref)->with_field; fixed= 1; if (alias_name_used) @@ -7601,6 +7624,7 @@ Item_cache_wrapper::Item_cache_wrapper(THD *thd, Item *item_arg): Type_std_attributes::set(orig_item); maybe_null= orig_item->maybe_null; with_sum_func= orig_item->with_sum_func; + with_param= orig_item->with_param; with_field= orig_item->with_field; name= item_arg->name; name_length= item_arg->name_length; @@ -8447,10 +8471,10 @@ bool Item_insert_value::fix_fields(THD *thd, Item **items) } else { - Field *tmp_field= field_arg->field; - /* charset doesn't matter here, it's to avoid sigsegv only */ - tmp_field= new Field_null(0, 0, Field::NONE, field_arg->field->field_name, - &my_charset_bin); + static uchar null_bit=1; + /* charset doesn't matter here */ + Field *tmp_field= new Field_string(0, 0, &null_bit, 1, Field::NONE, + field_arg->field->field_name, &my_charset_bin); if (tmp_field) { tmp_field->init(field_arg->field->table); diff --git a/sql/item.h b/sql/item.h index a9b8006cd..139ce40b2 100644 --- a/sql/item.h +++ b/sql/item.h @@ -663,6 +663,12 @@ class Item: public Value_source, SEL_TREE *get_mm_tree_for_const(RANGE_OPT_PARAM *param); Field *create_tmp_field(bool group, TABLE *table, uint convert_int_length); + /* + This method is used if the item was not null but convertion to + TIME/DATE/DATETIME failed. We return a zero date if allowed, + otherwise - null. + */ + bool make_zero_date(MYSQL_TIME *ltime, ulonglong fuzzydate); public: /* @@ -694,6 +700,7 @@ class Item: public Value_source, of a query with ROLLUP */ bool null_value; /* if item is null */ bool with_sum_func; /* True if item contains a sum func */ + bool with_param; /* True if contains an SP parameter */ /** True if any item except Item_sum contains a field. Set during parsing. */ @@ -2564,6 +2571,7 @@ class Item_null :public Item_basic_constant longlong val_int(); String *val_str(String *str); my_decimal *val_decimal(my_decimal *); + bool get_date(MYSQL_TIME *ltime, ulonglong fuzzydate); int save_in_field(Field *field, bool no_conversions); int save_safe_in_field(Field *field); bool send(Protocol *protocol, String *str); diff --git a/sql/item_cmpfunc.cc b/sql/item_cmpfunc.cc index 4e2e5bd4c..6ffd582c1 100644 --- a/sql/item_cmpfunc.cc +++ b/sql/item_cmpfunc.cc @@ -1358,6 +1358,7 @@ bool Item_in_optimizer::fix_left(THD *thd) } eval_not_null_tables(NULL); with_sum_func= args[0]->with_sum_func; + with_param= args[0]->with_param || args[1]->with_param; with_field= args[0]->with_field; if ((const_item_cache= args[0]->const_item())) { @@ -1406,6 +1407,7 @@ bool Item_in_optimizer::fix_fields(THD *thd, Item **ref) with_subselect= 1; with_sum_func= with_sum_func || args[1]->with_sum_func; with_field= with_field || args[1]->with_field; + with_param= args[0]->with_param || args[1]->with_param; used_tables_and_const_cache_join(args[1]); fixed= 1; return FALSE; @@ -1955,6 +1957,7 @@ void Item_func_interval::fix_length_and_dec() used_tables_and_const_cache_join(row); not_null_tables_cache= row->not_null_tables(); with_sum_func= with_sum_func || row->with_sum_func; + with_param= with_param || row->with_param; with_field= with_field || row->with_field; } @@ -4573,6 +4576,7 @@ Item_cond::fix_fields(THD *thd, Item **ref) List_iterator li(list); Item *item; uchar buff[sizeof(char*)]; // Max local vars in function + bool is_and_cond= functype() == Item_func::COND_AND_FUNC; not_null_tables_cache= 0; used_tables_and_const_cache_init(); @@ -4635,26 +4639,33 @@ Item_cond::fix_fields(THD *thd, Item **ref) (item= *li.ref())->check_cols(1)) return TRUE; /* purecov: inspected */ used_tables_cache|= item->used_tables(); - if (item->const_item()) + if (item->const_item() && !item->with_param && + !item->is_expensive() && !cond_has_datetime_is_null(item)) { - if (!item->is_expensive() && !cond_has_datetime_is_null(item) && - item->val_int() == 0) + if (item->val_int() == is_and_cond && top_level()) { /* - This is "... OR false_cond OR ..." + a. This is "... AND true_cond AND ..." + In this case, true_cond has no effect on cond_and->not_null_tables() + b. This is "... OR false_cond/null cond OR ..." In this case, false_cond has no effect on cond_or->not_null_tables() */ } else { /* - This is "... OR const_cond OR ..." + a. This is "... AND false_cond/null_cond AND ..." + The whole condition is FALSE/UNKNOWN. + b. This is "... OR const_cond OR ..." In this case, cond_or->not_null_tables()=0, because the condition const_cond might evaluate to true (regardless of whether some tables were NULL-complemented). */ + not_null_tables_cache= (table_map) 0; and_tables_cache= (table_map) 0; } + if (thd->is_error()) + return TRUE; } else { @@ -4666,6 +4677,7 @@ Item_cond::fix_fields(THD *thd, Item **ref) } with_sum_func= with_sum_func || item->with_sum_func; + with_param= with_param || item->with_param; with_field= with_field || item->with_field; with_subselect|= item->has_subquery(); if (item->maybe_null) @@ -4681,30 +4693,36 @@ bool Item_cond::eval_not_null_tables(uchar *opt_arg) { Item *item; + bool is_and_cond= functype() == Item_func::COND_AND_FUNC; List_iterator li(list); not_null_tables_cache= (table_map) 0; and_tables_cache= ~(table_map) 0; while ((item=li++)) { table_map tmp_table_map; - if (item->const_item()) + if (item->const_item() && !item->with_param && + !item->is_expensive() && !cond_has_datetime_is_null(item)) { - if (!item->is_expensive() && !cond_has_datetime_is_null(item) && - item->val_int() == 0) + if (item->val_int() == is_and_cond && top_level()) { /* - This is "... OR false_cond OR ..." + a. This is "... AND true_cond AND ..." + In this case, true_cond has no effect on cond_and->not_null_tables() + b. This is "... OR false_cond/null cond OR ..." In this case, false_cond has no effect on cond_or->not_null_tables() */ } else { /* - This is "... OR const_cond OR ..." + a. This is "... AND false_cond/null_cond AND ..." + The whole condition is FALSE/UNKNOWN. + b. This is "... OR const_cond OR ..." In this case, cond_or->not_null_tables()=0, because the condition - some_cond_or might be true regardless of what tables are - NULL-complemented. + const_cond might evaluate to true (regardless of whether some tables + were NULL-complemented). */ + not_null_tables_cache= (table_map) 0; and_tables_cache= (table_map) 0; } } diff --git a/sql/item_cmpfunc.h b/sql/item_cmpfunc.h index 076e6da95..03f234ad1 100644 --- a/sql/item_cmpfunc.h +++ b/sql/item_cmpfunc.h @@ -330,6 +330,7 @@ class Item_in_optimizer: public Item_bool_func bool is_null(); longlong val_int(); void cleanup(); + enum Functype functype() const { return IN_OPTIMIZER_FUNC; } const char *func_name() const { return ""; } Item_cache **get_cache() { return &cache; } void keep_top_level_cache(); @@ -347,6 +348,10 @@ class Item_in_optimizer: public Item_bool_func void reset_cache() { cache= NULL; } virtual void print(String *str, enum_query_type query_type); void restore_first_argument(); + Item* get_wrapped_in_subselect_item() + { + return args[1]; + } }; @@ -1312,6 +1317,13 @@ class cmp_item_sort_string :public cmp_item_string { value_res= item->val_str(&value); m_null_value= item->null_value; + // Make sure to cache the result String inside "value" + if (value_res && value_res != &value) + { + if (value.copy(*value_res)) + value.set("", 0, item->collation.collation); + value_res= &value; + } } int cmp(Item *arg) { @@ -2258,6 +2270,11 @@ class Item_equal: public Item_bool_func void sort(Item_field_cmpfunc compare, void *arg); void fix_length_and_dec(); bool fix_fields(THD *thd, Item **ref); + void cleanup() + { + delete eval_item; + eval_item= NULL; + } void update_used_tables(); COND *build_equal_items(THD *thd, COND_EQUAL *inherited, bool link_item_fields, diff --git a/sql/item_func.cc b/sql/item_func.cc index 0700d71a3..05a34a9a2 100644 --- a/sql/item_func.cc +++ b/sql/item_func.cc @@ -133,6 +133,7 @@ void Item_func::sync_with_sum_func_and_with_field(List &list) { with_sum_func|= item->with_sum_func; with_field|= item->with_field; + with_param|= item->with_param; } } @@ -226,6 +227,7 @@ Item_func::fix_fields(THD *thd, Item **ref) maybe_null=1; with_sum_func= with_sum_func || item->with_sum_func; + with_param= with_param || item->with_param; with_field= with_field || item->with_field; used_tables_and_const_cache_join(item); with_subselect|= item->has_subquery(); @@ -3506,6 +3508,7 @@ udf_handler::fix_fields(THD *thd, Item_func_or_sum *func, func->maybe_null=1; func->with_sum_func= func->with_sum_func || item->with_sum_func; func->with_field= func->with_field || item->with_field; + func->with_param= func->with_param || item->with_param; func->with_subselect|= item->with_subselect; func->used_tables_and_const_cache_join(item); f_args.arg_type[i]=item->result_type(); diff --git a/sql/item_func.h b/sql/item_func.h index 1209fc5cd..3219c8138 100644 --- a/sql/item_func.h +++ b/sql/item_func.h @@ -67,23 +67,26 @@ class Item_func :public Item_func_or_sum NOW_FUNC, TRIG_COND_FUNC, SUSERVAR_FUNC, GUSERVAR_FUNC, COLLATE_FUNC, EXTRACT_FUNC, CHAR_TYPECAST_FUNC, FUNC_SP, UDF_FUNC, - NEG_FUNC, GSYSVAR_FUNC, DYNCOL_FUNC }; + NEG_FUNC, GSYSVAR_FUNC, IN_OPTIMIZER_FUNC, DYNCOL_FUNC }; enum Type type() const { return FUNC_ITEM; } virtual enum Functype functype() const { return UNKNOWN_FUNC; } Item_func(THD *thd): Item_func_or_sum(thd), allowed_arg_cols(1) { with_sum_func= 0; with_field= 0; + with_param= 0; } Item_func(THD *thd, Item *a): Item_func_or_sum(thd, a), allowed_arg_cols(1) { with_sum_func= a->with_sum_func; + with_param= a->with_param; with_field= a->with_field; } Item_func(THD *thd, Item *a, Item *b): Item_func_or_sum(thd, a, b), allowed_arg_cols(1) { with_sum_func= a->with_sum_func || b->with_sum_func; + with_param= a->with_param || b->with_param; with_field= a->with_field || b->with_field; } Item_func(THD *thd, Item *a, Item *b, Item *c): @@ -91,6 +94,7 @@ class Item_func :public Item_func_or_sum { with_sum_func= a->with_sum_func || b->with_sum_func || c->with_sum_func; with_field= a->with_field || b->with_field || c->with_field; + with_param= a->with_param || b->with_param || c->with_param; } Item_func(THD *thd, Item *a, Item *b, Item *c, Item *d): Item_func_or_sum(thd, a, b, c, d), allowed_arg_cols(1) @@ -99,6 +103,8 @@ class Item_func :public Item_func_or_sum c->with_sum_func || d->with_sum_func; with_field= a->with_field || b->with_field || c->with_field || d->with_field; + with_param= a->with_param || b->with_param || + c->with_param || d->with_param; } Item_func(THD *thd, Item *a, Item *b, Item *c, Item *d, Item* e): Item_func_or_sum(thd, a, b, c, d, e), allowed_arg_cols(1) @@ -107,6 +113,8 @@ class Item_func :public Item_func_or_sum c->with_sum_func || d->with_sum_func || e->with_sum_func; with_field= a->with_field || b->with_field || c->with_field || d->with_field || e->with_field; + with_param= a->with_param || b->with_param || + c->with_param || d->with_param || e->with_param; } Item_func(THD *thd, List &list): Item_func_or_sum(thd, list), allowed_arg_cols(1) @@ -2217,6 +2225,8 @@ class Item_func_uuid_short :public Item_int_func Item_func_uuid_short(THD *thd): Item_int_func(thd) {} const char *func_name() const { return "uuid_short"; } longlong val_int(); + bool const_item() const { return false; } + table_map used_tables() const { return RAND_TABLE_BIT; } void fix_length_and_dec() { max_length= 21; unsigned_flag=1; } bool check_vcol_func_processor(uchar *int_arg) diff --git a/sql/item_row.cc b/sql/item_row.cc index 97f75c4b4..8c6edacad 100644 --- a/sql/item_row.cc +++ b/sql/item_row.cc @@ -64,6 +64,7 @@ bool Item_row::fix_fields(THD *thd, Item **ref) with_sum_func= with_sum_func || item->with_sum_func; with_field= with_field || item->with_field; with_subselect|= item->with_subselect; + with_param|= item->with_param; } fixed= 1; return FALSE; diff --git a/sql/item_strfunc.cc b/sql/item_strfunc.cc index cd47257a7..db1ba1521 100644 --- a/sql/item_strfunc.cc +++ b/sql/item_strfunc.cc @@ -318,7 +318,7 @@ String *Item_aes_crypt::val_str(String *str2) { DBUG_ASSERT(fixed == 1); StringBuffer<80> user_key_buf; - String *sptr= args[0]->val_str(&str_value); + String *sptr= args[0]->val_str(&tmp_value); String *user_key= args[1]->val_str(&user_key_buf); uint32 aes_length; diff --git a/sql/item_strfunc.h b/sql/item_strfunc.h index e19efd312..49faed2fe 100644 --- a/sql/item_strfunc.h +++ b/sql/item_strfunc.h @@ -202,6 +202,7 @@ class Item_aes_crypt :public Item_str_binary_checksum_func protected: int what; + String tmp_value; public: Item_aes_crypt(THD *thd, Item *a, Item *b) :Item_str_binary_checksum_func(thd, a, b) {} @@ -211,8 +212,8 @@ class Item_aes_crypt :public Item_str_binary_checksum_func class Item_func_aes_encrypt :public Item_aes_crypt { public: - Item_func_aes_encrypt(THD *thd, Item *a, Item *b): - Item_aes_crypt(thd, a, b) {} + Item_func_aes_encrypt(THD *thd, Item *a, Item *b) + :Item_aes_crypt(thd, a, b) {} void fix_length_and_dec(); const char *func_name() const { return "aes_encrypt"; } }; @@ -1241,6 +1242,8 @@ class Item_func_uuid: public Item_str_func DERIVATION_COERCIBLE, MY_REPERTOIRE_ASCII); fix_char_length(MY_UUID_STRING_LENGTH); } + bool const_item() const { return false; } + table_map used_tables() const { return RAND_TABLE_BIT; } const char *func_name() const{ return "uuid"; } String *val_str(String *); bool check_vcol_func_processor(uchar *int_arg) diff --git a/sql/item_subselect.cc b/sql/item_subselect.cc index 7dbaf313a..b275f749f 100644 --- a/sql/item_subselect.cc +++ b/sql/item_subselect.cc @@ -1818,7 +1818,7 @@ Item_in_subselect::single_value_transformer(JOIN *join) Item* join_having= join->having ? join->having : join->tmp_having; if (!(join_having || select_lex->with_sum_func || select_lex->group_list.elements) && - select_lex->table_list.elements == 0 && + select_lex->table_list.elements == 0 && !join->conds && !select_lex->master_unit()->is_union()) { Item *where_item= (Item*) select_lex->item_list.head(); diff --git a/sql/item_sum.cc b/sql/item_sum.cc index 0e2e9f079..b4e31ba01 100644 --- a/sql/item_sum.cc +++ b/sql/item_sum.cc @@ -1159,6 +1159,7 @@ Item_sum_num::fix_fields(THD *thd, Item **ref) return TRUE; set_if_bigger(decimals, args[i]->decimals); with_subselect|= args[i]->with_subselect; + with_param|= args[i]->with_param; } result_field=0; max_length=float_length(decimals); @@ -1190,6 +1191,7 @@ Item_sum_hybrid::fix_fields(THD *thd, Item **ref) return TRUE; Type_std_attributes::set(args[0]); with_subselect= args[0]->with_subselect; + with_param= args[0]->with_param; Item *item2= item->real_item(); if (item2->type() == Item::FIELD_ITEM) @@ -3361,6 +3363,7 @@ Item_func_group_concat::fix_fields(THD *thd, Item **ref) args[i]->check_cols(1)) return TRUE; with_subselect|= args[i]->with_subselect; + with_param|= args[i]->with_param; } /* skip charset aggregation for order columns */ diff --git a/sql/item_timefunc.cc b/sql/item_timefunc.cc index 4a94c3a5f..44105bd4a 100644 --- a/sql/item_timefunc.cc +++ b/sql/item_timefunc.cc @@ -702,7 +702,7 @@ static bool get_interval_info(const char *str,uint length,CHARSET_INFO *cs, { const char *end=str+length; uint i; - long msec_length= 0; + long field_length= 0; while (str != end && !my_isdigit(cs,*str)) str++; @@ -713,7 +713,8 @@ static bool get_interval_info(const char *str,uint length,CHARSET_INFO *cs, const char *start= str; for (value= 0; str != end && my_isdigit(cs, *str); str++) value= value*10 + *str - '0'; - msec_length= 6 - (str - start); + if ((field_length= str - start) >= 20) + return true; values[i]= value; while (str != end && !my_isdigit(cs,*str)) str++; @@ -728,8 +729,13 @@ static bool get_interval_info(const char *str,uint length,CHARSET_INFO *cs, } } - if (transform_msec && msec_length > 0) - values[count - 1] *= (long) log_10_int[msec_length]; + if (transform_msec && field_length > 0) + { + if (field_length < 6) + values[count - 1] *= log_10_int[6 - field_length]; + else if (field_length > 6) + values[count - 1] /= log_10_int[field_length - 6]; + } return (str != end); } diff --git a/sql/log.cc b/sql/log.cc index 29f8c5639..bcfaf5174 100644 --- a/sql/log.cc +++ b/sql/log.cc @@ -2576,7 +2576,7 @@ bool MYSQL_LOG::open( File file= -1; my_off_t seek_offset; bool is_fifo = false; - int open_flags= O_CREAT | O_BINARY; + int open_flags= O_CREAT | O_BINARY | O_CLOEXEC; DBUG_ENTER("MYSQL_LOG::open"); DBUG_PRINT("enter", ("log_type: %d", (int) log_type_arg)); @@ -3296,7 +3296,7 @@ bool MYSQL_BIN_LOG::open_index_file(const char *index_file_name_arg, ".index", opt); if ((index_file_nr= mysql_file_open(m_key_file_log_index, index_file_name, - O_RDWR | O_CREAT | O_BINARY, + O_RDWR | O_CREAT | O_BINARY | O_CLOEXEC, MYF(MY_WME))) < 0 || mysql_file_sync(index_file_nr, MYF(MY_WME)) || init_io_cache(&index_file, index_file_nr, @@ -8967,14 +8967,14 @@ int TC_LOG_MMAP::open(const char *opt_name) tc_log_page_size= my_getpagesize(); fn_format(logname,opt_name,mysql_data_home,"",MY_UNPACK_FILENAME); - if ((fd= mysql_file_open(key_file_tclog, logname, O_RDWR, MYF(0))) < 0) + if ((fd= mysql_file_open(key_file_tclog, logname, O_RDWR | O_CLOEXEC, MYF(0))) < 0) { if (my_errno != ENOENT) goto err; if (using_heuristic_recover()) return 1; if ((fd= mysql_file_create(key_file_tclog, logname, CREATE_MODE, - O_RDWR, MYF(MY_WME))) < 0) + O_RDWR | O_CLOEXEC, MYF(MY_WME))) < 0) goto err; inited=1; file_length= opt_tc_log_size; diff --git a/sql/log_event.cc b/sql/log_event.cc index 81bc68362..e70d97c54 100644 --- a/sql/log_event.cc +++ b/sql/log_event.cc @@ -1,6 +1,6 @@ /* - Copyright (c) 2000, 2016, Oracle and/or its affiliates. - Copyright (c) 2009, 2016, MariaDB + Copyright (c) 2000, 2018, Oracle and/or its affiliates. + Copyright (c) 2009, 2018, MariaDB 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 @@ -1311,6 +1311,8 @@ bool Log_event::write_header(ulong event_data_length) */ log_pos= writer->pos() + data_written; + + DBUG_EXECUTE_IF("dbug_master_binlog_over_2GB", log_pos += (1ULL <<31);); } now= get_time(); // Query start time @@ -3773,6 +3775,24 @@ Query_log_event::Query_log_event(const char* buf, uint event_len, db= (char *)start; query= (char *)(start + db_len + 1); q_len= data_len - db_len -1; + + if (data_len && (data_len < db_len || + data_len < q_len || + data_len != (db_len + q_len + 1))) + { + q_len= 0; + query= NULL; + DBUG_VOID_RETURN; + } + + uint32 max_length= uint32(event_len - ((const char*)(end + db_len + 1) - + (buf - common_header_len))); + if (q_len != max_length) + { + q_len= 0; + query= NULL; + DBUG_VOID_RETURN; + } /** Append the db length at the end of the buffer. This will be used by Query_cache::send_result_to_client() in case the query cache is On. @@ -4239,6 +4259,20 @@ int Query_log_event::do_apply_event(rpl_group_info *rgi, you. */ thd->catalog= catalog_len ? (char *) catalog : (char *)""; + + int len_error; + size_t valid_len= system_charset_info->cset->well_formed_len(system_charset_info, + db, db + db_len, db_len, &len_error); + + if (valid_len != db_len) + { + rli->report(ERROR_LEVEL, ER_SLAVE_FATAL_ERROR, + ER_THD(thd, ER_SLAVE_FATAL_ERROR), + "Invalid database name in Query event."); + thd->is_slave_error= true; + goto end; + } + new_db.length= db_len; new_db.str= (char *) rpl_filter->get_rewrite_db(db, &new_db.length); thd->set_db(new_db.str, new_db.length); /* allocates a copy of 'db' */ @@ -4380,7 +4414,7 @@ int Query_log_event::do_apply_event(rpl_group_info *rgi, } else thd->variables.collation_database= thd->db_charset; - + /* Record any GTID in the same transaction, so slave state is transactionally consistent. @@ -4922,7 +4956,13 @@ int Start_log_event_v3::do_apply_event(rpl_group_info *rgi) */ break; default: - /* this case is impossible */ + /* + This case is not expected. It can be either an event corruption or an + unsupported binary log version. + */ + rli->report(ERROR_LEVEL, ER_SLAVE_FATAL_ERROR, + ER_THD(thd, ER_SLAVE_FATAL_ERROR), + "Binlog version not supported"); DBUG_RETURN(1); } DBUG_RETURN(error); @@ -5829,6 +5869,9 @@ int Load_log_event::copy_log_event(const char *buf, ulong event_len, fields = (char*)field_lens + num_fields; table_name = fields + field_block_len; + if (strlen(table_name) > NAME_LEN) + goto err; + db = table_name + table_name_len + 1; DBUG_EXECUTE_IF ("simulate_invalid_address", db_len = data_len;); @@ -7805,6 +7848,13 @@ User_var_log_event(const char* buf, uint event_len, buf+= description_event->common_header_len + description_event->post_header_len[USER_VAR_EVENT-1]; name_len= uint4korr(buf); + /* Avoid reading out of buffer */ + if ((buf - buf_start) + UV_NAME_LEN_SIZE + name_len > event_len) + { + error= true; + goto err; + } + name= (char *) buf + UV_NAME_LEN_SIZE; /* @@ -7862,6 +7912,11 @@ User_var_log_event(const char* buf, uint event_len, we keep the flags set to UNDEF_F. */ uint bytes_read= ((val + val_len) - buf_start); + if (bytes_read > event_len) + { + error= true; + goto err; + } if ((data_written - bytes_read) > 0) { flags= (uint) *(buf + UV_VAL_IS_NULL + UV_VAL_TYPE_SIZE + @@ -8076,7 +8131,12 @@ int User_var_log_event::do_apply_event(rpl_group_info *rgi) } if (!(charset= get_charset(charset_number, MYF(MY_WME)))) + { + rgi->rli->report(ERROR_LEVEL, ER_SLAVE_FATAL_ERROR, + ER_THD(thd, ER_SLAVE_FATAL_ERROR), + "Invalid character set for User var event"); DBUG_RETURN(1); + } LEX_STRING user_var_name; user_var_name.str= name; user_var_name.length= name_len; @@ -8091,12 +8151,26 @@ int User_var_log_event::do_apply_event(rpl_group_info *rgi) { switch (type) { case REAL_RESULT: + if (val_len != 8) + { + rgi->rli->report(ERROR_LEVEL, ER_SLAVE_FATAL_ERROR, + ER_THD(thd, ER_SLAVE_FATAL_ERROR), + "Invalid variable length at User var event"); + return 1; + } float8get(real_val, val); it= new (thd->mem_root) Item_float(thd, real_val, 0); val= (char*) &real_val; // Pointer to value in native format val_len= 8; break; case INT_RESULT: + if (val_len != 8) + { + rgi->rli->report(ERROR_LEVEL, ER_SLAVE_FATAL_ERROR, + ER_THD(thd, ER_SLAVE_FATAL_ERROR), + "Invalid variable length at User var event"); + return 1; + } int_val= (longlong) uint8korr(val); it= new (thd->mem_root) Item_int(thd, int_val); val= (char*) &int_val; // Pointer to value in native format @@ -8104,6 +8178,13 @@ int User_var_log_event::do_apply_event(rpl_group_info *rgi) break; case DECIMAL_RESULT: { + if (val_len < 3) + { + rgi->rli->report(ERROR_LEVEL, ER_SLAVE_FATAL_ERROR, + ER_THD(thd, ER_SLAVE_FATAL_ERROR), + "Invalid variable length at User var event"); + return 1; + } Item_decimal *dec= new (thd->mem_root) Item_decimal(thd, (uchar*) val+2, val[0], val[1]); it= dec; val= (char *)dec->val_decimal(NULL); @@ -9470,6 +9551,14 @@ Rows_log_event::Rows_log_event(const char *buf, uint event_len, DBUG_PRINT("debug", ("Reading from %p", ptr_after_width)); m_width = net_field_length(&ptr_after_width); DBUG_PRINT("debug", ("m_width=%lu", m_width)); + + /* Avoid reading out of buffer */ + if (ptr_after_width + (m_width + 7) / 8 > (uchar*)buf + event_len) + { + m_cols.bitmap= NULL; + DBUG_VOID_RETURN; + } + /* if my_bitmap_init fails, catched in is_valid() */ if (likely(!my_bitmap_init(&m_cols, m_width <= sizeof(m_bitbuf)*8 ? m_bitbuf : NULL, @@ -9519,7 +9608,12 @@ Rows_log_event::Rows_log_event(const char *buf, uint event_len, const uchar* const ptr_rows_data= (const uchar*) ptr_after_width; - size_t const data_size= event_len - (ptr_rows_data - (const uchar *) buf); + size_t const read_size= ptr_rows_data - (const unsigned char *) buf; + if (read_size > event_len) + { + DBUG_VOID_RETURN; + } + size_t const data_size= event_len - read_size; DBUG_PRINT("info",("m_table_id: %lu m_flags: %d m_width: %lu data_size: %lu", m_table_id, m_flags, m_width, (ulong) data_size)); diff --git a/sql/log_event_old.cc b/sql/log_event_old.cc index abd489773..d2b4470bb 100644 --- a/sql/log_event_old.cc +++ b/sql/log_event_old.cc @@ -1,4 +1,5 @@ -/* Copyright (c) 2007, 2016, Oracle and/or its affiliates. +/* Copyright (c) 2007, 2018, Oracle and/or its affiliates. + Copyright (c) 2009, 2018, MariaDB 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 @@ -1231,6 +1232,13 @@ Old_rows_log_event::Old_rows_log_event(const char *buf, uint event_len, DBUG_PRINT("debug", ("Reading from %p", ptr_after_width)); m_width = net_field_length(&ptr_after_width); DBUG_PRINT("debug", ("m_width=%lu", m_width)); + /* Avoid reading out of buffer */ + if (ptr_after_width + m_width > (uchar *)buf + event_len) + { + m_cols.bitmap= NULL; + DBUG_VOID_RETURN; + } + /* if my_bitmap_init fails, catched in is_valid() */ if (likely(!my_bitmap_init(&m_cols, m_width <= sizeof(m_bitbuf)*8 ? m_bitbuf : NULL, diff --git a/sql/mdl.cc b/sql/mdl.cc index 56515d42c..86fc5fa39 100644 --- a/sql/mdl.cc +++ b/sql/mdl.cc @@ -674,7 +674,7 @@ int mdl_iterate(int (*callback)(MDL_ticket *ticket, void *arg), void *arg) my_hash_value_type mdl_hash_function(CHARSET_INFO *cs, const uchar *key, size_t length) { - MDL_key *mdl_key= (MDL_key*) (key - offsetof(MDL_key, m_ptr)); + MDL_key *mdl_key= (MDL_key*) (key - my_offsetof(MDL_key, m_ptr)); return mdl_key->hash_value(); } diff --git a/sql/mf_iocache_encr.cc b/sql/mf_iocache_encr.cc index ae314d826..f26a437a2 100644 --- a/sql/mf_iocache_encr.cc +++ b/sql/mf_iocache_encr.cc @@ -49,8 +49,8 @@ static int my_b_encr_read(IO_CACHE *info, uchar *Buffer, size_t Count) if (pos_in_file == info->end_of_file) { - info->read_pos= info->read_end= info->buffer; - info->pos_in_file= pos_in_file; + /* reading past EOF should not empty the cache */ + info->read_pos= info->read_end; info->error= 0; DBUG_RETURN(MY_TEST(Count)); } @@ -145,9 +145,10 @@ static int my_b_encr_write(IO_CACHE *info, const uchar *Buffer, size_t Count) if (info->seek_not_done) { - DBUG_ASSERT(info->pos_in_file == 0); + DBUG_ASSERT(info->pos_in_file % info->buffer_length == 0); + size_t wpos= info->pos_in_file / info->buffer_length * crypt_data->block_length; - if ((mysql_file_seek(info->file, 0, MY_SEEK_SET, MYF(0)) == MY_FILEPOS_ERROR)) + if ((mysql_file_seek(info->file, wpos, MY_SEEK_SET, MYF(0)) == MY_FILEPOS_ERROR)) { info->error= -1; DBUG_RETURN(1); diff --git a/sql/mysql_install_db.cc b/sql/mysql_install_db.cc index 120b4c103..e0f6ed4da 100644 --- a/sql/mysql_install_db.cc +++ b/sql/mysql_install_db.cc @@ -195,7 +195,7 @@ int main(int argc, char **argv) die("database creation failed"); } - printf("Creation of the database was successfull"); + printf("Creation of the database was successful"); return 0; } diff --git a/sql/mysql_upgrade_service.cc b/sql/mysql_upgrade_service.cc index 36de05e54..9bb608092 100644 --- a/sql/mysql_upgrade_service.cc +++ b/sql/mysql_upgrade_service.cc @@ -146,6 +146,11 @@ static void die(const char *fmt, ...) exit(1); } +#define WRITE_LOG(fmt,...) {\ + char log_buf[1024]; \ + snprintf(log_buf,sizeof(log_buf), fmt, __VA_ARGS__);\ + WriteFile(logfile_handle,log_buf, strlen(log_buf), 0 , 0);\ +} /* spawn-like function to run subprocesses. @@ -187,17 +192,22 @@ static intptr_t run_tool(int wait_flag, const char *program,...) { char tmpdir[FN_REFLEN]; GetTempPath(FN_REFLEN, tmpdir); - sprintf_s(logfile_path, "%s\\mysql_upgrade_service.%s.log", tmpdir, + sprintf_s(logfile_path, "%smysql_upgrade_service.%s.log", tmpdir, opt_service); - logfile_handle= CreateFile(logfile_path, GENERIC_WRITE, FILE_SHARE_READ, - NULL, TRUNCATE_EXISTING, 0, NULL); - if (!logfile_handle) + SECURITY_ATTRIBUTES attr= {0}; + attr.nLength= sizeof(SECURITY_ATTRIBUTES); + attr.bInheritHandle= TRUE; + logfile_handle= CreateFile(logfile_path, FILE_APPEND_DATA, + FILE_SHARE_READ|FILE_SHARE_WRITE, &attr, CREATE_ALWAYS, 0, NULL); + if (logfile_handle == INVALID_HANDLE_VALUE) { die("Cannot open log file %s, windows error %u", logfile_path, GetLastError()); } } + WRITE_LOG("Executing %s\r\n", cmdline); + /* Start child process */ STARTUPINFO si= {0}; si.cb= sizeof(si); @@ -458,7 +468,7 @@ int main(int argc, char **argv) log("Phase 3/8: Starting mysqld for upgrade"); mysqld_process= (HANDLE)run_tool(P_NOWAIT, mysqld_path, defaults_file_param, "--skip-networking", "--skip-grant-tables", - "--enable-named-pipe", socket_param, NULL); + "--enable-named-pipe", socket_param,"--skip-slave-start", NULL); if (mysqld_process == INVALID_HANDLE_VALUE) { diff --git a/sql/mysqld.cc b/sql/mysqld.cc index 0de9d7a9f..5bf5e3f73 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -1,5 +1,5 @@ /* Copyright (c) 2000, 2015, Oracle and/or its affiliates. - Copyright (c) 2008, 2016, MariaDB + Copyright (c) 2008, 2018, MariaDB 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 @@ -111,7 +111,7 @@ #include #endif -#include +#include #define mysqld_charset &my_charset_latin1 @@ -540,7 +540,7 @@ bool max_user_connections_checking=0; Limit of the total number of prepared statements in the server. Is necessary to protect the server against out-of-memory attacks. */ -ulong max_prepared_stmt_count; +uint max_prepared_stmt_count; /** Current total number of prepared statements in the server. This number is exact, and therefore may not be equal to the difference between @@ -551,7 +551,7 @@ ulong max_prepared_stmt_count; two different connections, this counts as two distinct prepared statements. */ -ulong prepared_stmt_count=0; +uint prepared_stmt_count=0; ulong thread_id=1L,current_pid; ulong slow_launch_threads = 0; uint sync_binlog_period= 0, sync_relaylog_period= 0, @@ -3517,6 +3517,16 @@ void my_message_sql(uint error, const char *str, myf MyFlags) level= Sql_condition::WARN_LEVEL_WARN; func= sql_print_warning; } + else if (MyFlags & ME_LOG_AS_WARN) + { + /* + Typical use case is optimistic parallel slave where DA needs to hold + an error condition caused by the current error, but the error-log + level is relaxed to the warning one. + */ + level= Sql_condition::WARN_LEVEL_ERROR; + func= sql_print_warning; + } else { level= Sql_condition::WARN_LEVEL_ERROR; @@ -4287,11 +4297,20 @@ static int init_common_variables() /* connections and databases needs lots of files */ { - uint files, wanted_files, max_open_files; + uint files, wanted_files, max_open_files, min_tc_size, extra_files, + min_connections; + ulong org_max_connections, org_tc_size; + /* Number of files reserved for temporary files */ + extra_files= 30; + min_connections= 10; /* MyISAM requires two file handles per table. */ - wanted_files= (10 + max_connections + extra_max_connections + + wanted_files= (extra_files + max_connections + extra_max_connections + tc_size * 2); + min_tc_size= MY_MIN(tc_size, TABLE_OPEN_CACHE_MIN); + org_max_connections= max_connections; + org_tc_size= tc_size; + /* We are trying to allocate no less than max_connections*5 file handles (i.e. we are trying to set the limit so that they will @@ -4303,41 +4322,52 @@ static int init_common_variables() requested (value of wanted_files). */ max_open_files= MY_MAX(MY_MAX(wanted_files, - (max_connections + extra_max_connections)*5), - open_files_limit); + (max_connections + extra_max_connections)*5), + open_files_limit); files= my_set_max_open_files(max_open_files); + SYSVAR_AUTOSIZE_IF_CHANGED(open_files_limit, files, ulong); - if (files < wanted_files) - { - if (!open_files_limit) - { - /* - If we have requested too much file handles than we bring - max_connections in supported bounds. - */ - SYSVAR_AUTOSIZE(max_connections, - (ulong) MY_MIN(files-10-TABLE_OPEN_CACHE_MIN*2, max_connections)); - /* - Decrease tc_size according to max_connections, but - not below TABLE_OPEN_CACHE_MIN. Outer MY_MIN() ensures that we - never increase tc_size automatically (that could - happen if max_connections is decreased above). - */ - SYSVAR_AUTOSIZE(tc_size, - (ulong) MY_MIN(MY_MAX((files - 10 - max_connections) / 2, - TABLE_OPEN_CACHE_MIN), tc_size)); - DBUG_PRINT("warning", - ("Changed limits: max_open_files: %u max_connections: %ld table_cache: %ld", - files, max_connections, tc_size)); - if (global_system_variables.log_warnings > 1) - sql_print_warning("Changed limits: max_open_files: %u max_connections: %ld table_cache: %ld", - files, max_connections, tc_size); - } - else if (global_system_variables.log_warnings) - sql_print_warning("Could not increase number of max_open_files to more than %u (request: %u)", files, wanted_files); - } - SYSVAR_AUTOSIZE(open_files_limit, files); + if (files < wanted_files && global_system_variables.log_warnings) + sql_print_warning("Could not increase number of max_open_files to more than %u (request: %u)", files, wanted_files); + + /* + If we have requested too much file handles than we bring + max_connections in supported bounds. Still leave at least + 'min_connections' connections + */ + SYSVAR_AUTOSIZE_IF_CHANGED(max_connections, + (ulong) MY_MAX(MY_MIN(files- extra_files- + min_tc_size*2, + max_connections), + min_connections), + ulong); + + /* + Decrease tc_size according to max_connections, but + not below min_tc_size. Outer MY_MIN() ensures that we + never increase tc_size automatically (that could + happen if max_connections is decreased above). + */ + SYSVAR_AUTOSIZE_IF_CHANGED(tc_size, + (ulong) MY_MIN(MY_MAX((files - extra_files - + max_connections) / 2, + min_tc_size), + tc_size), ulong); + DBUG_PRINT("warning", + ("Current limits: max_open_files: %u max_connections: %ld table_cache: %ld", + files, max_connections, tc_size)); + if (global_system_variables.log_warnings > 1 && + (max_connections < org_max_connections || + tc_size < org_tc_size)) + sql_print_warning("Changed limits: max_open_files: %u max_connections: %lu (was %lu) table_cache: %lu (was %lu)", + files, max_connections, org_max_connections, + tc_size, org_tc_size); } + /* + Max_connections and tc_cache are now set. + Now we can fix other variables depending on this variable. + */ + unireg_init(opt_specialflag); /* Set up extern variabels */ if (!(my_default_lc_messages= my_locale_by_name(lc_messages))) @@ -5511,8 +5541,7 @@ int mysqld_main(int argc, char **argv) orig_argc= argc; orig_argv= argv; my_getopt_use_args_separator= TRUE; - if (load_defaults(MYSQL_CONFIG_NAME, load_default_groups, &argc, &argv)) - return 1; + load_defaults_or_exit(MYSQL_CONFIG_NAME, load_default_groups, &argc, &argv); my_getopt_use_args_separator= FALSE; defaults_argc= argc; defaults_argv= argv; @@ -5871,12 +5900,14 @@ int mysqld_main(int argc, char **argv) mysqld_port, MYSQL_COMPILATION_COMMENT); +#ifndef _WIN32 // try to keep fd=0 busy - if (!freopen(IF_WIN("NUL","/dev/null"), "r", stdin)) + if (!freopen("/dev/null", "r", stdin)) { // fall back on failure fclose(stdin); } +#endif #if defined(_WIN32) && !defined(EMBEDDED_LIBRARY) Service.SetRunning(); @@ -6461,7 +6492,7 @@ void handle_connections_sockets() #endif sd_notify(0, "READY=1\n" - "STATUS=Taking your SQL requests now..."); + "STATUS=Taking your SQL requests now...\n"); DBUG_PRINT("general",("Waiting for connections.")); MAYBE_BROKEN_SYSCALL; @@ -6679,7 +6710,7 @@ void handle_connections_sockets() set_current_thd(0); } sd_notify(0, "STOPPING=1\n" - "STATUS=Shutdown in progress"); + "STATUS=Shutdown in progress\n"); DBUG_VOID_RETURN; } diff --git a/sql/mysqld.h b/sql/mysqld.h index 0725d8625..97ecf8897 100644 --- a/sql/mysqld.h +++ b/sql/mysqld.h @@ -200,7 +200,7 @@ extern ulong slave_trans_retries; extern uint slave_net_timeout; extern int max_user_connections; extern ulong what_to_log,flush_time; -extern ulong max_prepared_stmt_count, prepared_stmt_count; +extern uint max_prepared_stmt_count, prepared_stmt_count; extern ulong open_files_limit; extern ulonglong binlog_cache_size, binlog_stmt_cache_size; extern ulonglong max_binlog_cache_size, max_binlog_stmt_cache_size; diff --git a/sql/opt_subselect.cc b/sql/opt_subselect.cc index d7371fa7e..89338928c 100644 --- a/sql/opt_subselect.cc +++ b/sql/opt_subselect.cc @@ -875,8 +875,10 @@ bool subquery_types_allow_materialization(Item_in_subselect *in_subs) Make sure that create_tmp_table will not fail due to too long keys. See MDEV-7122. This check is performed inside create_tmp_table also and we must do it so that we know the table has keys created. + Make sure that the length of the key for the temp_table is atleast + greater than 0. */ - if (total_key_length > tmp_table_max_key_length() || + if (!total_key_length || total_key_length > tmp_table_max_key_length() || elements > tmp_table_max_key_parts()) DBUG_RETURN(FALSE); @@ -1006,6 +1008,10 @@ bool check_for_outer_joins(List *join_list) void find_and_block_conversion_to_sj(Item *to_find, List_iterator_fast &li) { + if (to_find->type() == Item::FUNC_ITEM && + ((Item_func*)to_find)->functype() == Item_func::IN_OPTIMIZER_FUNC) + to_find= ((Item_in_optimizer*)to_find)->get_wrapped_in_subselect_item(); + if (to_find->type() != Item::SUBSELECT_ITEM || ((Item_subselect *) to_find)->substype() != Item_subselect::IN_SUBS) return; @@ -3738,22 +3744,30 @@ bool setup_sj_materialization_part1(JOIN_TAB *sjm_tab) sjm= emb_sj_nest->sj_mat_info; thd= tab->join->thd; /* First the calls come to the materialization function */ - //List &item_list= emb_sj_nest->sj_subq_pred->unit->first_select()->item_list; - + DBUG_ASSERT(sjm->is_used); /* Set up the table to write to, do as select_union::create_result_table does */ sjm->sjm_table_param.init(); sjm->sjm_table_param.bit_fields_as_long= TRUE; - //List_iterator it(item_list); SELECT_LEX *subq_select= emb_sj_nest->sj_subq_pred->unit->first_select(); - Item **p_item= subq_select->ref_pointer_array; - Item **p_end= p_item + subq_select->item_list.elements; - //while((right_expr= it++)) - for(;p_item != p_end; p_item++) - sjm->sjm_table_cols.push_back(*p_item, thd->mem_root); - + List_iterator it(subq_select->item_list); + Item *item; + while((item= it++)) + { + /* + This semi-join replaced the subquery (subq_select) and so on + re-executing it will not be prepared. To use the Items from its + select list we have to prepare (fix_fields) them + */ + if (!item->fixed && item->fix_fields(thd, it.ref())) + DBUG_RETURN(TRUE); + item= *(it.ref()); // it can be changed by fix_fields + DBUG_ASSERT(!item->name_length || item->name_length == strlen(item->name)); + sjm->sjm_table_cols.push_back(item, thd->mem_root); + } + sjm->sjm_table_param.field_count= subq_select->item_list.elements; sjm->sjm_table_param.force_not_null_cols= TRUE; @@ -5972,5 +5986,6 @@ bool JOIN::choose_tableless_subquery_plan() tmp_having= having; } } + exec_const_cond= conds; return FALSE; } diff --git a/sql/partition_info.cc b/sql/partition_info.cc index 14f301e2d..df0a733f1 100644 --- a/sql/partition_info.cc +++ b/sql/partition_info.cc @@ -2744,23 +2744,6 @@ bool partition_info::fix_column_value_functions(THD *thd, } -bool partition_info::error_if_requires_values() const -{ - switch (part_type) { - case NOT_A_PARTITION: - case HASH_PARTITION: - break; - case RANGE_PARTITION: - my_error(ER_PARTITION_REQUIRES_VALUES_ERROR, MYF(0), "RANGE", "LESS THAN"); - return true; - case LIST_PARTITION: - my_error(ER_PARTITION_REQUIRES_VALUES_ERROR, MYF(0), "LIST", "IN"); - return true; - } - return false; -} - - /** Fix partition data from parser. @@ -3211,3 +3194,19 @@ bool check_partition_dirs(partition_info *part_info) } #endif /* WITH_PARTITION_STORAGE_ENGINE */ + +bool partition_info::error_if_requires_values() const +{ + switch (part_type) { + case NOT_A_PARTITION: + case HASH_PARTITION: + break; + case RANGE_PARTITION: + my_error(ER_PARTITION_REQUIRES_VALUES_ERROR, MYF(0), "RANGE", "LESS THAN"); + return true; + case LIST_PARTITION: + my_error(ER_PARTITION_REQUIRES_VALUES_ERROR, MYF(0), "LIST", "IN"); + return true; + } + return false; +} diff --git a/sql/set_var.h b/sql/set_var.h index cf86ecf18..203969d61 100644 --- a/sql/set_var.h +++ b/sql/set_var.h @@ -394,6 +394,16 @@ int sql_set_variables(THD *thd, List *var_list, bool free); set_sys_var_value_origin(&VAR, sys_var::AUTO); \ } while(0) +#define SYSVAR_AUTOSIZE_IF_CHANGED(VAR,VAL,TYPE) \ + do { \ + TYPE tmp= (VAL); \ + if (VAR != tmp) \ + { \ + VAR= (VAL); \ + set_sys_var_value_origin(&VAR, sys_var::AUTO); \ + } \ + } while(0) + void set_sys_var_value_origin(void *ptr, enum sys_var::where here); enum sys_var::where get_sys_var_value_origin(void *ptr); @@ -416,6 +426,7 @@ CHARSET_INFO *get_old_charset_by_name(const char *old_name); int sys_var_init(); int sys_var_add_options(DYNAMIC_ARRAY *long_options, int parse_flags); void sys_var_end(void); +bool check_has_super(sys_var *self, THD *thd, set_var *var); #endif diff --git a/sql/share/errmsg-utf8.txt b/sql/share/errmsg-utf8.txt index 52be5e14e..d73a22c80 100644 --- a/sql/share/errmsg-utf8.txt +++ b/sql/share/errmsg-utf8.txt @@ -5577,8 +5577,8 @@ ER_SP_NO_AGGREGATE 42000 eng "AGGREGATE is not supported for stored functions" ger "AGGREGATE wird bei gespeicherten Funktionen nicht unterstützt" ER_MAX_PREPARED_STMT_COUNT_REACHED 42000 - eng "Can't create more than max_prepared_stmt_count statements (current value: %lu)" - ger "Kann nicht mehr Anweisungen als max_prepared_stmt_count erzeugen (aktueller Wert: %lu)" + eng "Can't create more than max_prepared_stmt_count statements (current value: %u)" + ger "Kann nicht mehr Anweisungen als max_prepared_stmt_count erzeugen (aktueller Wert: %u)" ER_VIEW_RECURSIVE eng "`%-.192s`.`%-.192s` contains view recursion" ger "`%-.192s`.`%-.192s` enthält View-Rekursion" diff --git a/sql/slave.cc b/sql/slave.cc index da394ff71..6fe6de687 100644 --- a/sql/slave.cc +++ b/sql/slave.cc @@ -3898,10 +3898,10 @@ static int exec_relay_log_event(THD* thd, Relay_log_info* rli, DBUG_RETURN(1); #ifdef WITH_WSREP - mysql_mutex_lock(&thd->LOCK_wsrep_thd); + mysql_mutex_lock(&thd->LOCK_thd_data); if (thd->wsrep_conflict_state == NO_CONFLICT) { - mysql_mutex_unlock(&thd->LOCK_wsrep_thd); + mysql_mutex_unlock(&thd->LOCK_thd_data); #endif /* WITH_WSREP */ if (slave_trans_retries) { @@ -3978,7 +3978,7 @@ static int exec_relay_log_event(THD* thd, Relay_log_info* rli, #ifdef WITH_WSREP } else - mysql_mutex_unlock(&thd->LOCK_wsrep_thd); + mysql_mutex_unlock(&thd->LOCK_thd_data); #endif /* WITH_WSREP */ thread_safe_increment64(&rli->executed_entries); @@ -5128,7 +5128,7 @@ pthread_handler_t handle_slave_sql(void *arg) */ if (WSREP_ON && wsrep_node_dropped && wsrep_restart_slave) { - if (wsrep_ready) + if (wsrep_ready_get()) { WSREP_INFO("Slave error due to node temporarily non-primary" "SQL slave will continue"); diff --git a/sql/sp.cc b/sql/sp.cc index 2e268e483..a5a14ec8d 100644 --- a/sql/sp.cc +++ b/sql/sp.cc @@ -1,6 +1,6 @@ /* - Copyright (c) 2002, 2016, Oracle and/or its affiliates. - Copyright (c) 2009, 2017, MariaDB + Copyright (c) 2002, 2018, Oracle and/or its affiliates. + Copyright (c) 2009, 2018, MariaDB 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 @@ -347,7 +347,7 @@ class Proc_table_intact : public Table_check_intact bool m_print_once; public: - Proc_table_intact() : m_print_once(TRUE) {} + Proc_table_intact() : m_print_once(TRUE) { has_keys= TRUE; } protected: void report_error(uint code, const char *fmt, ...); diff --git a/sql/sp_head.cc b/sql/sp_head.cc index 8bf78d976..0d24ed04e 100644 --- a/sql/sp_head.cc +++ b/sql/sp_head.cc @@ -840,7 +840,7 @@ sp_head::~sp_head() thd->lex->sphead= NULL; lex_end(thd->lex); delete thd->lex; - thd->lex= thd->stmt_lex= lex; + thd->lex= lex; } my_hash_free(&m_sptabs); @@ -1121,7 +1121,7 @@ sp_head::execute(THD *thd, bool merge_da_on_success) backup_arena; query_id_t old_query_id; TABLE *old_derived_tables; - LEX *old_lex, *old_stmt_lex; + LEX *old_lex; Item_change_list old_change_list; String old_packet; uint old_server_status; @@ -1224,7 +1224,6 @@ sp_head::execute(THD *thd, bool merge_da_on_success) do it in each instruction */ old_lex= thd->lex; - old_stmt_lex= thd->stmt_lex; /* We should also save Item tree change list to avoid rollback something too early in the calling query. @@ -1372,7 +1371,6 @@ sp_head::execute(THD *thd, bool merge_da_on_success) DBUG_ASSERT(thd->change_list.is_empty()); old_change_list.move_elements_to(&thd->change_list); thd->lex= old_lex; - thd->stmt_lex= old_stmt_lex; thd->set_query_id(old_query_id); DBUG_ASSERT(!thd->derived_tables); thd->derived_tables= old_derived_tables; @@ -2207,7 +2205,7 @@ sp_head::reset_lex(THD *thd) if (sublex == 0) DBUG_RETURN(TRUE); - thd->lex= thd->stmt_lex= sublex; + thd->lex= sublex; (void)m_lex.push_front(oldlex); /* Reset most stuff. */ @@ -2953,7 +2951,7 @@ sp_lex_keeper::reset_lex_and_exec_core(THD *thd, uint *nextp, We should not save old value since it is saved/restored in sp_head::execute() when we are entering/leaving routine. */ - thd->lex= thd->stmt_lex= m_lex; + thd->lex= m_lex; thd->set_query_id(next_query_id()); diff --git a/sql/sql_acl.cc b/sql/sql_acl.cc index 07b0715dc..a5c91b499 100644 --- a/sql/sql_acl.cc +++ b/sql/sql_acl.cc @@ -1,5 +1,5 @@ /* Copyright (c) 2000, 2016, Oracle and/or its affiliates. - Copyright (c) 2009, 2016, MariaDB + Copyright (c) 2009, 2018, MariaDB 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 @@ -11475,6 +11475,7 @@ static bool send_plugin_request_packet(MPVIO_EXT *mpvio, const char *client_auth_plugin= ((st_mysql_auth *) (plugin_decl(mpvio->plugin)->info))->client_auth_plugin; + DBUG_EXECUTE_IF("auth_disconnect", { vio_close(net->vio); DBUG_RETURN(1); }); DBUG_ASSERT(client_auth_plugin); /* diff --git a/sql/sql_admin.cc b/sql/sql_admin.cc index 98584ec46..be23cd334 100644 --- a/sql/sql_admin.cc +++ b/sql/sql_admin.cc @@ -1,5 +1,5 @@ /* Copyright (c) 2010, 2015, Oracle and/or its affiliates. - Copyright (c) 2011, 2016, MariaDB + Copyright (c) 2011, 2018, MariaDB 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 @@ -238,7 +238,7 @@ static int prepare_for_repair(THD *thd, TABLE_LIST *table_list, if (thd->locked_tables_list.locked_tables()) { - if (thd->locked_tables_list.reopen_tables(thd)) + if (thd->locked_tables_list.reopen_tables(thd, false)) goto end; /* Restore the table in the table list with the new opened table */ table_list->table= pos_in_locked_tables->table; @@ -302,7 +302,7 @@ static bool mysql_admin_table(THD* thd, TABLE_LIST* tables, HA_CHECK_OPT* check_opt, const char *operator_name, thr_lock_type lock_type, - bool open_for_modify, + bool org_open_for_modify, bool repair_table_use_frm, uint extra_open_options, int (*prepare_func)(THD *, TABLE_LIST *, @@ -365,10 +365,11 @@ static bool mysql_admin_table(THD* thd, TABLE_LIST* tables, for (table= tables; table; table= table->next_local) { char table_name[SAFE_NAME_LEN*2+2]; - char* db = table->db; + char *db= table->db; bool fatal_error=0; bool open_error; bool collect_eis= FALSE; + bool open_for_modify= org_open_for_modify; DBUG_PRINT("admin", ("table: '%s'.'%s'", table->db, table->table_name)); strxmov(table_name, db, ".", table->table_name, NullS); @@ -406,8 +407,8 @@ static bool mysql_admin_table(THD* thd, TABLE_LIST* tables, /* CHECK TABLE command is allowed for views as well. Check on alter flags - to differentiate from ALTER TABLE...CHECK PARTITION on which view is not - allowed. + to differentiate from ALTER TABLE...CHECK PARTITION on which view is + not allowed. */ if (lex->alter_info.flags & Alter_info::ALTER_ADMIN_PARTITION || view_operator_func == NULL) @@ -1102,7 +1103,7 @@ static bool mysql_admin_table(THD* thd, TABLE_LIST* tables, } } /* Error path, a admin command failed. */ - if (thd->transaction_rollback_request) + if (thd->transaction_rollback_request || fatal_error) { /* Unlikely, but transaction rollback was requested by one of storage @@ -1113,7 +1114,9 @@ static bool mysql_admin_table(THD* thd, TABLE_LIST* tables, } else { - if (trans_commit_stmt(thd) || trans_commit_implicit(thd)) + if (trans_commit_stmt(thd) || + (stmt_causes_implicit_commit(thd, CF_IMPLICIT_COMMIT_END) && + trans_commit_implicit(thd))) goto err; } close_thread_tables(thd); @@ -1147,7 +1150,8 @@ static bool mysql_admin_table(THD* thd, TABLE_LIST* tables, err: /* Make sure this table instance is not reused after the failure. */ trans_rollback_stmt(thd); - trans_rollback(thd); + if (stmt_causes_implicit_commit(thd, CF_IMPLICIT_COMMIT_END)) + trans_rollback(thd); if (table && table->table) { table->table->m_needs_reopen= true; diff --git a/sql/sql_alter.cc b/sql/sql_alter.cc index bff45e089..f17931ae9 100644 --- a/sql/sql_alter.cc +++ b/sql/sql_alter.cc @@ -262,8 +262,8 @@ bool Sql_cmd_alter_table::execute(THD *thd) - For temporary MERGE tables we do not track if their child tables are base or temporary. As result we can't guarantee that privilege check - which was done in presence of temporary child will stay relevant later - as this temporary table might be removed. + which was done in presence of temporary child will stay relevant + later as this temporary table might be removed. If SELECT_ACL | UPDATE_ACL | DELETE_ACL privileges were not checked for the underlying *base* tables, it would create a security breach as in diff --git a/sql/sql_analyze_stmt.cc b/sql/sql_analyze_stmt.cc index 098e99e88..68299d024 100644 --- a/sql/sql_analyze_stmt.cc +++ b/sql/sql_analyze_stmt.cc @@ -39,7 +39,7 @@ void Filesort_tracker::print_json_members(Json_writer *writer) if (r_limit == 0) writer->add_str(varied_str); else - writer->add_ll((longlong) rint(r_limit/get_r_loops())); + writer->add_ll((longlong) rint(r_limit)); } writer->add_member("r_used_priority_queue"); diff --git a/sql/sql_base.cc b/sql/sql_base.cc index 01f40bb22..c2bf37a10 100644 --- a/sql/sql_base.cc +++ b/sql/sql_base.cc @@ -592,7 +592,7 @@ bool close_cached_tables(THD *thd, TABLE_LIST *tables, old locks. This should always succeed (unless some external process has removed the tables) */ - thd->locked_tables_list.reopen_tables(thd); + thd->locked_tables_list.reopen_tables(thd, false); /* Since downgrade_lock() won't do anything with shared metadata lock it is much simpler to go through all open tables rather @@ -1322,7 +1322,8 @@ TABLE_LIST *find_table_in_list(TABLE_LIST *table, @param thd thread handle @param table table which should be checked @param table_list list of tables - @param check_alias whether to check tables' aliases + @param check_flag whether to check tables' aliases + Currently this is only used by INSERT NOTE: to exclude derived tables from check we use following mechanism: a) during derived table processing set THD::derived_tables_processing @@ -1351,9 +1352,9 @@ TABLE_LIST *find_table_in_list(TABLE_LIST *table, static TABLE_LIST* find_dup_table(THD *thd, TABLE_LIST *table, TABLE_LIST *table_list, - bool check_alias) + uint check_flag) { - TABLE_LIST *res; + TABLE_LIST *res= 0; const char *d_name, *t_name, *t_alias; DBUG_ENTER("find_dup_table"); DBUG_PRINT("enter", ("table alias: %s", table->alias)); @@ -1389,17 +1390,15 @@ TABLE_LIST* find_dup_table(THD *thd, TABLE_LIST *table, TABLE_LIST *table_list, retry: DBUG_PRINT("info", ("real table: %s.%s", d_name, t_name)); - for (TABLE_LIST *tl= table_list;;) + for (TABLE_LIST *tl= table_list; tl ; tl= tl->next_global, res= 0) { - if (tl && - tl->select_lex && tl->select_lex->master_unit() && + if (tl->select_lex && tl->select_lex->master_unit() && tl->select_lex->master_unit()->executed) { /* There is no sense to check tables of already executed parts of the query */ - tl= tl->next_global; continue; } /* @@ -1408,21 +1407,29 @@ TABLE_LIST* find_dup_table(THD *thd, TABLE_LIST *table, TABLE_LIST *table_list, */ if (! (res= find_table_in_global_list(tl, d_name, t_name))) break; + tl= res; // We can continue search after this table /* Skip if same underlying table. */ if (res->table && (res->table == table->table)) - goto next; + continue; + + if (check_flag & CHECK_DUP_FOR_CREATE) + DBUG_RETURN(res); /* Skip if table alias does not match. */ - if (check_alias) + if (check_flag & CHECK_DUP_ALLOW_DIFFERENT_ALIAS) { if (my_strcasecmp(table_alias_charset, t_alias, res->alias)) - goto next; + continue; } /* - Skip if marked to be excluded (could be a derived table) or if - entry is a prelocking placeholder. + If table is not excluded (could be a derived table) and table is not + a prelocking placeholder then we found either a duplicate entry + or a table that is part of a derived table (handled below). + Examples are: + INSERT INTO t1 SELECT * FROM t1; + INSERT INTO t1 SELECT * FROM view_containing_t1; */ if (res->select_lex && !res->select_lex->exclude_from_table_unique_test && @@ -1434,14 +1441,17 @@ TABLE_LIST* find_dup_table(THD *thd, TABLE_LIST *table, TABLE_LIST *table_list, processed in derived table or top select of multi-update/multi-delete (exclude_from_table_unique_test) or prelocking placeholder. */ -next: - tl= res->next_global; DBUG_PRINT("info", ("found same copy of table or table which we should skip")); } if (res && res->belong_to_derived) { - /* Try to fix */ + /* + We come here for queries of type: + INSERT INTO t1 (SELECT tmp.a FROM (select * FROM t1) as tmp); + + Try to fix by materializing the derived table + */ TABLE_LIST *derived= res->belong_to_derived; if (derived->is_merged_derived()) { @@ -1473,7 +1483,7 @@ TABLE_LIST* find_dup_table(THD *thd, TABLE_LIST *table, TABLE_LIST *table_list, TABLE_LIST* unique_table(THD *thd, TABLE_LIST *table, TABLE_LIST *table_list, - bool check_alias) + uint check_flag) { TABLE_LIST *dup; @@ -1487,12 +1497,12 @@ unique_table(THD *thd, TABLE_LIST *table, TABLE_LIST *table_list, for (child= table->next_global; child && child->parent_l == table; child= child->next_global) { - if ((dup= find_dup_table(thd, child, child->next_global, check_alias))) + if ((dup= find_dup_table(thd, child, child->next_global, check_flag))) break; } } else - dup= find_dup_table(thd, table, table_list, check_alias); + dup= find_dup_table(thd, table, table_list, check_flag); return dup; } /* @@ -2911,7 +2921,8 @@ void Locked_tables_list::unlink_from_list(THD *thd, If mode is not LTM_LOCK_TABLES, we needn't do anything. Moreover, outside this mode pos_in_locked_tables value is not trustworthy. */ - if (thd->locked_tables_mode != LTM_LOCK_TABLES) + if (thd->locked_tables_mode != LTM_LOCK_TABLES && + thd->locked_tables_mode != LTM_PRELOCKED_UNDER_LOCK_TABLES) return; /* @@ -3015,7 +3026,7 @@ unlink_all_closed_tables(THD *thd, MYSQL_LOCK *lock, size_t reopen_count) */ bool -Locked_tables_list::reopen_tables(THD *thd) +Locked_tables_list::reopen_tables(THD *thd, bool need_reopen) { Open_table_context ot_ctx(thd, MYSQL_OPEN_REOPEN); size_t reopen_count= 0; @@ -3026,8 +3037,20 @@ Locked_tables_list::reopen_tables(THD *thd) for (TABLE_LIST *table_list= m_locked_tables; table_list; table_list= table_list->next_global) { - if (table_list->table) /* The table was not closed */ - continue; + if (need_reopen) + { + if (!table_list->table || !table_list->table->needs_reopen()) + continue; + /* no need to remove the table from the TDC here, thus (TABLE*)1 */ + close_all_tables_for_name(thd, table_list->table->s, + HA_EXTRA_NOT_USED, (TABLE*)1); + DBUG_ASSERT(table_list->table == NULL); + } + else + { + if (table_list->table) /* The table was not closed */ + continue; + } /* Links into thd->open_tables upon success */ if (open_table(thd, table_list, &ot_ctx)) @@ -6184,6 +6207,9 @@ find_field_in_natural_join(THD *thd, TABLE_LIST *table_ref, const char *name, column reference. See create_view_field() for details. */ item= nj_col->create_item(thd); + if (!item) + DBUG_RETURN(NULL); + /* *ref != NULL means that *ref contains the item that we need to replace. If the item was aliased by the user, set the alias to diff --git a/sql/sql_base.h b/sql/sql_base.h index c73ea3745..74154184e 100644 --- a/sql/sql_base.h +++ b/sql/sql_base.h @@ -1,4 +1,6 @@ /* Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved. + Copyright (c) 2011, 2018, MariaDB + 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 @@ -59,6 +61,10 @@ enum find_item_error_report_type {REPORT_ALL_ERRORS, REPORT_EXCEPT_NOT_FOUND, IGNORE_ERRORS, REPORT_EXCEPT_NON_UNIQUE, IGNORE_EXCEPT_NON_UNIQUE}; +/* Flag bits for unique_table() */ +#define CHECK_DUP_ALLOW_DIFFERENT_ALIAS 1 +#define CHECK_DUP_FOR_CREATE 2 + uint create_tmp_table_def_key(THD *thd, char *key, const char *db, const char *table_name); uint get_table_def_key(const TABLE_LIST *table_list, const char **key); @@ -278,7 +284,7 @@ void kill_delayed_threads_for_table(TDC_element *element); void close_thread_table(THD *thd, TABLE **table_ptr); bool close_temporary_tables(THD *thd); TABLE_LIST *unique_table(THD *thd, TABLE_LIST *table, TABLE_LIST *table_list, - bool check_alias); + uint check_flag); int drop_temporary_table(THD *thd, TABLE *table, bool *is_trans); void close_temporary_table(THD *thd, TABLE *table, bool free_share, bool delete_table); diff --git a/sql/sql_class.cc b/sql/sql_class.cc index e3b7b31b0..0a95d2e2c 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -683,103 +683,6 @@ extern "C" } -/** - Dumps a text description of a thread, its security context - (user, host) and the current query. - - @param thd thread context - @param buffer pointer to preferred result buffer - @param length length of buffer - @param max_query_len how many chars of query to copy (0 for all) - - @return Pointer to string -*/ - -extern "C" -char *thd_get_error_context_description(THD *thd, char *buffer, - unsigned int length, - unsigned int max_query_len) -{ - String str(buffer, length, &my_charset_latin1); - const Security_context *sctx= &thd->main_security_ctx; - char header[256]; - int len; - - mysql_mutex_lock(&LOCK_thread_count); - - /* - The pointers thd->query and thd->proc_info might change since they are - being modified concurrently. This is acceptable for proc_info since its - values doesn't have to very accurate and the memory it points to is static, - but we need to attempt a snapshot on the pointer values to avoid using NULL - values. The pointer to thd->query however, doesn't point to static memory - and has to be protected by thd->LOCK_thd_data or risk pointing to - uninitialized memory. - */ - const char *proc_info= thd->proc_info; - - len= my_snprintf(header, sizeof(header), - "MySQL thread id %lu, OS thread handle 0x%lx, query id %lu", - thd->thread_id, (ulong) thd->real_id, (ulong) thd->query_id); - str.length(0); - str.append(header, len); - - if (sctx->host) - { - str.append(' '); - str.append(sctx->host); - } - - if (sctx->ip) - { - str.append(' '); - str.append(sctx->ip); - } - - if (sctx->user) - { - str.append(' '); - str.append(sctx->user); - } - - if (proc_info) - { - str.append(' '); - str.append(proc_info); - } - - /* Don't wait if LOCK_thd_data is used as this could cause a deadlock */ - if (!mysql_mutex_trylock(&thd->LOCK_thd_data)) - { - if (thd->query()) - { - if (max_query_len < 1) - len= thd->query_length(); - else - len= MY_MIN(thd->query_length(), max_query_len); - str.append('\n'); - str.append(thd->query(), len); - } - mysql_mutex_unlock(&thd->LOCK_thd_data); - } - mysql_mutex_unlock(&LOCK_thread_count); - - if (str.c_ptr_safe() == buffer) - return buffer; - - /* - We have to copy the new string to the destination buffer because the string - was reallocated to a larger buffer to be able to fit. - */ - DBUG_ASSERT(buffer != NULL); - length= MY_MIN(str.length(), length-1); - memcpy(buffer, str.c_ptr_quick(), length); - /* Make sure that the new string is null terminated */ - buffer[length]= '\0'; - return buffer; -} - - #if MARIA_PLUGIN_INTERFACE_VERSION < 0x0200 /** TODO: This function is for API compatibility, remove it eventually. @@ -1008,7 +911,6 @@ THD::THD(bool is_wsrep_applier) *scramble= '\0'; #ifdef WITH_WSREP - mysql_mutex_init(key_LOCK_wsrep_thd, &LOCK_wsrep_thd, MY_MUTEX_INIT_FAST); wsrep_ws_handle.trx_id = WSREP_UNDEFINED_TRX_ID; wsrep_ws_handle.opaque = NULL; wsrep_retry_counter = 0; @@ -1644,9 +1546,6 @@ THD::~THD() mysql_mutex_unlock(&LOCK_thd_data); #ifdef WITH_WSREP - mysql_mutex_lock(&LOCK_wsrep_thd); - mysql_mutex_unlock(&LOCK_wsrep_thd); - mysql_mutex_destroy(&LOCK_wsrep_thd); if (wsrep_rgi) delete wsrep_rgi; #endif /* Close connection */ @@ -2717,15 +2616,19 @@ void THD::check_and_register_item_tree_change(Item **place, Item **new_value, void THD::rollback_item_tree_changes() { + DBUG_ENTER("THD::rollback_item_tree_changes"); I_List_iterator it(change_list); Item_change_record *change; while ((change= it++)) { + DBUG_PRINT("info", ("Rollback: %p (%p) <- %p", + *change->place, change->place, change->old_value)); *change->place= change->old_value; } /* We can forget about changes memory: it's allocated in runtime memroot */ change_list.empty(); + DBUG_VOID_RETURN; } @@ -3654,7 +3557,7 @@ void Statement::set_statement(Statement *stmt) { id= stmt->id; mark_used_columns= stmt->mark_used_columns; - stmt_lex= lex= stmt->lex; + lex= stmt->lex; query_string= stmt->query_string; } @@ -7100,6 +7003,13 @@ bool THD::rgi_have_temporary_tables() return rgi_slave->rli->save_temporary_tables != 0; } +bool THD::is_optimistic_slave_worker() +{ + DBUG_ASSERT(system_thread != SYSTEM_THREAD_SLAVE_SQL || rgi_slave); + + return system_thread == SYSTEM_THREAD_SLAVE_SQL && rgi_slave && + rgi_slave->speculation == rpl_group_info::SPECULATE_OPTIMISTIC; +} void wait_for_commit::reinit() diff --git a/sql/sql_class.h b/sql/sql_class.h index 910301450..fb3604b89 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -1027,21 +1027,6 @@ class Statement: public ilink, public Query_arena LEX_STRING name; /* name for named prepared statements */ LEX *lex; // parse tree descriptor - /* - LEX which represents current statement (conventional, SP or PS) - - For example during view parsing THD::lex will point to the views LEX and - THD::stmt_lex will point to LEX of the statement where the view will be - included - - Currently it is used to have always correct select numbering inside - statement (LEX::current_select_number) without storing and restoring a - global counter which was THD::select_number. - - TODO: make some unified statement representation (now SP has different) - to store such data like LEX::current_select_number. - */ - LEX *stmt_lex; /* Points to the query associated with this statement. It's const, but we need to declare it char * because all table handlers are written @@ -1697,7 +1682,7 @@ class Locked_tables_list void unlink_all_closed_tables(THD *thd, MYSQL_LOCK *lock, size_t reopen_count); - bool reopen_tables(THD *thd); + bool reopen_tables(THD *thd, bool need_reopen); bool restore_lock(THD *thd, TABLE_LIST *dst_table_list, TABLE *table, MYSQL_LOCK *lock); void add_back_last_deleted_lock(TABLE_LIST *dst_table_list); @@ -2955,6 +2940,7 @@ class THD :public Statement, query_id_t first_query_id; } binlog_evt_union; + mysql_cond_t COND_wsrep_thd; /** Internal parser state. Note that since the parser is not re-entrant, we keep only one parser @@ -4105,7 +4091,6 @@ class THD :public Statement, query_id_t wsrep_last_query_id; enum wsrep_query_state wsrep_query_state; enum wsrep_conflict_state wsrep_conflict_state; - mysql_mutex_t LOCK_wsrep_thd; wsrep_trx_meta_t wsrep_trx_meta; uint32 wsrep_rand; Relay_log_info *wsrep_rli; @@ -4183,6 +4168,12 @@ class THD :public Statement, (THD_TRANS::DID_WAIT | THD_TRANS::CREATED_TEMP_TABLE | THD_TRANS::DROPPED_TEMP_TABLE | THD_TRANS::DID_DDL)); } + + /* + Returns true when the thread handle belongs to a slave worker thread + running in the optimistic execution mode. + */ + bool is_optimistic_slave_worker(); }; diff --git a/sql/sql_connect.cc b/sql/sql_connect.cc index d3ef24520..abb234ab4 100644 --- a/sql/sql_connect.cc +++ b/sql/sql_connect.cc @@ -1335,9 +1335,9 @@ void do_handle_one_connection(THD *thd_arg) #ifdef WITH_WSREP if (WSREP(thd)) { - mysql_mutex_lock(&thd->LOCK_wsrep_thd); + mysql_mutex_lock(&thd->LOCK_thd_data); thd->wsrep_query_state= QUERY_EXITING; - mysql_mutex_unlock(&thd->LOCK_wsrep_thd); + mysql_mutex_unlock(&thd->LOCK_thd_data); } #endif end_thread: diff --git a/sql/sql_const.h b/sql/sql_const.h index 946cf13e2..0cd214d8b 100644 --- a/sql/sql_const.h +++ b/sql/sql_const.h @@ -124,7 +124,7 @@ #define MAX_ACCEPT_RETRY 10 // Test accept this many times #define MAX_FIELDS_BEFORE_HASH 32 #define USER_VARS_HASH_SIZE 16 -#define TABLE_OPEN_CACHE_MIN 400 +#define TABLE_OPEN_CACHE_MIN 200 #define TABLE_OPEN_CACHE_DEFAULT 2000 #define TABLE_DEF_CACHE_DEFAULT 400 /** diff --git a/sql/sql_delete.cc b/sql/sql_delete.cc index bc067b667..453d7ffdc 100644 --- a/sql/sql_delete.cc +++ b/sql/sql_delete.cc @@ -945,7 +945,7 @@ multi_delete::initialize_tables(JOIN *join) TABLE_LIST *tbl= walk->correspondent_table->find_table_for_update(); tables_to_delete_from|= tbl->table->map; if (delete_while_scanning && - unique_table(thd, tbl, join->tables_list, false)) + unique_table(thd, tbl, join->tables_list, 0)) { /* If the table we are going to delete from appears diff --git a/sql/sql_explain.cc b/sql/sql_explain.cc index ac6bee050..82107f9b9 100644 --- a/sql/sql_explain.cc +++ b/sql/sql_explain.cc @@ -1642,7 +1642,7 @@ void Explain_table_access::print_explain_json(Explain_query *query, { /* Get r_filtered value from filesort */ if (fs_tracker->get_r_loops()) - writer->add_double(fs_tracker->get_r_filtered()); + writer->add_double(fs_tracker->get_r_filtered()*100); else writer->add_null(); } diff --git a/sql/sql_handler.cc b/sql/sql_handler.cc index 662fa33dc..5a022ba72 100644 --- a/sql/sql_handler.cc +++ b/sql/sql_handler.cc @@ -155,10 +155,11 @@ static void mysql_ha_close_table(SQL_HANDLER *handler) { THD *thd= handler->thd; TABLE *table= handler->table; + DBUG_ENTER("mysql_ha_close_table"); /* check if table was already closed */ if (!table) - return; + DBUG_VOID_RETURN; if (!table->s->tmp_table) { @@ -184,6 +185,7 @@ static void mysql_ha_close_table(SQL_HANDLER *handler) } my_free(handler->lock); handler->init(); + DBUG_VOID_RETURN; } /* @@ -985,6 +987,7 @@ SQL_HANDLER *mysql_ha_read_prepare(THD *thd, TABLE_LIST *tables, if (!(handler= mysql_ha_find_handler(thd, tables->alias))) DBUG_RETURN(0); tables->table= handler->table; // This is used by fix_fields + handler->table->pos_in_table_list= tables; if (mysql_ha_fix_cond_and_key(handler, mode, keyname, key_expr, cond, 1)) DBUG_RETURN(0); DBUG_RETURN(handler); diff --git a/sql/sql_insert.cc b/sql/sql_insert.cc index 0a9ce00c9..e103c3b39 100644 --- a/sql/sql_insert.cc +++ b/sql/sql_insert.cc @@ -1550,7 +1550,8 @@ bool mysql_prepare_insert(THD *thd, TABLE_LIST *table_list, { Item *fake_conds= 0; TABLE_LIST *duplicate; - if ((duplicate= unique_table(thd, table_list, table_list->next_global, 1))) + if ((duplicate= unique_table(thd, table_list, table_list->next_global, + CHECK_DUP_ALLOW_DIFFERENT_ALIAS))) { update_non_unique_table_error(table_list, "INSERT", duplicate); DBUG_RETURN(TRUE); @@ -4382,22 +4383,54 @@ bool select_create::send_eof() */ if (!table->s->tmp_table) { +#ifdef WITH_WSREP + if (WSREP_ON) + { + /* + append table level exclusive key for CTAS + */ + wsrep_key_arr_t key_arr= {0, 0}; + wsrep_prepare_keys_for_isolation(thd, + create_table->db, + create_table->table_name, + table_list, + &key_arr); + int rcode = wsrep->append_key( + wsrep, + &thd->wsrep_ws_handle, + key_arr.keys, //&wkey, + key_arr.keys_len, + WSREP_KEY_EXCLUSIVE, + false); + wsrep_keys_free(&key_arr); + if (rcode) { + DBUG_PRINT("wsrep", ("row key failed: %d", rcode)); + WSREP_ERROR("Appending table key for CTAS failed: %s, %d", + (wsrep_thd_query(thd)) ? + wsrep_thd_query(thd) : "void", rcode); + return true; + } + /* If commit fails, we should be able to reset the OK status. */ + thd->get_stmt_da()->set_overwrite_status(TRUE); + } +#endif /* WITH_WSREP */ trans_commit_stmt(thd); if (!(thd->variables.option_bits & OPTION_GTID_BEGIN)) trans_commit_implicit(thd); #ifdef WITH_WSREP if (WSREP_ON) { - mysql_mutex_lock(&thd->LOCK_wsrep_thd); + thd->get_stmt_da()->set_overwrite_status(FALSE); + mysql_mutex_lock(&thd->LOCK_thd_data); if (thd->wsrep_conflict_state != NO_CONFLICT) { WSREP_DEBUG("select_create commit failed, thd: %lu err: %d %s", thd->thread_id, thd->wsrep_conflict_state, thd->query()); - mysql_mutex_unlock(&thd->LOCK_wsrep_thd); + mysql_mutex_unlock(&thd->LOCK_thd_data); abort_result_set(); DBUG_RETURN(true); } - mysql_mutex_unlock(&thd->LOCK_wsrep_thd); + mysql_mutex_unlock(&thd->LOCK_thd_data); } #endif /* WITH_WSREP */ } diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc index 3fa5ec71a..085ad1a4b 100644 --- a/sql/sql_lex.cc +++ b/sql/sql_lex.cc @@ -657,10 +657,11 @@ void lex_start(THD *thd) { LEX *lex= thd->lex; DBUG_ENTER("lex_start"); - DBUG_PRINT("info", ("Lex %p stmt_lex: %p", thd->lex, thd->stmt_lex)); + DBUG_PRINT("info", ("Lex %p", thd->lex)); lex->thd= lex->unit.thd= thd; - + + lex->stmt_lex= lex; // default, should be rewritten for VIEWs And CTEs DBUG_ASSERT(!lex->explain); lex->context_stack.empty(); diff --git a/sql/sql_lex.h b/sql/sql_lex.h index 4fcd090e1..3b47b1d25 100644 --- a/sql/sql_lex.h +++ b/sql/sql_lex.h @@ -730,7 +730,7 @@ class st_select_lex: public st_select_lex_node /* Point to the LEX in which it was created, used in view subquery detection. - TODO: make also st_select_lex::parent_stmt_lex (see THD::stmt_lex) + TODO: make also st_select_lex::parent_stmt_lex (see LEX::stmt_lex) and use st_select_lex::parent_lex & st_select_lex::parent_stmt_lex instead of global (from THD) references where it is possible. */ @@ -2435,6 +2435,21 @@ struct LEX: public Query_tables_list // type information char *length,*dec; CHARSET_INFO *charset; + /* + LEX which represents current statement (conventional, SP or PS) + + For example during view parsing THD::lex will point to the views LEX and + lex::stmt_lex will point to LEX of the statement where the view will be + included + + Currently it is used to have always correct select numbering inside + statement (LEX::current_select_number) without storing and restoring a + global counter which was THD::select_number. + + TODO: make some unified statement representation (now SP has different) + to store such data like LEX::current_select_number. + */ + LEX *stmt_lex; LEX_STRING name; char *help_arg; diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 4dd8d9e12..89b5adff6 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -1,5 +1,5 @@ /* Copyright (c) 2000, 2017, Oracle and/or its affiliates. - Copyright (c) 2008, 2017, MariaDB + Copyright (c) 2008, 2018, MariaDB 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 @@ -198,7 +198,7 @@ static bool some_non_temp_table_to_be_updated(THD *thd, TABLE_LIST *tables) /* - Implicitly commit a active transaction if statement requires so. + Check whether the statement implicitly commits an active transaction. @param thd Thread handle. @param mask Bitmask used for the SQL command match. @@ -206,7 +206,7 @@ static bool some_non_temp_table_to_be_updated(THD *thd, TABLE_LIST *tables) @return 0 No implicit commit @return 1 Do a commit */ -static bool stmt_causes_implicit_commit(THD *thd, uint mask) +bool stmt_causes_implicit_commit(THD *thd, uint mask) { LEX *lex= thd->lex; bool skip= FALSE; @@ -275,6 +275,7 @@ void init_update_queries(void) server_command_flags[COM_SHUTDOWN]= CF_SKIP_WSREP_CHECK; server_command_flags[COM_SLEEP]= CF_SKIP_WSREP_CHECK; server_command_flags[COM_TIME]= CF_SKIP_WSREP_CHECK; + server_command_flags[COM_INIT_DB]= CF_SKIP_WSREP_CHECK; server_command_flags[COM_END]= CF_SKIP_WSREP_CHECK; /* @@ -284,6 +285,8 @@ void init_update_queries(void) server_command_flags[COM_QUERY]= CF_SKIP_WSREP_CHECK; server_command_flags[COM_SET_OPTION]= CF_SKIP_WSREP_CHECK; server_command_flags[COM_STMT_PREPARE]= CF_SKIP_QUESTIONS | CF_SKIP_WSREP_CHECK; + server_command_flags[COM_STMT_EXECUTE]= CF_SKIP_WSREP_CHECK; + server_command_flags[COM_STMT_FETCH]= CF_SKIP_WSREP_CHECK; server_command_flags[COM_STMT_CLOSE]= CF_SKIP_QUESTIONS | CF_SKIP_WSREP_CHECK; server_command_flags[COM_STMT_RESET]= CF_SKIP_QUESTIONS | CF_SKIP_WSREP_CHECK; server_command_flags[COM_STMT_EXECUTE]= CF_SKIP_WSREP_CHECK; @@ -517,6 +520,8 @@ void init_update_queries(void) There are other statements that deal with temporary tables and open them, but which are not listed here. The thing is that the order of pre-opening temporary tables for those statements is somewhat custom. + + Note that SQLCOM_RENAME_TABLE should not be in this list! */ sql_command_flags[SQLCOM_CREATE_TABLE]|= CF_PREOPEN_TMP_TABLES; sql_command_flags[SQLCOM_DROP_TABLE]|= CF_PREOPEN_TMP_TABLES; @@ -530,7 +535,6 @@ void init_update_queries(void) sql_command_flags[SQLCOM_INSERT_SELECT]|= CF_PREOPEN_TMP_TABLES; sql_command_flags[SQLCOM_DELETE]|= CF_PREOPEN_TMP_TABLES; sql_command_flags[SQLCOM_DELETE_MULTI]|= CF_PREOPEN_TMP_TABLES; - sql_command_flags[SQLCOM_RENAME_TABLE]|= CF_PREOPEN_TMP_TABLES; sql_command_flags[SQLCOM_REPLACE_SELECT]|= CF_PREOPEN_TMP_TABLES; sql_command_flags[SQLCOM_SELECT]|= CF_PREOPEN_TMP_TABLES; sql_command_flags[SQLCOM_SET_OPTION]|= CF_PREOPEN_TMP_TABLES; @@ -887,21 +891,26 @@ void cleanup_items(Item *item) } -#ifndef EMBEDDED_LIBRARY - #ifdef WITH_WSREP -static bool wsrep_node_is_ready(THD *thd) +static bool wsrep_tables_accessible_when_detached(const TABLE_LIST *tables) { - if (thd->variables.wsrep_on && !thd->wsrep_applier && !wsrep_ready) + for (const TABLE_LIST *table= tables; table; table= table->next_global) { - my_message(ER_UNKNOWN_COM_ERROR, - "WSREP has not yet prepared node for application use", - MYF(0)); - return false; + TABLE_CATEGORY c; + LEX_STRING db, tn; + lex_string_set(&db, table->db); + lex_string_set(&tn, table->table_name); + c= get_table_category(&db, &tn); + if (c != TABLE_CATEGORY_INFORMATION && + c != TABLE_CATEGORY_PERFORMANCE) + { + return false; + } } return true; } -#endif +#endif /* WITH_WSREP */ +#ifndef EMBEDDED_LIBRARY /** Read one command from connection and execute it (query or simple command). @@ -931,13 +940,13 @@ bool do_command(THD *thd) #ifdef WITH_WSREP if (WSREP(thd)) { - mysql_mutex_lock(&thd->LOCK_wsrep_thd); + mysql_mutex_lock(&thd->LOCK_thd_data); thd->wsrep_query_state= QUERY_IDLE; if (thd->wsrep_conflict_state==MUST_ABORT) { wsrep_client_rollback(thd); } - mysql_mutex_unlock(&thd->LOCK_wsrep_thd); + mysql_mutex_unlock(&thd->LOCK_thd_data); } #endif /* WITH_WSREP */ @@ -983,15 +992,15 @@ bool do_command(THD *thd) packet_length= my_net_read_packet(net, 1); #ifdef WITH_WSREP if (WSREP(thd)) { - mysql_mutex_lock(&thd->LOCK_wsrep_thd); + mysql_mutex_lock(&thd->LOCK_thd_data); /* these THD's are aborted or are aborting during being idle */ if (thd->wsrep_conflict_state == ABORTING) { while (thd->wsrep_conflict_state == ABORTING) { - mysql_mutex_unlock(&thd->LOCK_wsrep_thd); + mysql_mutex_unlock(&thd->LOCK_thd_data); my_sleep(1000); - mysql_mutex_lock(&thd->LOCK_wsrep_thd); + mysql_mutex_lock(&thd->LOCK_thd_data); } thd->store_globals(); } @@ -1001,7 +1010,7 @@ bool do_command(THD *thd) } thd->wsrep_query_state= QUERY_EXEC; - mysql_mutex_unlock(&thd->LOCK_wsrep_thd); + mysql_mutex_unlock(&thd->LOCK_thd_data); } #endif /* WITH_WSREP */ @@ -1014,13 +1023,13 @@ bool do_command(THD *thd) #ifdef WITH_WSREP if (WSREP(thd)) { - mysql_mutex_lock(&thd->LOCK_wsrep_thd); + mysql_mutex_lock(&thd->LOCK_thd_data); if (thd->wsrep_conflict_state == MUST_ABORT) { DBUG_PRINT("wsrep",("aborted for wsrep rollback: %lu", thd->real_id)); wsrep_client_rollback(thd); } - mysql_mutex_unlock(&thd->LOCK_wsrep_thd); + mysql_mutex_unlock(&thd->LOCK_thd_data); } #endif /* WITH_WSREP */ @@ -1080,21 +1089,27 @@ bool do_command(THD *thd) command_name[command].str)); #ifdef WITH_WSREP - /* - Bail out if DB snapshot has not been installed. - */ - if (!(server_command_flags[command] & CF_SKIP_WSREP_CHECK) && - !wsrep_node_is_ready(thd)) + if (WSREP(thd)) { - thd->protocol->end_statement(); + /* + Bail out if DB snapshot has not been installed. + */ + if (!thd->wsrep_applier && + (!wsrep_ready || wsrep_reject_queries != WSREP_REJECT_NONE) && + (server_command_flags[command] & CF_SKIP_WSREP_CHECK) == 0) + { + my_message(ER_UNKNOWN_COM_ERROR, + "WSREP has not yet prepared node for application use", MYF(0)); + thd->protocol->end_statement(); - /* Performance Schema Interface instrumentation end. */ - MYSQL_END_STATEMENT(thd->m_statement_psi, thd->get_stmt_da()); - thd->m_statement_psi= NULL; - thd->m_digest= NULL; + /* Performance Schema Interface instrumentation end. */ + MYSQL_END_STATEMENT(thd->m_statement_psi, thd->get_stmt_da()); + thd->m_statement_psi= NULL; + thd->m_digest= NULL; - return_value= FALSE; - goto out; + return_value= FALSE; + goto out; + } } #endif @@ -1242,7 +1257,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd, thd->wsrep_PA_safe= true; } - mysql_mutex_lock(&thd->LOCK_wsrep_thd); + mysql_mutex_lock(&thd->LOCK_thd_data); thd->wsrep_query_state= QUERY_EXEC; if (thd->wsrep_conflict_state== RETRY_AUTOCOMMIT) { @@ -1258,14 +1273,14 @@ bool dispatch_command(enum enum_server_command command, THD *thd, { my_error(ER_LOCK_DEADLOCK, MYF(0), "wsrep aborted transaction"); WSREP_DEBUG("Deadlock error for: %s", thd->query()); - mysql_mutex_unlock(&thd->LOCK_wsrep_thd); + mysql_mutex_unlock(&thd->LOCK_thd_data); thd->reset_killed(); thd->mysys_var->abort = 0; thd->wsrep_conflict_state = NO_CONFLICT; thd->wsrep_retry_counter = 0; goto dispatch_end; } - mysql_mutex_unlock(&thd->LOCK_wsrep_thd); + mysql_mutex_unlock(&thd->LOCK_thd_data); } #endif /* WITH_WSREP */ #if defined(ENABLED_PROFILING) @@ -1920,10 +1935,10 @@ bool dispatch_command(enum enum_server_command command, THD *thd, DBUG_ASSERT((command != COM_QUIT && command != COM_STMT_CLOSE) || thd->get_stmt_da()->is_disabled()); /* wsrep BF abort in query exec phase */ - mysql_mutex_lock(&thd->LOCK_wsrep_thd); + mysql_mutex_lock(&thd->LOCK_thd_data); do_end_of_statement= thd->wsrep_conflict_state != REPLAYING && thd->wsrep_conflict_state != RETRY_AUTOCOMMIT; - mysql_mutex_unlock(&thd->LOCK_wsrep_thd); + mysql_mutex_unlock(&thd->LOCK_thd_data); } else do_end_of_statement= true; @@ -2460,10 +2475,6 @@ mysql_execute_command(THD *thd) #endif DBUG_ENTER("mysql_execute_command"); -#ifdef WITH_PARTITION_STORAGE_ENGINE - thd->work_part_info= 0; -#endif - DBUG_ASSERT(thd->transaction.stmt.is_empty() || thd->in_sub_stmt); /* Each statement or replication event which might produce deadlock @@ -2653,20 +2664,22 @@ mysql_execute_command(THD *thd) } /* - Bail out if DB snapshot has not been installed. SET and SHOW commands, - however, are always allowed. - Select query is also allowed if it does not access any table. - We additionally allow all other commands that do not change data in - case wsrep_dirty_reads is enabled. - */ - if (lex->sql_command != SQLCOM_SET_OPTION && - !wsrep_is_show_query(lex->sql_command) && - !(thd->variables.wsrep_dirty_reads && - !is_update_query(lex->sql_command)) && - !(lex->sql_command == SQLCOM_SELECT && - !all_tables) && - !wsrep_node_is_ready(thd)) + * Bail out if DB snapshot has not been installed. We however, + * allow SET and SHOW queries and reads from information schema + * and dirty reads (if configured) + */ + if (!thd->wsrep_applier && + !(wsrep_ready && wsrep_reject_queries == WSREP_REJECT_NONE) && + !(thd->variables.wsrep_dirty_reads && + (sql_command_flags[lex->sql_command] & CF_CHANGES_DATA) == 0) && + !wsrep_tables_accessible_when_detached(all_tables) && + lex->sql_command != SQLCOM_SET_OPTION && + !wsrep_is_show_query(lex->sql_command)) + { + my_message(ER_UNKNOWN_COM_ERROR, + "WSREP has not yet prepared node for application use", MYF(0)); goto error; + } } #endif /* WITH_WSREP */ status_var_increment(thd->status_var.com_stat[lex->sql_command]); @@ -2902,6 +2915,7 @@ mysql_execute_command(THD *thd) { WSREP_SYNC_WAIT(thd, WSREP_SYNC_WAIT_BEFORE_SHOW); execute_show_status(thd, all_tables); + break; } case SQLCOM_SHOW_EXPLAIN: @@ -3401,7 +3415,7 @@ mysql_execute_command(THD *thd) TABLE_LIST *duplicate; if ((duplicate= unique_table(thd, lex->query_tables, lex->query_tables->next_global, - 0))) + CHECK_DUP_FOR_CREATE))) { update_non_unique_table_error(lex->query_tables, "CREATE", duplicate); @@ -3947,7 +3961,7 @@ mysql_execute_command(THD *thd) case SQLCOM_INSERT_SELECT: { WSREP_SYNC_WAIT(thd, WSREP_SYNC_WAIT_BEFORE_INSERT_REPLACE); - select_result *sel_result; + select_insert *sel_result; bool explain= MY_TEST(lex->describe); DBUG_ASSERT(first_table == all_tables && first_table != 0); if (WSREP_CLIENT(thd) && @@ -5706,6 +5720,10 @@ mysql_execute_command(THD *thd) lex->unit.cleanup(); + /* close/reopen tables that were marked to need reopen under LOCK TABLES */ + if (! thd->lex->requires_prelocking()) + thd->locked_tables_list.reopen_tables(thd, true); + if (! thd->in_sub_stmt) { if (thd->killed != NOT_KILLED) @@ -5975,6 +5993,60 @@ static bool execute_show_status(THD *thd, TABLE_LIST *all_tables) } +/* + Find out if a table is a temporary table + + A table is a temporary table if it's a temporary table or + there has been before a temporary table that has been renamed + to the current name. + + Some examples: + A->B B is a temporary table if and only if A is a temp. + A->B, B->C Second B is temp if A is temp + A->B, A->C Second A can't be temp as if A was temp then B is temp + and Second A can only be a normal table. C is also not temp +*/ + +static TABLE *find_temporary_table_for_rename(THD *thd, + TABLE_LIST *first_table, + TABLE_LIST *cur_table) +{ + TABLE_LIST *table; + TABLE *res= 0; + bool found= 0; + DBUG_ENTER("find_temporary_table_for_rename"); + + /* Find last instance when cur_table is in TO part */ + for (table= first_table; + table != cur_table; + table= table->next_local->next_local) + { + TABLE_LIST *next= table->next_local; + + if (!strcmp(table->get_db_name(), cur_table->get_db_name()) && + !strcmp(table->get_table_name(), cur_table->get_table_name())) + { + /* Table was moved away, can't be same as 'table' */ + found= 1; + res= 0; // Table can't be a temporary table + } + if (!strcmp(next->get_db_name(), cur_table->get_db_name()) && + !strcmp(next->get_table_name(), cur_table->get_table_name())) + { + /* + Table has matching name with new name of this table. cur_table should + have same temporary type as this table. + */ + found= 1; + res= table->table; + } + } + if (!found) + res= find_temporary_table(thd, table); + DBUG_RETURN(res); +} + + static bool check_rename_table(THD *thd, TABLE_LIST *first_table, TABLE_LIST *all_tables) { @@ -5991,13 +6063,19 @@ static bool check_rename_table(THD *thd, TABLE_LIST *first_table, &table->next_local->grant.m_internal, 0, 0)) return 1; + + /* check if these are refering to temporary tables */ + table->table= find_temporary_table_for_rename(thd, first_table, table); + table->next_local->table= table->table; + TABLE_LIST old_list, new_list; /* we do not need initialize old_list and new_list because we will - come table[0] and table->next[0] there + copy table[0] and table->next[0] there */ old_list= table[0]; new_list= table->next_local[0]; + if (check_grant(thd, ALTER_ACL | DROP_ACL, &old_list, FALSE, 1, FALSE) || (!test_all_bits(table->next_local->grant.privilege, INSERT_ACL | CREATE_ACL) && @@ -6907,8 +6985,9 @@ void THD::reset_for_next_command(bool do_clear_error) We also assign thd->stmt_lex in lex_start(), but during bootstrap this code is executed first. */ - thd->stmt_lex= &main_lex; thd->stmt_lex->current_select_number= 1; - DBUG_PRINT("info", ("Lex %p stmt_lex: %p", thd->lex, thd->stmt_lex)); + DBUG_ASSERT(lex == &main_lex); + main_lex.stmt_lex= &main_lex; main_lex.current_select_number= 1; + DBUG_PRINT("info", ("Lex and stmt_lex: %p", &main_lex)); /* Those two lines below are theoretically unneeded as THD::cleanup_after_query() should take care of this already. @@ -7026,7 +7105,7 @@ mysql_new_select(LEX *lex, bool move_down) if (!(select_lex= new (thd->mem_root) SELECT_LEX())) DBUG_RETURN(1); - select_lex->select_number= ++thd->stmt_lex->current_select_number; + select_lex->select_number= ++thd->lex->stmt_lex->current_select_number; select_lex->parent_lex= lex; /* Used in init_query. */ select_lex->init_query(); select_lex->init_select(); @@ -7171,12 +7250,21 @@ static void wsrep_mysql_parse(THD *thd, char *rawbuf, uint length, com_statement_info[thd->get_command()].m_key); MYSQL_SET_STATEMENT_TEXT(thd->m_statement_psi, thd->query(), thd->query_length()); + + DBUG_EXECUTE_IF("sync.wsrep_retry_autocommit", + { + const char act[]= + "now " + "SIGNAL wsrep_retry_autocommit_reached " + "WAIT_FOR wsrep_retry_autocommit_continue"; + DBUG_ASSERT(!debug_sync_set_action(thd, STRING_WITH_LEN(act))); + }); } mysql_parse(thd, rawbuf, length, parser_state); if (WSREP(thd)) { /* wsrep BF abort in query exec phase */ - mysql_mutex_lock(&thd->LOCK_wsrep_thd); + mysql_mutex_lock(&thd->LOCK_thd_data); if (thd->wsrep_conflict_state == MUST_ABORT) { wsrep_client_rollback(thd); @@ -7185,6 +7273,11 @@ static void wsrep_mysql_parse(THD *thd, char *rawbuf, uint length, if (thd->wsrep_conflict_state == MUST_REPLAY) { + mysql_mutex_unlock(&thd->LOCK_thd_data); + if (thd->lex->explain) + delete_explain_query(thd->lex); + mysql_mutex_lock(&thd->LOCK_thd_data); + wsrep_replay_transaction(thd); } @@ -7193,7 +7286,6 @@ static void wsrep_mysql_parse(THD *thd, char *rawbuf, uint length, thd->wsrep_conflict_state == CERT_FAILURE) { thd->reset_for_next_command(); - thd->reset_killed(); if (is_autocommit && thd->lex->sql_command != SQLCOM_SELECT && (thd->wsrep_retry_counter < thd->variables.wsrep_retry_autocommit)) @@ -7221,22 +7313,27 @@ static void wsrep_mysql_parse(THD *thd, char *rawbuf, uint length, thd->thread_id, is_autocommit, thd->wsrep_retry_counter, thd->variables.wsrep_retry_autocommit, thd->query()); my_error(ER_LOCK_DEADLOCK, MYF(0), "wsrep aborted transaction"); - thd->reset_killed(); thd->wsrep_conflict_state= NO_CONFLICT; if (thd->wsrep_conflict_state != REPLAYING) thd->wsrep_retry_counter= 0; // reset } + mysql_mutex_unlock(&thd->LOCK_thd_data); + thd->reset_killed(); } else { set_if_smaller(thd->wsrep_retry_counter, 0); // reset; eventually ok + mysql_mutex_unlock(&thd->LOCK_thd_data); } - mysql_mutex_unlock(&thd->LOCK_wsrep_thd); } /* If retry is requested clean up explain structure */ - if (thd->wsrep_conflict_state == RETRY_AUTOCOMMIT && thd->lex->explain) + if ((thd->wsrep_conflict_state == RETRY_AUTOCOMMIT || + thd->wsrep_conflict_state == MUST_REPLAY ) + && thd->lex->explain) + { delete_explain_query(thd->lex); + } } while (thd->wsrep_conflict_state== RETRY_AUTOCOMMIT); @@ -8185,7 +8282,7 @@ kill_one_thread(THD *thd, longlong id, killed_state kill_signal, killed_type typ if (((thd->security_ctx->master_access & SUPER_ACL) || thd->security_ctx->user_matches(tmp->security_ctx)) && - !wsrep_thd_is_BF(tmp, true)) + !wsrep_thd_is_BF(tmp, false)) { tmp->awake(kill_signal); error=0; diff --git a/sql/sql_parse.h b/sql/sql_parse.h index da9721df0..602a3e8d7 100644 --- a/sql/sql_parse.h +++ b/sql/sql_parse.h @@ -85,6 +85,7 @@ bool check_identifier_name(LEX_STRING *str, uint max_char_length, uint err_code, const char *param_for_err_msg); bool mysql_test_parse_for_slave(THD *thd,char *inBuf,uint length); bool sqlcom_can_generate_row_events(const THD *thd); +bool stmt_causes_implicit_commit(THD *thd, uint mask); bool is_update_query(enum enum_sql_command command); bool is_log_table_write_query(enum enum_sql_command command); bool alloc_query(THD *thd, const char *packet, uint packet_length); diff --git a/sql/sql_partition.cc b/sql/sql_partition.cc index 13e5f1668..65c76127d 100644 --- a/sql/sql_partition.cc +++ b/sql/sql_partition.cc @@ -1,5 +1,5 @@ /* Copyright (c) 2005, 2017, Oracle and/or its affiliates. - Copyright (c) 2009, 2017, SkySQL Ab. + Copyright (c) 2009, 2018, MariaDB 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 @@ -6555,7 +6555,7 @@ static void alter_partition_lock_handling(ALTER_PARTITION_PARAM_TYPE *lpt) thd->set_stmt_da(&tmp_stmt_da); } - if (thd->locked_tables_list.reopen_tables(thd)) + if (thd->locked_tables_list.reopen_tables(thd, false)) sql_print_warning("We failed to reacquire LOCKs in ALTER TABLE"); if (stmt_da) @@ -6759,7 +6759,7 @@ void handle_alter_part_error(ALTER_PARTITION_PARAM_TYPE *lpt, thd->set_stmt_da(&tmp_stmt_da); } - if (thd->locked_tables_list.reopen_tables(thd)) + if (thd->locked_tables_list.reopen_tables(thd, false)) sql_print_warning("We failed to reacquire LOCKs in ALTER TABLE"); if (stmt_da) diff --git a/sql/sql_partition_admin.cc b/sql/sql_partition_admin.cc index e850677f8..1ac9e748d 100644 --- a/sql/sql_partition_admin.cc +++ b/sql/sql_partition_admin.cc @@ -652,7 +652,7 @@ bool Sql_cmd_alter_table_exchange_partition:: better to keep master/slave in consistent state. Alternative would be to try to revert the exchange operation and issue error. */ - (void) thd->locked_tables_list.reopen_tables(thd); + (void) thd->locked_tables_list.reopen_tables(thd, false); if ((error= write_bin_log(thd, TRUE, thd->query(), thd->query_length()))) { diff --git a/sql/sql_plugin.cc b/sql/sql_plugin.cc index d57137b30..7e4be9aed 100644 --- a/sql/sql_plugin.cc +++ b/sql/sql_plugin.cc @@ -1,6 +1,6 @@ /* - Copyright (c) 2005, 2013, Oracle and/or its affiliates. - Copyright (c) 2010, 2017, MariaDB Corporation. + Copyright (c) 2005, 2018, Oracle and/or its affiliates. + Copyright (c) 2010, 2018, MariaDB Corporation 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 @@ -2120,6 +2120,7 @@ bool mysql_install_plugin(THD *thd, const LEX_STRING *name, tables.init_one_table("mysql", 5, "plugin", 6, "plugin", TL_WRITE); if (!opt_noacl && check_table_access(thd, INSERT_ACL, &tables, FALSE, 1, FALSE)) DBUG_RETURN(TRUE); + WSREP_TO_ISOLATION_BEGIN(WSREP_MYSQL_DB, NULL, NULL); WSREP_TO_ISOLATION_BEGIN(WSREP_MYSQL_DB, NULL, NULL) @@ -2155,6 +2156,7 @@ bool mysql_install_plugin(THD *thd, const LEX_STRING *name, See also mysql_uninstall_plugin() and initialize_audit_plugin() */ + mysql_audit_acquire_plugins(thd, event_class_mask); mysql_mutex_lock(&LOCK_plugin); @@ -2263,6 +2265,7 @@ bool mysql_uninstall_plugin(THD *thd, const LEX_STRING *name, if (!opt_noacl && check_table_access(thd, DELETE_ACL, &tables, FALSE, 1, FALSE)) DBUG_RETURN(TRUE); + WSREP_TO_ISOLATION_BEGIN(WSREP_MYSQL_DB, NULL, NULL); WSREP_TO_ISOLATION_BEGIN(WSREP_MYSQL_DB, NULL, NULL) @@ -2270,6 +2273,16 @@ bool mysql_uninstall_plugin(THD *thd, const LEX_STRING *name, if (! (table= open_ltable(thd, &tables, TL_WRITE, MYSQL_LOCK_IGNORE_TIMEOUT))) DBUG_RETURN(TRUE); + if (!table->key_info) + { + my_printf_error(ER_UNKNOWN_ERROR, + "The table %s.%s has no primary key. " + "Please check the table definition and " + "create the primary key accordingly.", MYF(0), + table->s->db.str, table->s->table_name.str); + DBUG_RETURN(TRUE); + } + /* Pre-acquire audit plugins for events that may potentially occur during [UN]INSTALL PLUGIN. diff --git a/sql/sql_prepare.cc b/sql/sql_prepare.cc index b515578eb..92d2b1c68 100644 --- a/sql/sql_prepare.cc +++ b/sql/sql_prepare.cc @@ -2736,6 +2736,15 @@ void mysql_sql_stmt_prepare(THD *thd) DBUG_VOID_RETURN; } +#if MYSQL_VERSION_ID < 100200 + /* + Backpoiting MDEV-14603 from 10.2 to 10.1 + Remove the code between #if..#endif when merging. + */ + Item_change_list change_list_save_point; + thd->change_list.move_elements_to(&change_list_save_point); +#endif + if (stmt->prepare(query, query_len)) { /* Statement map deletes the statement on erase */ @@ -2744,6 +2753,15 @@ void mysql_sql_stmt_prepare(THD *thd) else my_ok(thd, 0L, 0L, "Statement prepared"); +#if MYSQL_VERSION_ID < 100200 + /* + Backpoiting MDEV-14603 from 10.2 to 10.1 + Remove the code between #if..#endif when merging. + */ + thd->rollback_item_tree_changes(); + change_list_save_point.move_elements_to(&thd->change_list); +#endif + DBUG_VOID_RETURN; } @@ -3039,7 +3057,27 @@ void mysql_sql_stmt_execute(THD *thd) */ Item *free_list_backup= thd->free_list; thd->free_list= NULL; // Hide the external (e.g. "SET STATEMENT") Items + +#if MYSQL_VERSION_ID < 100200 + /* + Backpoiting MDEV-14603 from 10.2 to 10.1 + Remove the code between #if..#endif when merging. + */ + Item_change_list change_list_save_point; + thd->change_list.move_elements_to(&change_list_save_point); +#endif + (void) stmt->execute_loop(&expanded_query, FALSE, NULL, NULL); + +#if MYSQL_VERSION_ID < 100200 + /* + Backpoiting MDEV-14603 from 10.2 to 10.1 + Remove the code between #if..#endif when merging. + */ + thd->rollback_item_tree_changes(); + change_list_save_point.move_elements_to(&thd->change_list); +#endif + thd->free_items(); // Free items created by execute_loop() /* Now restore the "external" (e.g. "SET STATEMENT") Item list. @@ -3635,7 +3673,7 @@ bool Prepared_statement::prepare(const char *packet, uint packet_len) if (! (lex= new (mem_root) st_lex_local)) DBUG_RETURN(TRUE); - stmt_lex= lex; + lex->stmt_lex= lex; if (set_db(thd->db, thd->db_length)) DBUG_RETURN(TRUE); @@ -3920,7 +3958,7 @@ Prepared_statement::execute_loop(String *expanded_query, if (WSREP_ON) { - mysql_mutex_lock(&thd->LOCK_wsrep_thd); + mysql_mutex_lock(&thd->LOCK_thd_data); switch (thd->wsrep_conflict_state) { case CERT_FAILURE: @@ -3936,7 +3974,7 @@ Prepared_statement::execute_loop(String *expanded_query, default: break; } - mysql_mutex_unlock(&thd->LOCK_wsrep_thd); + mysql_mutex_unlock(&thd->LOCK_thd_data); } #endif /* WITH_WSREP */ @@ -3958,7 +3996,6 @@ Prepared_statement::execute_loop(String *expanded_query, return error; } - bool Prepared_statement::execute_server_runnable(Server_runnable *server_runnable) { @@ -4168,6 +4205,7 @@ bool Prepared_statement::execute(String *expanded_query, bool open_cursor) Statement stmt_backup; Query_arena *old_stmt_arena; bool error= TRUE; + bool qc_executed= FALSE; char saved_cur_db_name_buf[SAFE_NAME_LEN+1]; LEX_STRING saved_cur_db_name= @@ -4290,6 +4328,7 @@ bool Prepared_statement::execute(String *expanded_query, bool open_cursor) thd->lex->sql_command= SQLCOM_SELECT; status_var_increment(thd->status_var.com_stat[SQLCOM_SELECT]); thd->update_stats(); + qc_executed= TRUE; } } @@ -4328,7 +4367,7 @@ bool Prepared_statement::execute(String *expanded_query, bool open_cursor) thd->set_statement(&stmt_backup); thd->stmt_arena= old_stmt_arena; - if (state == Query_arena::STMT_PREPARED) + if (state == Query_arena::STMT_PREPARED && !qc_executed) state= Query_arena::STMT_EXECUTED; if (error == 0 && this->lex->sql_command == SQLCOM_CALL) diff --git a/sql/sql_priv.h b/sql/sql_priv.h index ef3dd6806..e30060c8d 100644 --- a/sql/sql_priv.h +++ b/sql/sql_priv.h @@ -1,5 +1,5 @@ -/* Copyright (c) 2000, 2014, Oracle and/or its affiliates. - Copyright (c) 2010, 2014, Monty Program Ab. +/* Copyright (c) 2000, 2018, Oracle and/or its affiliates. + Copyright (c) 2010, 2018, Monty Program 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 diff --git a/sql/sql_rename.cc b/sql/sql_rename.cc index 35222bce9..4c164a3a6 100644 --- a/sql/sql_rename.cc +++ b/sql/sql_rename.cc @@ -222,7 +222,7 @@ do_rename_temporary(THD *thd, TABLE_LIST *ren_table, TABLE_LIST *new_table, new_alias= (lower_case_table_names == 2) ? new_table->alias : new_table->table_name; - if (is_temporary_table(new_table)) + if (find_temporary_table(thd, new_table)) { my_error(ER_TABLE_EXISTS_ERROR, MYF(0), new_alias); DBUG_RETURN(1); // This can't be skipped diff --git a/sql/sql_repl.cc b/sql/sql_repl.cc index b5cca3348..569c3d2c4 100644 --- a/sql/sql_repl.cc +++ b/sql/sql_repl.cc @@ -1904,11 +1904,8 @@ send_event_to_slave(binlog_send_info *info, Log_event_type event_type, */ if (info->thd->variables.option_bits & OPTION_SKIP_REPLICATION) { - /* - The first byte of the packet is a '\0' to distinguish it from an error - packet. So the actual event starts at offset +1. - */ - uint16 event_flags= uint2korr(&((*packet)[FLAGS_OFFSET+1])); + uint16 event_flags= uint2korr(&((*packet)[FLAGS_OFFSET + ev_offset])); + if (event_flags & LOG_EVENT_SKIP_REPLICATION_F) return NULL; } diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 067c71205..c52f74fbd 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -1148,9 +1148,6 @@ JOIN::optimize_inner() eval_select_list_used_tables(); - if (optimize_constant_subqueries()) - DBUG_RETURN(1); - table_count= select_lex->leaf_tables.elements; if (setup_ftfuncs(select_lex)) /* should be after having->fix_fields */ @@ -1212,6 +1209,9 @@ JOIN::optimize_inner() thd->restore_active_arena(arena, &backup); } + if (optimize_constant_subqueries()) + DBUG_RETURN(1); + if (setup_jtbm_semi_joins(this, join_list, &conds)) DBUG_RETURN(1); @@ -1250,10 +1250,19 @@ JOIN::optimize_inner() if (cond_value == Item::COND_FALSE || having_value == Item::COND_FALSE || (!unit->select_limit_cnt && !(select_options & OPTION_FOUND_ROWS))) { /* Impossible cond */ - DBUG_PRINT("info", (having_value == Item::COND_FALSE ? - "Impossible HAVING" : "Impossible WHERE")); - zero_result_cause= having_value == Item::COND_FALSE ? - "Impossible HAVING" : "Impossible WHERE"; + if (unit->select_limit_cnt) + { + DBUG_PRINT("info", (having_value == Item::COND_FALSE ? + "Impossible HAVING" : "Impossible WHERE")); + zero_result_cause= having_value == Item::COND_FALSE ? + "Impossible HAVING" : "Impossible WHERE"; + } + else + { + DBUG_PRINT("info", ("Zero limit")); + zero_result_cause= "Zero limit"; + conds= 0; + } table_count= top_join_tab_count= 0; error= 0; goto setup_subq_exit; @@ -25465,21 +25474,18 @@ void JOIN::set_allowed_join_cache_types() void JOIN::save_query_plan(Join_plan_state *save_to) { - if (keyuse.elements) - { - DYNAMIC_ARRAY tmp_keyuse; - /* Swap the current and the backup keyuse internal arrays. */ - tmp_keyuse= keyuse; - keyuse= save_to->keyuse; /* keyuse is reset to an empty array. */ - save_to->keyuse= tmp_keyuse; + DYNAMIC_ARRAY tmp_keyuse; + /* Swap the current and the backup keyuse internal arrays. */ + tmp_keyuse= keyuse; + keyuse= save_to->keyuse; /* keyuse is reset to an empty array. */ + save_to->keyuse= tmp_keyuse; - for (uint i= 0; i < table_count; i++) - { - save_to->join_tab_keyuse[i]= join_tab[i].keyuse; - join_tab[i].keyuse= NULL; - save_to->join_tab_checked_keys[i]= join_tab[i].checked_keys; - join_tab[i].checked_keys.clear_all(); - } + for (uint i= 0; i < table_count; i++) + { + save_to->join_tab_keyuse[i]= join_tab[i].keyuse; + join_tab[i].keyuse= NULL; + save_to->join_tab_checked_keys[i]= join_tab[i].checked_keys; + join_tab[i].checked_keys.clear_all(); } memcpy((uchar*) save_to->best_positions, (uchar*) best_positions, sizeof(POSITION) * (table_count + 1)); @@ -25517,20 +25523,17 @@ void JOIN::reset_query_plan() void JOIN::restore_query_plan(Join_plan_state *restore_from) { - if (restore_from->keyuse.elements) - { - DYNAMIC_ARRAY tmp_keyuse; - tmp_keyuse= keyuse; - keyuse= restore_from->keyuse; - restore_from->keyuse= tmp_keyuse; - - for (uint i= 0; i < table_count; i++) - { - join_tab[i].keyuse= restore_from->join_tab_keyuse[i]; - join_tab[i].checked_keys= restore_from->join_tab_checked_keys[i]; - } + DYNAMIC_ARRAY tmp_keyuse; + tmp_keyuse= keyuse; + keyuse= restore_from->keyuse; + restore_from->keyuse= tmp_keyuse; + for (uint i= 0; i < table_count; i++) + { + join_tab[i].keyuse= restore_from->join_tab_keyuse[i]; + join_tab[i].checked_keys= restore_from->join_tab_checked_keys[i]; } + memcpy((uchar*) best_positions, (uchar*) restore_from->best_positions, sizeof(POSITION) * (table_count + 1)); /* Restore SJM nests */ diff --git a/sql/sql_show.cc b/sql/sql_show.cc index 5a78a27a9..bbf2cb30b 100644 --- a/sql/sql_show.cc +++ b/sql/sql_show.cc @@ -2437,16 +2437,16 @@ static const char *thread_state_info(THD *tmp) else return "Reading from net"; } - else +#else + if (tmp->get_command() == COM_SLEEP) + return ""; #endif - { - if (tmp->proc_info) - return tmp->proc_info; - else if (tmp->mysys_var && tmp->mysys_var->current_cond) - return "Waiting on cond"; - else - return NULL; - } + if (tmp->proc_info) + return tmp->proc_info; + else if (tmp->mysys_var && tmp->mysys_var->current_cond) + return "Waiting on cond"; + else + return NULL; } void mysqld_list_processes(THD *thd,const char *user, bool verbose) @@ -3483,6 +3483,13 @@ extern ST_SCHEMA_TABLE schema_tables[]; bool schema_table_store_record(THD *thd, TABLE *table) { int error; + + if (thd->killed) + { + thd->send_kill_message(); + return 1; + } + if ((error= table->file->ha_write_tmp_row(table->record[0]))) { TMP_TABLE_PARAM *param= table->pos_in_table_list->schema_table_param; @@ -9763,3 +9770,88 @@ static void get_cs_converted_string_value(THD *thd, return; } #endif + +/** + Dumps a text description of a thread, its security context + (user, host) and the current query. + + @param thd thread context + @param buffer pointer to preferred result buffer + @param length length of buffer + @param max_query_len how many chars of query to copy (0 for all) + + @return Pointer to string +*/ + +extern "C" +char *thd_get_error_context_description(THD *thd, char *buffer, + unsigned int length, + unsigned int max_query_len) +{ + String str(buffer, length, &my_charset_latin1); + const Security_context *sctx= &thd->main_security_ctx; + char header[256]; + int len; + + mysql_mutex_lock(&LOCK_thread_count); + + len= my_snprintf(header, sizeof(header), + "MySQL thread id %lu, OS thread handle 0x%lx, query id %lu", + thd->thread_id, (ulong) thd->real_id, (ulong) thd->query_id); + str.length(0); + str.append(header, len); + + if (sctx->host) + { + str.append(' '); + str.append(sctx->host); + } + + if (sctx->ip) + { + str.append(' '); + str.append(sctx->ip); + } + + if (sctx->user) + { + str.append(' '); + str.append(sctx->user); + } + + /* Don't wait if LOCK_thd_data is used as this could cause a deadlock */ + if (!mysql_mutex_trylock(&thd->LOCK_thd_data)) + { + if (const char *info= thread_state_info(thd)) + { + str.append(' '); + str.append(info); + } + + if (thd->query()) + { + if (max_query_len < 1) + len= thd->query_length(); + else + len= MY_MIN(thd->query_length(), max_query_len); + str.append('\n'); + str.append(thd->query(), len); + } + mysql_mutex_unlock(&thd->LOCK_thd_data); + } + mysql_mutex_unlock(&LOCK_thread_count); + + if (str.c_ptr_safe() == buffer) + return buffer; + + /* + We have to copy the new string to the destination buffer because the string + was reallocated to a larger buffer to be able to fit. + */ + DBUG_ASSERT(buffer != NULL); + length= MY_MIN(str.length(), length-1); + memcpy(buffer, str.c_ptr_quick(), length); + /* Make sure that the new string is null terminated */ + buffer[length]= '\0'; + return buffer; +} diff --git a/sql/sql_statistics.cc b/sql/sql_statistics.cc index 1e8e95931..b7ccbb5c2 100644 --- a/sql/sql_statistics.cc +++ b/sql/sql_statistics.cc @@ -1518,7 +1518,8 @@ class Stat_table_write_iter ~Stat_table_write_iter() { - cleanup(); + /* Ensure that cleanup has been run */ + DBUG_ASSERT(rowid_buf == 0); } }; @@ -2617,7 +2618,7 @@ int collect_statistics_for_index(THD *thd, TABLE *table, uint index) DBUG_ENTER("collect_statistics_for_index"); /* No statistics for FULLTEXT indexes. */ - if (key_info->flags & HA_FULLTEXT) + if (key_info->flags & (HA_FULLTEXT|HA_SPATIAL)) DBUG_RETURN(rc); Index_prefix_calc index_prefix_calc(table, key_info); @@ -3083,18 +3084,19 @@ bool statistics_for_tables_is_needed(THD *thd, TABLE_LIST *tables) return FALSE; /* - Do not read statistics for any query over non-user tables. - If the query references some statistical tables, but not all - of them, reading the statistics may lead to a deadlock - */ + Do not read statistics for any query that explicity involves + statistical tables, failure to to do so we may end up + in a deadlock. + */ + for (TABLE_LIST *tl= tables; tl; tl= tl->next_global) { if (!tl->is_view_or_derived() && tl->table) { TABLE_SHARE *table_share= tl->table->s; if (table_share && - (table_share->table_category != TABLE_CATEGORY_USER || - table_share->tmp_table != NO_TMP_TABLE)) + table_share->table_category != TABLE_CATEGORY_USER + && is_stat_table(tl->db, tl->alias)) return FALSE; } } @@ -3767,6 +3769,15 @@ double get_column_range_cardinality(Field *field, if (!col_stats) return tab_records; + /* + Use statistics for a table only when we have actually read + the statistics from the stat tables. For example due to + chances of getting a deadlock we disable reading statistics for + a table. + */ + + if (!table->stats_is_read) + return tab_records; double col_nulls= tab_records * col_stats->get_nulls_ratio(); @@ -3980,14 +3991,13 @@ bool is_stat_table(const char *db, const char *table) { DBUG_ASSERT(db && table); - if (!memcmp(db, stat_tables_db_name.str, stat_tables_db_name.length)) + if (!my_strcasecmp(table_alias_charset, db, stat_tables_db_name.str)) { for (uint i= 0; i < STATISTICS_TABLES; i ++) { - if (!memcmp(table, stat_table_name[i].str, stat_table_name[i].length)) + if (!my_strcasecmp(table_alias_charset, table, stat_table_name[i].str)) return true; } } return false; } - diff --git a/sql/sql_string.cc b/sql/sql_string.cc index 20772adcb..c22e33182 100644 --- a/sql/sql_string.cc +++ b/sql/sql_string.cc @@ -183,7 +183,16 @@ bool String::copy(const char *str,uint32 arg_length, CHARSET_INFO *cs) { if (alloc(arg_length)) return TRUE; - if ((str_length=arg_length)) + if (Ptr == str && arg_length == str_length) + { + /* + This can happen in some cases. This code is here mainly to avoid + warnings from valgrind, but can also be an indication of error. + */ + DBUG_PRINT("warning", ("Copying string on itself: %p %u", + str, arg_length)); + } + else if ((str_length=arg_length)) memcpy(Ptr,str,arg_length); Ptr[arg_length]=0; str_charset=cs; diff --git a/sql/sql_table.cc b/sql/sql_table.cc index 44df4bba7..3c9146354 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -1,6 +1,6 @@ /* Copyright (c) 2000, 2016, Oracle and/or its affiliates. - Copyright (c) 2010, 2016, MariaDB + Copyright (c) 2010, 2018, MariaDB 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 @@ -4198,7 +4198,7 @@ mysql_prepare_create_table(THD *thd, HA_CREATE_INFO *create_info, /* Give warnings for not supported table options */ #if defined(WITH_ARIA_STORAGE_ENGINE) extern handlerton *maria_hton; - if (file->ht != maria_hton) + if (file->partition_ht() != maria_hton) #endif if (create_info->transactional) push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, @@ -5071,7 +5071,7 @@ bool mysql_create_table(THD *thd, TABLE_LIST *create_table, This should always work as we have a meta lock on the table. */ thd->locked_tables_list.add_back_last_deleted_lock(pos_in_locked_tables); - if (thd->locked_tables_list.reopen_tables(thd)) + if (thd->locked_tables_list.reopen_tables(thd, false)) { thd->locked_tables_list.unlink_all_closed_tables(thd, NULL, 0); result= 1; @@ -5429,7 +5429,7 @@ bool mysql_create_like_table(THD* thd, TABLE_LIST* table, This should always work as we have a meta lock on the table. */ thd->locked_tables_list.add_back_last_deleted_lock(pos_in_locked_tables); - if (thd->locked_tables_list.reopen_tables(thd)) + if (thd->locked_tables_list.reopen_tables(thd, false)) { thd->locked_tables_list.unlink_all_closed_tables(thd, NULL, 0); res= 1; // We got an error @@ -5835,10 +5835,28 @@ handle_if_exists_options(THD *thd, TABLE *table, Alter_info *alter_info) List_iterator drop_it(alter_info->drop_list); Alter_drop *drop; bool remove_drop; + ulonglong left_flags= 0; while ((drop= drop_it++)) { + ulonglong cur_flag= 0; + switch (drop->type) { + case Alter_drop::COLUMN: + cur_flag= Alter_info::ALTER_DROP_COLUMN; + break; + case Alter_drop::FOREIGN_KEY: + cur_flag= Alter_info::DROP_FOREIGN_KEY; + break; + case Alter_drop::KEY: + cur_flag= Alter_info::ALTER_DROP_INDEX; + break; + default: + break; + } if (!drop->drop_if_exists) + { + left_flags|= cur_flag; continue; + } remove_drop= TRUE; if (drop->type == Alter_drop::COLUMN) { @@ -5915,12 +5933,15 @@ handle_if_exists_options(THD *thd, TABLE *table, Alter_info *alter_info) ER_THD(thd, ER_CANT_DROP_FIELD_OR_KEY), drop->name); drop_it.remove(); - if (alter_info->drop_list.is_empty()) - alter_info->flags&= ~(Alter_info::ALTER_DROP_COLUMN | - Alter_info::ALTER_DROP_INDEX | - Alter_info::DROP_FOREIGN_KEY); } + else + left_flags|= cur_flag; } + /* Reset state to what's left in drop list */ + alter_info->flags&= ~(Alter_info::ALTER_DROP_COLUMN | + Alter_info::ALTER_DROP_INDEX | + Alter_info::DROP_FOREIGN_KEY); + alter_info->flags|= left_flags; } /* ALTER TABLE ADD KEY IF NOT EXISTS */ @@ -5936,8 +5957,11 @@ handle_if_exists_options(THD *thd, TABLE *table, Alter_info *alter_info) continue; /* Check if the table already has a PRIMARY KEY */ - bool dup_primary_key= key->type == Key::PRIMARY && - table->s->primary_key != MAX_KEY; + bool dup_primary_key= + key->type == Key::PRIMARY && + table->s->primary_key != MAX_KEY && + (keyname= table->s->key_info[table->s->primary_key].name) && + my_strcasecmp(system_charset_info, keyname, primary_key_name) == 0; if (dup_primary_key) goto remove_key; @@ -7294,7 +7318,7 @@ static bool mysql_inplace_alter_table(THD *thd, HA_EXTRA_PREPARE_FOR_RENAME : HA_EXTRA_NOT_USED, NULL); - if (thd->locked_tables_list.reopen_tables(thd)) + if (thd->locked_tables_list.reopen_tables(thd, false)) thd->locked_tables_list.unlink_all_closed_tables(thd, NULL, 0); /* QQ; do something about metadata locks ? */ } @@ -9300,7 +9324,7 @@ bool mysql_alter_table(THD *thd,char *new_db, char *new_name, end_inplace: - if (thd->locked_tables_list.reopen_tables(thd)) + if (thd->locked_tables_list.reopen_tables(thd, false)) goto err_with_mdl_after_alter; THD_STAGE_INFO(thd, stage_end); @@ -9414,9 +9438,7 @@ bool mysql_trans_prepare_alter_copy_data(THD *thd) This needs to be done before external_lock. */ - if (ha_enable_transaction(thd, FALSE)) - DBUG_RETURN(TRUE); - DBUG_RETURN(FALSE); + DBUG_RETURN(ha_enable_transaction(thd, FALSE) != 0); } @@ -9472,6 +9494,7 @@ copy_data_between_tables(THD *thd, TABLE *from, TABLE *to, ha_rows examined_rows; ha_rows found_rows; bool auto_increment_field_copied= 0; + bool cleanup_done= 0; ulonglong save_sql_mode= thd->variables.sql_mode; ulonglong prev_insert_id, time_to_report_progress; Field **dfield_ptr= to->default_field; @@ -9480,15 +9503,23 @@ copy_data_between_tables(THD *thd, TABLE *from, TABLE *to, /* Two or 3 stages; Sorting, copying data and update indexes */ thd_progress_init(thd, 2 + MY_TEST(order)); - if (mysql_trans_prepare_alter_copy_data(thd)) - DBUG_RETURN(-1); - if (!(copy= new Copy_field[to->s->fields])) DBUG_RETURN(-1); /* purecov: inspected */ + if (mysql_trans_prepare_alter_copy_data(thd)) + { + delete [] copy; + DBUG_RETURN(-1); + } + /* We need external lock before we can disable/enable keys */ if (to->file->ha_external_lock(thd, F_WRLCK)) + { + /* Undo call to mysql_trans_prepare_alter_copy_data() */ + ha_enable_transaction(thd, TRUE); + delete [] copy; DBUG_RETURN(-1); + } alter_table_manage_keys(to, from->file->indexes_are_disabled(), keys_onoff); @@ -9498,7 +9529,6 @@ copy_data_between_tables(THD *thd, TABLE *from, TABLE *to, from->file->info(HA_STATUS_VARIABLE); to->file->ha_start_bulk_insert(from->file->stats.records, ignore ? 0 : HA_CREATE_UNIQUE_INDEX_BY_SORT); - List_iterator it(create); Create_field *def; copy_end=copy; @@ -9702,7 +9732,6 @@ copy_data_between_tables(THD *thd, TABLE *from, TABLE *to, } end_read_record(&info); free_io_cache(from); - delete [] copy; THD_STAGE_INFO(thd, stage_enabling_keys); thd_progress_next_stage(thd); @@ -9717,6 +9746,7 @@ copy_data_between_tables(THD *thd, TABLE *from, TABLE *to, to->file->print_error(my_errno,MYF(0)); error= 1; } + cleanup_done= 1; to->file->extra(HA_EXTRA_NO_IGNORE_DUP_KEY); if (mysql_trans_commit_alter_copy_data(thd)) @@ -9728,6 +9758,16 @@ copy_data_between_tables(THD *thd, TABLE *from, TABLE *to, *copied= found_count; *deleted=delete_count; to->file->ha_release_auto_increment(); + delete [] copy; + + if (!cleanup_done) + { + /* This happens if we get an error during initialzation of data */ + DBUG_ASSERT(error); + to->file->ha_end_bulk_insert(); + ha_enable_transaction(thd, TRUE); + } + if (to->file->ha_external_lock(thd,F_UNLCK)) error=1; if (error < 0 && to->file->extra(HA_EXTRA_PREPARE_FOR_RENAME)) diff --git a/sql/sql_time.cc b/sql/sql_time.cc index 2e2c5932c..6323538f1 100644 --- a/sql/sql_time.cc +++ b/sql/sql_time.cc @@ -959,6 +959,8 @@ bool date_add_interval(MYSQL_TIME *ltime, interval_type int_type, ltime->day= 0; return 0; } + else if (ltime->neg) + goto invalid_date; if (int_type != INTERVAL_DAY) ltime->time_type= MYSQL_TIMESTAMP_DATETIME; // Return full date diff --git a/sql/sql_trigger.cc b/sql/sql_trigger.cc index 70e9b36c5..d9999e2aa 100644 --- a/sql/sql_trigger.cc +++ b/sql/sql_trigger.cc @@ -1,5 +1,6 @@ /* Copyright (c) 2004, 2012, Oracle and/or its affiliates. + Copyright (c) 2010, 2018, MariaDB 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 @@ -441,7 +442,6 @@ bool mysql_create_or_drop_trigger(THD *thd, TABLE_LIST *tables, bool create) my_error(ER_BINLOG_CREATE_ROUTINE_NEED_SUPER, MYF(0)); DBUG_RETURN(TRUE); } - WSREP_TO_ISOLATION_BEGIN(WSREP_MYSQL_DB, NULL, NULL) if (!create) { @@ -503,6 +503,7 @@ bool mysql_create_or_drop_trigger(THD *thd, TABLE_LIST *tables, bool create) if (err_status) goto end; } + WSREP_TO_ISOLATION_BEGIN(WSREP_MYSQL_DB, NULL, NULL); /* We should have only one table in table list. */ DBUG_ASSERT(tables->next_global == 0); @@ -576,7 +577,7 @@ bool mysql_create_or_drop_trigger(THD *thd, TABLE_LIST *tables, bool create) Ignore the return value for now. It's better to keep master/slave in consistent state. */ - if (thd->locked_tables_list.reopen_tables(thd)) + if (thd->locked_tables_list.reopen_tables(thd, false)) thd->clear_error(); /* @@ -613,6 +614,7 @@ bool mysql_create_or_drop_trigger(THD *thd, TABLE_LIST *tables, bool create) #endif /* WITH_WSREP */ } + /** Build stmt_query to write it in the bin-log and get the trigger definer. @@ -1060,6 +1062,11 @@ Table_triggers_list::~Table_triggers_list() for (int j= 0; j < (int)TRG_ACTION_MAX; j++) delete bodies[i][j]; + /* Free blobs used in insert */ + if (record0_field) + for (Field **fld_ptr= record0_field; *fld_ptr; fld_ptr++) + (*fld_ptr)->free(); + if (record1_field) for (Field **fld_ptr= record1_field; *fld_ptr; fld_ptr++) delete *fld_ptr; @@ -1373,13 +1380,13 @@ bool Table_triggers_list::check_n_load(THD *thd, const char *db, List_iterator_fast it_client_cs_name(triggers->client_cs_names); List_iterator_fast it_connection_cl_name(triggers->connection_cl_names); List_iterator_fast it_db_cl_name(triggers->db_cl_names); - LEX *old_lex= thd->lex, *old_stmt_lex= thd->stmt_lex; + LEX *old_lex= thd->lex; LEX lex; sp_rcontext *save_spcont= thd->spcont; ulonglong save_sql_mode= thd->variables.sql_mode; LEX_STRING *on_table_name; - thd->lex= thd->stmt_lex= &lex; + thd->lex= &lex; save_db.str= thd->db; save_db.length= thd->db_length; @@ -1578,7 +1585,6 @@ bool Table_triggers_list::check_n_load(THD *thd, const char *db, } thd->reset_db(save_db.str, save_db.length); thd->lex= old_lex; - thd->stmt_lex= old_stmt_lex; thd->spcont= save_spcont; thd->variables.sql_mode= save_sql_mode; @@ -1591,7 +1597,6 @@ bool Table_triggers_list::check_n_load(THD *thd, const char *db, // QQ: anything else ? lex_end(&lex); thd->lex= old_lex; - thd->stmt_lex= old_stmt_lex; thd->spcont= save_spcont; thd->variables.sql_mode= save_sql_mode; thd->reset_db(save_db.str, save_db.length); diff --git a/sql/sql_truncate.cc b/sql/sql_truncate.cc index c08c75f77..8a70e6f6b 100644 --- a/sql/sql_truncate.cc +++ b/sql/sql_truncate.cc @@ -1,5 +1,5 @@ /* Copyright (c) 2010, 2015, Oracle and/or its affiliates. - Copyright (c) 2013, 2015, MariaDB + Copyright (c) 2012, 2018, MariaDB 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 @@ -426,7 +426,7 @@ bool Sql_cmd_truncate_table::truncate_table(THD *thd, TABLE_LIST *table_ref) */ error= dd_recreate_table(thd, table_ref->db, table_ref->table_name); - if (thd->locked_tables_mode && thd->locked_tables_list.reopen_tables(thd)) + if (thd->locked_tables_mode && thd->locked_tables_list.reopen_tables(thd, false)) thd->locked_tables_list.unlink_all_closed_tables(thd, NULL, 0); /* No need to binlog a failed truncate-by-recreate. */ @@ -500,4 +500,3 @@ bool Sql_cmd_truncate_table::execute(THD *thd) DBUG_RETURN(res); } - diff --git a/sql/sql_view.cc b/sql/sql_view.cc index 1bdc76a66..6bd6b6a7b 100644 --- a/sql/sql_view.cc +++ b/sql/sql_view.cc @@ -428,8 +428,7 @@ bool mysql_create_view(THD *thd, TABLE_LIST *views, lex->link_first_table_back(view, link_to_local); view->open_type= OT_BASE_ONLY; - - WSREP_TO_ISOLATION_BEGIN(WSREP_MYSQL_DB, NULL, NULL) + WSREP_TO_ISOLATION_BEGIN(WSREP_MYSQL_DB, NULL, NULL); /* ignore lock specs for CREATE statement @@ -692,15 +691,15 @@ bool mysql_create_view(THD *thd, TABLE_LIST *views, lex->link_first_table_back(view, link_to_local); DBUG_RETURN(0); +#ifdef WITH_WSREP + error: + res= TRUE; +#endif /* WITH_WSREP */ err: THD_STAGE_INFO(thd, stage_end); lex->link_first_table_back(view, link_to_local); unit->cleanup(); DBUG_RETURN(res || thd->is_error()); -#ifdef WITH_WSREP - error: - DBUG_RETURN(true); -#endif /* WITH_WSREP */ } @@ -1315,6 +1314,7 @@ bool mysql_make_view(THD *thd, TABLE_SHARE *share, TABLE_LIST *table, now Lex placed in statement memory */ + table->view= lex= thd->lex= (LEX*) new(thd->mem_root) st_lex_local; if (!table->view) { @@ -1340,8 +1340,9 @@ bool mysql_make_view(THD *thd, TABLE_SHARE *share, TABLE_LIST *table, goto end; lex_start(thd); + lex->stmt_lex= old_lex; view_select= &lex->select_lex; - view_select->select_number= ++thd->stmt_lex->current_select_number; + view_select->select_number= ++thd->lex->stmt_lex->current_select_number; ulonglong saved_mode= thd->variables.sql_mode; /* switch off modes which can prevent normal parsing of VIEW diff --git a/sql/sql_yacc.cc b/sql/sql_yacc.cc index 99944f1a0..caac1c428 100644 --- a/sql/sql_yacc.cc +++ b/sql/sql_yacc.cc @@ -3025,39 +3025,39 @@ static const yytype_uint16 yyrline[] = 14341, 14346, 14345, 14352, 14351, 14361, 14360, 14371, 14370, 14376, 14384, 14386, 14391, 14391, 14400, 14399, 14413, 14412, 14417, 14421, 14422, 14423, 14427, 14428, 14429, 14430, 14434, 14435, 14436, 14437, - 14442, 14466, 14492, 14503, 14515, 14529, 14544, 14563, 14580, 14592, - 14600, 14616, 14642, 14679, 14693, 14694, 14695, 14696, 14700, 14718, - 14736, 14737, 14741, 14742, 14743, 14744, 14748, 14762, 14766, 14767, - 14768, 14778, 14779, 14780, 14786, 14792, 14804, 14803, 14816, 14817, - 14821, 14822, 14826, 14841, 14842, 14843, 14848, 14849, 14854, 14853, - 14870, 14879, 14889, 14888, 14919, 14920, 14924, 14925, 14929, 14930, - 14931, 14932, 14934, 14933, 14946, 14947, 14948, 14949, 14950, 14956, - 14961, 14967, 14978, 14989, 14993, 15000, 15009, 15011, 15016, 15021, - 15028, 15040, 15052, 15059, 15071, 15072, 15075, 15076, 15079, 15084, - 15092, 15102, 15121, 15124, 15126, 15130, 15131, 15138, 15140, 15144, - 15145, 15150, 15149, 15153, 15152, 15156, 15155, 15159, 15158, 15161, - 15162, 15163, 15164, 15165, 15166, 15167, 15168, 15169, 15170, 15171, - 15172, 15173, 15174, 15175, 15176, 15177, 15178, 15179, 15180, 15181, - 15182, 15183, 15184, 15185, 15186, 15190, 15191, 15195, 15196, 15200, - 15207, 15214, 15224, 15235, 15244, 15253, 15265, 15270, 15278, 15283, - 15291, 15296, 15303, 15303, 15304, 15304, 15307, 15314, 15319, 15325, - 15331, 15337, 15341, 15345, 15346, 15350, 15378, 15380, 15384, 15388, - 15392, 15399, 15400, 15404, 15405, 15409, 15410, 15414, 15415, 15421, - 15427, 15433, 15439, 15449, 15448, 15458, 15467, 15468, 15472, 15473, - 15478, 15479, 15480, 15485, 15486, 15487, 15491, 15492, 15496, 15508, - 15517, 15527, 15536, 15550, 15551, 15556, 15555, 15571, 15572, 15576, - 15577, 15581, 15581, 15602, 15603, 15607, 15608, 15609, 15613, 15618, - 15626, 15629, 15627, 15642, 15649, 15670, 15694, 15696, 15700, 15701, - 15705, 15706, 15714, 15715, 15716, 15717, 15723, 15729, 15739, 15741, - 15743, 15748, 15749, 15750, 15751, 15752, 15756, 15757, 15758, 15759, - 15760, 15761, 15771, 15772, 15777, 15790, 15806, 15808, 15810, 15816, - 15817, 15819, 15825, 15824, 15843, 15844, 15848, 15854, 15863, 15863, - 15887, 15888, 15893, 15894, 15896, 15898, 15912, 15921, 15927, 15932, - 15909, 15982, 15983, 15987, 16007, 16028, 16032, 16038, 16044, 16003, - 16103, 16115, 16124, 16128, 16102, 16145, 16149, 16153, 16157, 16161, - 16165, 16172, 16179, 16186, 16196, 16197, 16201, 16202, 16203, 16207, - 16208, 16213, 16215, 16214, 16220, 16221, 16225, 16232, 16242, 16248, - 16259 + 14442, 14466, 14492, 14503, 14520, 14534, 14549, 14568, 14585, 14597, + 14605, 14621, 14647, 14684, 14698, 14699, 14700, 14701, 14705, 14723, + 14741, 14742, 14746, 14747, 14748, 14749, 14753, 14767, 14771, 14772, + 14773, 14783, 14784, 14785, 14791, 14797, 14809, 14808, 14821, 14822, + 14826, 14827, 14831, 14846, 14847, 14848, 14853, 14854, 14859, 14858, + 14875, 14884, 14894, 14893, 14924, 14925, 14929, 14930, 14934, 14935, + 14936, 14937, 14939, 14938, 14951, 14952, 14953, 14954, 14955, 14961, + 14966, 14972, 14983, 14994, 14998, 15005, 15014, 15016, 15021, 15026, + 15033, 15045, 15057, 15064, 15076, 15077, 15080, 15081, 15084, 15089, + 15097, 15107, 15126, 15129, 15131, 15135, 15136, 15143, 15145, 15149, + 15150, 15155, 15154, 15158, 15157, 15161, 15160, 15164, 15163, 15166, + 15167, 15168, 15169, 15170, 15171, 15172, 15173, 15174, 15175, 15176, + 15177, 15178, 15179, 15180, 15181, 15182, 15183, 15184, 15185, 15186, + 15187, 15188, 15189, 15190, 15191, 15195, 15196, 15200, 15201, 15205, + 15212, 15219, 15229, 15240, 15249, 15258, 15270, 15275, 15283, 15288, + 15296, 15301, 15308, 15308, 15309, 15309, 15312, 15319, 15324, 15330, + 15336, 15342, 15346, 15350, 15351, 15355, 15383, 15385, 15389, 15393, + 15397, 15404, 15405, 15409, 15410, 15414, 15415, 15419, 15420, 15426, + 15432, 15438, 15444, 15454, 15453, 15463, 15472, 15473, 15477, 15478, + 15483, 15484, 15485, 15490, 15491, 15492, 15496, 15497, 15501, 15513, + 15522, 15532, 15541, 15555, 15556, 15561, 15560, 15576, 15577, 15581, + 15582, 15586, 15586, 15607, 15608, 15612, 15613, 15614, 15618, 15623, + 15631, 15634, 15632, 15647, 15654, 15675, 15699, 15701, 15705, 15706, + 15710, 15711, 15719, 15720, 15721, 15722, 15728, 15734, 15744, 15746, + 15748, 15753, 15754, 15755, 15756, 15757, 15761, 15762, 15763, 15764, + 15765, 15766, 15776, 15777, 15782, 15795, 15811, 15813, 15815, 15821, + 15822, 15824, 15830, 15829, 15848, 15849, 15853, 15859, 15868, 15868, + 15892, 15893, 15898, 15899, 15901, 15903, 15917, 15926, 15932, 15937, + 15914, 15987, 15988, 15992, 16012, 16033, 16037, 16043, 16049, 16008, + 16108, 16120, 16129, 16133, 16107, 16150, 16154, 16158, 16162, 16166, + 16170, 16177, 16184, 16191, 16201, 16202, 16206, 16207, 16208, 16212, + 16213, 16218, 16220, 16219, 16225, 16226, 16230, 16237, 16247, 16253, + 16264 }; #endif @@ -38803,6 +38803,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); #line 14504 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { struct sys_var_with_base tmp= (yyvsp[-2].variable); + if (tmp.var == trg_new_row_fake_var) + { + my_error(ER_UNKNOWN_SYSTEM_VARIABLE, MYF(0), "NEW"); + MYSQL_YYABORT; + } /* Lookup if necessary: must be a system variable. */ if (tmp.var == NULL) { @@ -38812,11 +38817,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); if (set_system_variable(thd, &tmp, (yyvsp[-3].var_type), (yyvsp[0].item))) MYSQL_YYABORT; } -#line 38816 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38821 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2544: -#line 14516 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14521 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= thd->lex; CHARSET_INFO *cs2; @@ -38830,11 +38835,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); MYSQL_YYABORT; lex->var_list.push_back(var, thd->mem_root); } -#line 38834 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38839 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2545: -#line 14530 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14535 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; sp_pcontext *spc= lex->spcont; @@ -38849,11 +38854,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); MYSQL_YYABORT; } -#line 38853 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38858 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2546: -#line 14545 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14550 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; CHARSET_INFO *cs2; @@ -38872,11 +38877,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); MYSQL_YYABORT; lex->var_list.push_back(var, thd->mem_root); } -#line 38876 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38881 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2547: -#line 14564 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14569 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex = Lex; LEX_USER *user; @@ -38893,11 +38898,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); if (lex->sphead) lex->sphead->m_flags|= sp_head::HAS_SET_AUTOCOMMIT_STMT; } -#line 38897 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38902 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2548: -#line 14581 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14586 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex = Lex; set_var_default_role *var= (new (thd->mem_root) @@ -38909,11 +38914,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); if (lex->sphead) lex->sphead->m_flags|= sp_head::HAS_SET_AUTOCOMMIT_STMT; } -#line 38913 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38918 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2549: -#line 14593 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14598 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex = Lex; set_var_role *var= new (thd->mem_root) set_var_role((yyvsp[0].lex_str)); @@ -38921,11 +38926,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); MYSQL_YYABORT; lex->var_list.push_back(var, thd->mem_root); } -#line 38925 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38930 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2550: -#line 14601 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14606 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex = Lex; set_var_password *var= (new (thd->mem_root) @@ -38937,11 +38942,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); if (lex->sphead) lex->sphead->m_flags|= sp_head::HAS_SET_AUTOCOMMIT_STMT; } -#line 38941 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38946 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2551: -#line 14617 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14622 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { sp_pcontext *spc= thd->lex->spcont; sp_variable *spv; @@ -38967,11 +38972,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); (yyval.variable).base_name= (yyvsp[0].lex_str); } } -#line 38971 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38976 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2552: -#line 14643 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14648 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; if (check_reserved_words(&(yyvsp[-2].lex_str))) @@ -39008,11 +39013,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); (yyval.variable).base_name= (yyvsp[-2].lex_str); } } -#line 39012 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39017 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2553: -#line 14680 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14685 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { sys_var *tmp=find_sys_var(thd, (yyvsp[0].lex_str).str, (yyvsp[0].lex_str).length); if (!tmp) @@ -39023,11 +39028,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); (yyval.variable).base_name.str= (char*) "default"; (yyval.variable).base_name.length= 7; } -#line 39027 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39032 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2558: -#line 14701 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14706 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; Item *item= new (thd->mem_root) Item_int(thd, (int32) (yyvsp[0].num)); @@ -39042,11 +39047,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); MYSQL_YYABORT; lex->var_list.push_back(var, thd->mem_root); } -#line 39046 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39051 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2559: -#line 14719 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14724 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; Item *item= new (thd->mem_root) Item_int(thd, (int32) (yyvsp[0].tx_isolation)); @@ -39061,47 +39066,47 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); MYSQL_YYABORT; lex->var_list.push_back(var, thd->mem_root); } -#line 39065 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39070 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2560: -#line 14736 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14741 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num)= true; } -#line 39071 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39076 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2561: -#line 14737 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14742 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num)= false; } -#line 39077 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39082 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2562: -#line 14741 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14746 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.tx_isolation)= ISO_READ_UNCOMMITTED; } -#line 39083 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39088 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2563: -#line 14742 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14747 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.tx_isolation)= ISO_READ_COMMITTED; } -#line 39089 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39094 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2564: -#line 14743 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14748 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.tx_isolation)= ISO_REPEATABLE_READ; } -#line 39095 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39100 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2565: -#line 14744 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14749 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.tx_isolation)= ISO_SERIALIZABLE; } -#line 39101 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39106 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2566: -#line 14749 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14754 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= thd->lex; sp_pcontext *spc= lex->spcont; @@ -39115,82 +39120,82 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); lex->definer->plugin= empty_lex_str; lex->definer->auth= empty_lex_str; } -#line 39119 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39124 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2567: -#line 14762 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14767 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->definer= (yyvsp[-1].lex_user); } -#line 39125 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39130 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2568: -#line 14766 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14771 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->definer->pwhash= (yyvsp[0].lex_str);} -#line 39131 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39136 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2569: -#line 14767 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14772 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->definer->pwtext= (yyvsp[-1].lex_str); } -#line 39137 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39142 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2570: -#line 14769 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14774 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->definer->pwtext= (yyvsp[-1].lex_str); Lex->definer->pwhash.str= Item_func_password::alloc(thd, (yyvsp[-1].lex_str).str, (yyvsp[-1].lex_str).length, Item_func_password::OLD); Lex->definer->pwhash.length= SCRAMBLED_PASSWORD_CHAR_LENGTH_323; } -#line 39148 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39153 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2571: -#line 14778 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14783 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)=(yyvsp[0].item); } -#line 39154 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39159 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2572: -#line 14779 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14784 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)=0; } -#line 39160 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39165 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2573: -#line 14781 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14786 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)=new (thd->mem_root) Item_string_sys(thd, "ON", 2); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 39170 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39175 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2574: -#line 14787 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14792 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)=new (thd->mem_root) Item_string_sys(thd, "ALL", 3); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 39180 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39185 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2575: -#line 14793 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14798 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)=new (thd->mem_root) Item_string_sys(thd, "binary", 6); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 39190 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39195 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2576: -#line 14804 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14809 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; @@ -39198,29 +39203,29 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); my_yyabort_error((ER_SP_BADSTATEMENT, MYF(0), "LOCK")); lex->sql_command= SQLCOM_LOCK_TABLES; } -#line 39202 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39207 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2577: -#line 14812 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14817 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 39208 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39213 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2578: -#line 14816 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14821 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { } -#line 39214 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39219 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2579: -#line 14817 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14822 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { } -#line 39220 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39225 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2582: -#line 14827 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14832 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { thr_lock_type lock_type= (thr_lock_type) (yyvsp[0].num); bool lock_for_write= (lock_type >= TL_WRITE_ALLOW_WRITE); @@ -39232,43 +39237,43 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); MDL_SHARED_READ))) MYSQL_YYABORT; } -#line 39236 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39241 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2583: -#line 14841 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14846 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num)= TL_READ_NO_INSERT; } -#line 39242 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39247 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2584: -#line 14842 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14847 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num)= TL_WRITE_DEFAULT; } -#line 39248 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39253 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2585: -#line 14844 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14849 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num)= (Lex->sphead ? TL_WRITE_DEFAULT : TL_WRITE_CONCURRENT_INSERT); } -#line 39256 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39261 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2586: -#line 14848 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14853 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num)= TL_WRITE_LOW_PRIORITY; } -#line 39262 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39267 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2587: -#line 14849 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14854 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num)= TL_READ; } -#line 39268 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39273 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2588: -#line 14854 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14859 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; @@ -39276,17 +39281,17 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); my_yyabort_error((ER_SP_BADSTATEMENT, MYF(0), "UNLOCK")); lex->sql_command= SQLCOM_UNLOCK_TABLES; } -#line 39280 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39285 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2589: -#line 14862 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14867 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 39286 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39291 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2590: -#line 14871 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14876 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; if (lex->sphead) @@ -39295,11 +39300,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); if (!lex->current_select->add_table_to_list(thd, (yyvsp[-2].table), (yyvsp[0].lex_str_ptr), 0)) MYSQL_YYABORT; } -#line 39299 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39304 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2591: -#line 14880 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14885 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; if (lex->sphead) @@ -39308,11 +39313,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); if (!lex->current_select->add_table_to_list(thd, (yyvsp[-1].table), 0, 0)) MYSQL_YYABORT; } -#line 39312 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39317 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2592: -#line 14889 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14894 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; if (lex->sphead) @@ -39329,11 +39334,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); if (!lex->current_select->add_table_to_list(thd, (yyvsp[-1].table), 0, 0)) MYSQL_YYABORT; } -#line 39333 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39338 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2593: -#line 14906 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14911 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->expr_allows_subselect= TRUE; /* Stored functions are not supported for HANDLER READ. */ @@ -39344,59 +39349,59 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); MYSQL_YYABORT; } } -#line 39348 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39353 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2594: -#line 14919 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14924 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->ident= null_lex_str; } -#line 39354 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39359 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2595: -#line 14920 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14925 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->ident= (yyvsp[-1].lex_str); } -#line 39360 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39365 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2596: -#line 14924 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14929 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->ha_read_mode = RFIRST; } -#line 39366 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39371 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2597: -#line 14925 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14930 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->ha_read_mode = RNEXT; } -#line 39372 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39377 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2598: -#line 14929 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14934 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->ha_read_mode = RFIRST; } -#line 39378 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39383 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2599: -#line 14930 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14935 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->ha_read_mode = RNEXT; } -#line 39384 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39389 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2600: -#line 14931 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14936 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->ha_read_mode = RPREV; } -#line 39390 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39395 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2601: -#line 14932 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14937 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->ha_read_mode = RLAST; } -#line 39396 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39401 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2602: -#line 14934 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14939 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; lex->ha_read_mode = RKEY; @@ -39404,63 +39409,63 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); if (!(lex->insert_list= new (thd->mem_root) List_item)) MYSQL_YYABORT; } -#line 39408 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39413 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2603: -#line 14942 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14947 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 39414 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39419 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2604: -#line 14946 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14951 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.ha_rkey_mode)=HA_READ_KEY_EXACT; } -#line 39420 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39425 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2605: -#line 14947 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14952 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.ha_rkey_mode)=HA_READ_KEY_OR_NEXT; } -#line 39426 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39431 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2606: -#line 14948 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14953 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.ha_rkey_mode)=HA_READ_KEY_OR_PREV; } -#line 39432 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39437 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2607: -#line 14949 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14954 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.ha_rkey_mode)=HA_READ_AFTER_KEY; } -#line 39438 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39443 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2608: -#line 14950 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14955 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.ha_rkey_mode)=HA_READ_BEFORE_KEY; } -#line 39444 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39449 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2609: -#line 14957 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14962 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 39450 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39455 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2610: -#line 14962 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14967 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; lex->sql_command= SQLCOM_REVOKE; lex->type= 0; } -#line 39460 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39465 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2611: -#line 14968 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14973 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; if (lex->columns.elements) @@ -39471,11 +39476,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); lex->sql_command= SQLCOM_REVOKE; lex->type= TYPE_ENUM_FUNCTION; } -#line 39475 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39480 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2612: -#line 14979 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14984 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; if (lex->columns.elements) @@ -39486,68 +39491,68 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); lex->sql_command= SQLCOM_REVOKE; lex->type= TYPE_ENUM_PROCEDURE; } -#line 39490 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39495 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2613: -#line 14990 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14995 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->sql_command = SQLCOM_REVOKE_ALL; } -#line 39498 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39503 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2614: -#line 14994 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14999 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; lex->users_list.push_front ((yyvsp[-2].lex_user)); lex->sql_command= SQLCOM_REVOKE; lex->type= TYPE_ENUM_PROXY; } -#line 39509 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39514 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2615: -#line 15001 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15006 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->sql_command= SQLCOM_REVOKE_ROLE; if (Lex->users_list.push_front((yyvsp[-2].lex_user), thd->mem_root)) MYSQL_YYABORT; } -#line 39519 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39524 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2616: -#line 15010 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15015 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->with_admin_option= true; (yyval.lex_user)= (yyvsp[0].lex_user); } -#line 39525 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39530 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2617: -#line 15012 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15017 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->with_admin_option= false; (yyval.lex_user)= (yyvsp[0].lex_user); } -#line 39531 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39536 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2618: -#line 15017 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15022 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 39537 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39542 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2619: -#line 15023 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15028 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; lex->sql_command= SQLCOM_GRANT; lex->type= 0; } -#line 39547 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39552 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2620: -#line 15030 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15035 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; if (lex->columns.elements) @@ -39558,11 +39563,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); lex->sql_command= SQLCOM_GRANT; lex->type= TYPE_ENUM_FUNCTION; } -#line 39562 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39567 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2621: -#line 15042 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15047 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; if (lex->columns.elements) @@ -39573,22 +39578,22 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); lex->sql_command= SQLCOM_GRANT; lex->type= TYPE_ENUM_PROCEDURE; } -#line 39577 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39582 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2622: -#line 15053 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15058 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; lex->users_list.push_front ((yyvsp[-3].lex_user)); lex->sql_command= SQLCOM_GRANT; lex->type= TYPE_ENUM_PROXY; } -#line 39588 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39593 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2623: -#line 15060 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15065 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; lex->sql_command= SQLCOM_GRANT_ROLE; @@ -39596,64 +39601,64 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); if (Lex->users_list.push_front((yyvsp[-3].lex_user), thd->mem_root)) MYSQL_YYABORT; } -#line 39600 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39605 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2624: -#line 15071 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15076 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->definer = 0; } -#line 39606 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39611 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2625: -#line 15072 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15077 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->definer = (yyvsp[0].lex_user); } -#line 39612 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39617 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2626: -#line 15075 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15080 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->with_admin_option= false; } -#line 39618 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39623 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2627: -#line 15076 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15081 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->with_admin_option= true; } -#line 39624 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39629 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2628: -#line 15080 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15085 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (Lex->users_list.push_back((yyvsp[0].lex_user), thd->mem_root)) MYSQL_YYABORT; } -#line 39633 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39638 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2629: -#line 15085 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15090 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (Lex->users_list.push_back((yyvsp[0].lex_user), thd->mem_root)) MYSQL_YYABORT; } -#line 39642 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39647 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2630: -#line 15093 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15098 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (!((yyval.lex_user)=(LEX_USER*) thd->calloc(sizeof(LEX_USER)))) MYSQL_YYABORT; (yyval.lex_user)->user= current_role; (yyval.lex_user)->reset_auth(); } -#line 39653 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39658 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2631: -#line 15103 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15108 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { CHARSET_INFO *cs= system_charset_info; /* trim end spaces (as they'll be lost in mysql.user anyway) */ @@ -39672,275 +39677,275 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); cs, 0)) MYSQL_YYABORT; } -#line 39676 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39681 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2635: -#line 15130 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15135 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 39682 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39687 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2636: -#line 15132 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15137 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->all_privileges= 1; Lex->grant= GLOBAL_ACLS; } -#line 39691 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39696 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2641: -#line 15150 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15155 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->which_columns = SELECT_ACL;} -#line 39697 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39702 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2642: -#line 15151 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15156 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 39703 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39708 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2643: -#line 15153 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15158 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->which_columns = INSERT_ACL;} -#line 39709 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39714 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2644: -#line 15154 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15159 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 39715 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39720 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2645: -#line 15156 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15161 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->which_columns = UPDATE_ACL; } -#line 39721 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39726 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2646: -#line 15157 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15162 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 39727 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39732 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2647: -#line 15159 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15164 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->which_columns = REFERENCES_ACL;} -#line 39733 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39738 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2648: -#line 15160 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15165 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 39739 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39744 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2649: -#line 15161 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15166 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->grant |= DELETE_ACL;} -#line 39745 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39750 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2650: -#line 15162 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15167 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 39751 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39756 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2651: -#line 15163 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15168 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->grant |= INDEX_ACL;} -#line 39757 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39762 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2652: -#line 15164 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15169 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->grant |= ALTER_ACL;} -#line 39763 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39768 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2653: -#line 15165 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15170 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->grant |= CREATE_ACL;} -#line 39769 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39774 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2654: -#line 15166 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15171 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->grant |= DROP_ACL;} -#line 39775 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39780 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2655: -#line 15167 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15172 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->grant |= EXECUTE_ACL;} -#line 39781 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39786 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2656: -#line 15168 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15173 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->grant |= RELOAD_ACL;} -#line 39787 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39792 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2657: -#line 15169 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15174 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->grant |= SHUTDOWN_ACL;} -#line 39793 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39798 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2658: -#line 15170 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15175 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->grant |= PROCESS_ACL;} -#line 39799 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39804 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2659: -#line 15171 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15176 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->grant |= FILE_ACL;} -#line 39805 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39810 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2660: -#line 15172 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15177 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->grant |= GRANT_ACL;} -#line 39811 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39816 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2661: -#line 15173 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15178 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->grant |= SHOW_DB_ACL;} -#line 39817 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39822 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2662: -#line 15174 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15179 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->grant |= SUPER_ACL;} -#line 39823 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39828 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2663: -#line 15175 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15180 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->grant |= CREATE_TMP_ACL;} -#line 39829 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39834 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2664: -#line 15176 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15181 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->grant |= LOCK_TABLES_ACL; } -#line 39835 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39840 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2665: -#line 15177 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15182 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->grant |= REPL_SLAVE_ACL; } -#line 39841 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39846 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2666: -#line 15178 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15183 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->grant |= REPL_CLIENT_ACL; } -#line 39847 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39852 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2667: -#line 15179 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15184 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->grant |= CREATE_VIEW_ACL; } -#line 39853 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39858 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2668: -#line 15180 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15185 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->grant |= SHOW_VIEW_ACL; } -#line 39859 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39864 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2669: -#line 15181 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15186 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->grant |= CREATE_PROC_ACL; } -#line 39865 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39870 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2670: -#line 15182 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15187 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->grant |= ALTER_PROC_ACL; } -#line 39871 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39876 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2671: -#line 15183 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15188 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->grant |= CREATE_USER_ACL; } -#line 39877 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39882 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2672: -#line 15184 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15189 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->grant |= EVENT_ACL;} -#line 39883 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39888 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2673: -#line 15185 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15190 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->grant |= TRIGGER_ACL; } -#line 39889 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39894 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2674: -#line 15186 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15191 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->grant |= CREATE_TABLESPACE_ACL; } -#line 39895 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39900 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2675: -#line 15190 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15195 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 39901 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39906 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2676: -#line 15191 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15196 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 39907 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39912 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2679: -#line 15201 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15206 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; if (lex->x509_subject) my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "SUBJECT")); lex->x509_subject=(yyvsp[0].lex_str).str; } -#line 39918 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39923 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2680: -#line 15208 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15213 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; if (lex->x509_issuer) my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "ISSUER")); lex->x509_issuer=(yyvsp[0].lex_str).str; } -#line 39929 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39934 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2681: -#line 15215 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15220 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; if (lex->ssl_cipher) my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "CIPHER")); lex->ssl_cipher=(yyvsp[0].lex_str).str; } -#line 39940 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39945 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2682: -#line 15225 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15230 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; size_t dummy; @@ -39951,11 +39956,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); else if (lex->columns.elements) my_yyabort_error((ER_ILLEGAL_GRANT_FOR_TABLE, MYF(0))); } -#line 39955 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39960 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2683: -#line 15236 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15241 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; lex->current_select->db = (yyvsp[-2].lex_str).str; @@ -39964,11 +39969,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); else if (lex->columns.elements) my_yyabort_error((ER_ILLEGAL_GRANT_FOR_TABLE, MYF(0))); } -#line 39968 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39973 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2684: -#line 15245 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15250 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; lex->current_select->db = NULL; @@ -39977,11 +39982,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); else if (lex->columns.elements) my_yyabort_error((ER_ILLEGAL_GRANT_FOR_TABLE, MYF(0))); } -#line 39981 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39986 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2685: -#line 15254 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15259 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; if (!lex->current_select->add_table_to_list(thd, (yyvsp[0].table),NULL, @@ -39990,120 +39995,120 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); if (lex->grant == GLOBAL_ACLS) lex->grant = TABLE_ACLS & ~GRANT_ACL; } -#line 39994 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39999 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2686: -#line 15266 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15271 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (Lex->users_list.push_back((yyvsp[0].lex_user), thd->mem_root)) MYSQL_YYABORT; } -#line 40003 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40008 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2687: -#line 15271 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15276 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (Lex->users_list.push_back((yyvsp[0].lex_user), thd->mem_root)) MYSQL_YYABORT; } -#line 40012 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40017 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2688: -#line 15279 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15284 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (Lex->users_list.push_back((yyvsp[0].lex_user), thd->mem_root)) MYSQL_YYABORT; } -#line 40021 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40026 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2689: -#line 15284 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15289 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (Lex->users_list.push_back((yyvsp[0].lex_user), thd->mem_root)) MYSQL_YYABORT; } -#line 40030 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40035 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2690: -#line 15292 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15297 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (Lex->users_list.push_back((yyvsp[0].lex_user), thd->mem_root)) MYSQL_YYABORT; } -#line 40039 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40044 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2691: -#line 15297 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15302 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (Lex->users_list.push_back((yyvsp[0].lex_user), thd->mem_root)) MYSQL_YYABORT; } -#line 40048 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40053 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2696: -#line 15308 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15313 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.lex_user)= (yyvsp[-3].lex_user); (yyvsp[-3].lex_user)->pwtext= (yyvsp[0].lex_str); if (Lex->sql_command == SQLCOM_REVOKE) MYSQL_YYABORT; } -#line 40059 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40064 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2697: -#line 15315 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15320 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.lex_user)= (yyvsp[-4].lex_user); (yyvsp[-4].lex_user)->pwhash= (yyvsp[0].lex_str); } -#line 40068 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40073 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2698: -#line 15320 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15325 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.lex_user)= (yyvsp[-3].lex_user); (yyvsp[-3].lex_user)->plugin= (yyvsp[0].lex_str); (yyvsp[-3].lex_user)->auth= empty_lex_str; } -#line 40078 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40083 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2699: -#line 15326 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15331 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.lex_user)= (yyvsp[-5].lex_user); (yyvsp[-5].lex_user)->plugin= (yyvsp[-2].lex_str); (yyvsp[-5].lex_user)->auth= (yyvsp[0].lex_str); } -#line 40088 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40093 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2700: -#line 15332 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15337 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.lex_user)= (yyvsp[0].lex_user); } -#line 40094 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40099 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2701: -#line 15337 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15342 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; lex->grant |= lex->which_columns; } -#line 40103 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40108 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2705: -#line 15351 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15356 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { String *new_str= new (thd->mem_root) String((const char*) (yyvsp[0].lex_str).str,(yyvsp[0].lex_str).length,system_charset_info); if (new_str == NULL) @@ -40129,227 +40134,227 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); lex->columns.push_back(col, thd->mem_root); } } -#line 40133 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40138 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2707: -#line 15381 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15386 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->ssl_type=SSL_TYPE_SPECIFIED; } -#line 40141 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40146 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2708: -#line 15385 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15390 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->ssl_type=SSL_TYPE_ANY; } -#line 40149 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40154 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2709: -#line 15389 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15394 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->ssl_type=SSL_TYPE_X509; } -#line 40157 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40162 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2710: -#line 15393 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15398 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->ssl_type=SSL_TYPE_NONE; } -#line 40165 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40170 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2711: -#line 15399 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15404 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 40171 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40176 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2713: -#line 15404 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15409 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 40177 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40182 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2714: -#line 15405 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15410 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->grant |= GRANT_ACL;} -#line 40183 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40188 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2715: -#line 15409 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15414 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 40189 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40194 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2716: -#line 15410 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15415 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 40195 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40200 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2717: -#line 15414 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15419 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->grant |= GRANT_ACL;} -#line 40201 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40206 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2718: -#line 15416 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15421 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; lex->mqh.questions=(yyvsp[0].ulong_num); lex->mqh.specified_limits|= USER_RESOURCES::QUERIES_PER_HOUR; } -#line 40211 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40216 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2719: -#line 15422 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15427 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; lex->mqh.updates=(yyvsp[0].ulong_num); lex->mqh.specified_limits|= USER_RESOURCES::UPDATES_PER_HOUR; } -#line 40221 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40226 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2720: -#line 15428 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15433 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; lex->mqh.conn_per_hour= (yyvsp[0].ulong_num); lex->mqh.specified_limits|= USER_RESOURCES::CONNECTIONS_PER_HOUR; } -#line 40231 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40236 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2721: -#line 15434 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15439 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; lex->mqh.user_conn= (yyvsp[0].num); lex->mqh.specified_limits|= USER_RESOURCES::USER_CONNECTIONS; } -#line 40241 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40246 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2722: -#line 15440 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15445 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; lex->mqh.max_statement_time= (yyvsp[0].item_num)->val_real(); lex->mqh.specified_limits|= USER_RESOURCES::MAX_STATEMENT_TIME; } -#line 40251 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40256 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2723: -#line 15449 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15454 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; lex->sql_command = SQLCOM_BEGIN; lex->start_transaction_opt= 0; } -#line 40261 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40266 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2724: -#line 15454 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15459 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 40267 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40272 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2725: -#line 15459 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15464 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->sql_command= SQLCOM_COMPOUND; Lex->sphead->set_stmt_end(thd); Lex->sphead->restore_thd_mem_root(thd); } -#line 40277 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40282 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2726: -#line 15467 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15472 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num)= 0; } -#line 40283 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40288 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2727: -#line 15468 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15473 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num)= 1; } -#line 40289 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40294 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2728: -#line 15472 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15477 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 40295 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40300 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2729: -#line 15473 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15478 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 40301 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40306 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2730: -#line 15478 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15483 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.m_yes_no_unk)= TVL_UNKNOWN; } -#line 40307 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40312 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2731: -#line 15479 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15484 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.m_yes_no_unk)= TVL_NO; } -#line 40313 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40318 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2732: -#line 15480 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15485 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.m_yes_no_unk)= TVL_YES; } -#line 40319 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40324 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2733: -#line 15485 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15490 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.m_yes_no_unk)= TVL_UNKNOWN; } -#line 40325 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40330 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2734: -#line 15486 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15491 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.m_yes_no_unk)= TVL_YES; } -#line 40331 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40336 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2735: -#line 15487 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15492 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.m_yes_no_unk)= TVL_NO; } -#line 40337 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40342 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2736: -#line 15491 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15496 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 40343 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40348 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2737: -#line 15492 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15497 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 40349 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40354 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2738: -#line 15497 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15502 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; lex->sql_command= SQLCOM_COMMIT; @@ -40358,11 +40363,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); lex->tx_chain= (yyvsp[-1].m_yes_no_unk); lex->tx_release= (yyvsp[0].m_yes_no_unk); } -#line 40362 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40367 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2739: -#line 15509 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15514 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; lex->sql_command= SQLCOM_ROLLBACK; @@ -40371,56 +40376,56 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); lex->tx_chain= (yyvsp[-1].m_yes_no_unk); lex->tx_release= (yyvsp[0].m_yes_no_unk); } -#line 40375 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40380 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2740: -#line 15519 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15524 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; lex->sql_command= SQLCOM_ROLLBACK_TO_SAVEPOINT; lex->ident= (yyvsp[0].lex_str); } -#line 40385 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40390 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2741: -#line 15528 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15533 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; lex->sql_command= SQLCOM_SAVEPOINT; lex->ident= (yyvsp[0].lex_str); } -#line 40395 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40400 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2742: -#line 15537 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15542 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; lex->sql_command= SQLCOM_RELEASE_SAVEPOINT; lex->ident= (yyvsp[0].lex_str); } -#line 40405 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40410 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2743: -#line 15550 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15555 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 40411 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40416 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2745: -#line 15556 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15561 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (add_select_to_union_list(Lex, (bool)(yyvsp[0].num), TRUE)) MYSQL_YYABORT; } -#line 40420 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40425 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2746: -#line 15561 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15566 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { /* Remove from the name resolution context stack the context of the @@ -40428,29 +40433,29 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); */ Lex->pop_context(); } -#line 40432 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40437 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2748: -#line 15572 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15577 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num)= 1; } -#line 40438 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40443 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2749: -#line 15576 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15581 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num)= 0; } -#line 40444 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40449 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2750: -#line 15577 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15582 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num)= 1; } -#line 40450 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40455 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2751: -#line 15581 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15586 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= thd->lex; DBUG_ASSERT(lex->current_select->linkage != GLOBAL_OPTIONS_TYPE); @@ -40464,80 +40469,80 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } thd->where= "global ORDER clause"; } -#line 40468 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40473 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2752: -#line 15595 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15600 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { thd->lex->current_select->no_table_names_allowed= 0; thd->where= ""; } -#line 40477 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40482 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2755: -#line 15607 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15612 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num)=1; } -#line 40483 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40488 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2756: -#line 15608 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15613 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num)=1; } -#line 40489 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40494 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2757: -#line 15609 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15614 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num)=0; } -#line 40495 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40500 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2758: -#line 15615 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15620 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.select_lex)= Lex->current_select->master_unit()->first_select(); } -#line 40503 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40508 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2759: -#line 15620 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15625 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.select_lex)= Lex->current_select->master_unit()->first_select(); } -#line 40511 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40516 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2761: -#line 15629 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15634 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (add_select_to_union_list(Lex, (bool)(yyvsp[0].num), FALSE)) MYSQL_YYABORT; } -#line 40520 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40525 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2762: -#line 15634 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15639 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->pop_context(); (yyval.select_lex)= (yyvsp[-4].select_lex); } -#line 40529 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40534 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2763: -#line 15643 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15648 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.select_lex)= (yyvsp[-1].select_lex); } -#line 40537 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40542 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2764: -#line 15649 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15654 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; if (!lex->expr_allows_subselect || @@ -40556,11 +40561,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); if (mysql_new_select(Lex, 1)) MYSQL_YYABORT; } -#line 40560 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40565 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2765: -#line 15670 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15675 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; @@ -40583,17 +40588,17 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); lex->current_select->select_n_having_items+= child->select_n_having_items; } -#line 40587 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40592 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2770: -#line 15705 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15710 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Select->options|= SELECT_STRAIGHT_JOIN; } -#line 40593 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40598 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2771: -#line 15707 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15712 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (check_simple_select()) MYSQL_YYABORT; @@ -40601,73 +40606,73 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); YYPS->m_mdl_type= MDL_SHARED_READ; Select->options|= SELECT_HIGH_PRIORITY; } -#line 40605 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40610 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2772: -#line 15714 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15719 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Select->options|= SELECT_DISTINCT; } -#line 40611 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40616 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2773: -#line 15715 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15720 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Select->options|= SELECT_SMALL_RESULT; } -#line 40617 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40622 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2774: -#line 15716 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15721 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Select->options|= SELECT_BIG_RESULT; } -#line 40623 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40628 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2775: -#line 15718 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15723 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (check_simple_select()) MYSQL_YYABORT; Select->options|= OPTION_BUFFER_RESULT; } -#line 40633 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40638 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2776: -#line 15724 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15729 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (check_simple_select()) MYSQL_YYABORT; Select->options|= OPTION_FOUND_ROWS; } -#line 40643 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40648 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2777: -#line 15729 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15734 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Select->options|= SELECT_ALL; } -#line 40649 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40654 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2778: -#line 15740 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15745 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 40655 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40660 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2779: -#line 15742 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15747 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 40661 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40666 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2780: -#line 15744 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15749 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 40667 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40672 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2794: -#line 15777 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15782 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { /* We have to distinguish missing DEFINER-clause from case when @@ -40678,58 +40683,58 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); */ thd->lex->definer= 0; } -#line 40682 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40687 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2795: -#line 15791 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15796 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->definer= (yyvsp[0].lex_user); Lex->ssl_type= SSL_TYPE_NOT_SPECIFIED; Lex->ssl_cipher= Lex->x509_subject= Lex->x509_issuer= 0; bzero(&(Lex->mqh), sizeof(Lex->mqh)); } -#line 40693 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40698 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2796: -#line 15807 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15812 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->create_view_algorithm= DTYPE_ALGORITHM_UNDEFINED; } -#line 40699 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40704 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2797: -#line 15809 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15814 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->create_view_algorithm= VIEW_ALGORITHM_MERGE; } -#line 40705 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40710 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2798: -#line 15811 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15816 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->create_view_algorithm= VIEW_ALGORITHM_TMPTABLE; } -#line 40711 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40716 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2799: -#line 15816 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15821 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->create_view_suid= VIEW_SUID_DEFAULT; } -#line 40717 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40722 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2800: -#line 15818 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15823 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->create_view_suid= VIEW_SUID_DEFINER; } -#line 40723 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40728 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2801: -#line 15820 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15825 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->create_view_suid= VIEW_SUID_INVOKER; } -#line 40729 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40734 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2802: -#line 15825 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15830 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= thd->lex; if (lex->add_create_options_with_check((yyvsp[-1].object_ddl_options))) @@ -40743,37 +40748,37 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); MYSQL_YYABORT; lex->query_tables->open_strategy= TABLE_LIST::OPEN_STUB; } -#line 40747 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40752 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2804: -#line 15843 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15848 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 40753 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40758 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2806: -#line 15849 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15854 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->view_list.push_back((LEX_STRING*) thd->memdup(&(yyvsp[0].lex_str), sizeof(LEX_STRING)), thd->mem_root); } -#line 40763 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40768 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2807: -#line 15855 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15860 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->view_list.push_back((LEX_STRING*) thd->memdup(&(yyvsp[0].lex_str), sizeof(LEX_STRING)), thd->mem_root); } -#line 40773 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40778 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2808: -#line 15863 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15868 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; lex->parsing_options.allows_variable= FALSE; @@ -40782,11 +40787,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); lex->parsing_options.allows_derived= FALSE; lex->create_view_select.str= (char *) YYLIP->get_cpp_ptr(); } -#line 40786 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40791 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2809: -#line 15872 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15877 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; uint len= YYLIP->get_cpp_ptr() - lex->create_view_select.str; @@ -40799,60 +40804,60 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); lex->parsing_options.allows_select_procedure= TRUE; lex->parsing_options.allows_derived= TRUE; } -#line 40803 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40808 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2812: -#line 15893 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15898 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->create_view_check= VIEW_CHECK_NONE; } -#line 40809 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40814 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2813: -#line 15895 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15900 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->create_view_check= VIEW_CHECK_CASCADED; } -#line 40815 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40820 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2814: -#line 15897 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15902 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->create_view_check= VIEW_CHECK_CASCADED; } -#line 40821 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40826 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2815: -#line 15899 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15904 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->create_view_check= VIEW_CHECK_LOCAL; } -#line 40827 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40832 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2816: -#line 15912 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15917 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (Lex->add_create_options_with_check((yyvsp[0].object_ddl_options))) MYSQL_YYABORT; } -#line 40836 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40841 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2817: -#line 15921 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15926 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { /* $10 */ Lex->raw_trg_on_table_name_begin= YYLIP->get_tok_start(); } -#line 40844 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40849 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2818: -#line 15927 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15932 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { /* $14 */ Lex->raw_trg_on_table_name_end= YYLIP->get_tok_start(); } -#line 40852 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40857 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2819: -#line 15932 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15937 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { /* $17 */ LEX *lex= thd->lex; Lex_input_stream *lip= YYLIP; @@ -40870,11 +40875,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); lex->sphead->set_body_start(thd, lip->get_cpp_ptr()); } -#line 40874 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40879 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2820: -#line 15950 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15955 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { /* $19 */ LEX *lex= Lex; sp_head *sp= lex->sphead; @@ -40898,23 +40903,23 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); MDL_SHARED_NO_WRITE)) MYSQL_YYABORT; } -#line 40902 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40907 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2821: -#line 15982 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15987 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { thd->lex->udf.type= UDFTYPE_AGGREGATE; } -#line 40908 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40913 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2822: -#line 15983 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15988 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { thd->lex->udf.type= UDFTYPE_FUNCTION; } -#line 40914 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40919 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2823: -#line 15989 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 15994 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= thd->lex; if (lex->add_create_options_with_check((yyvsp[-5].object_ddl_options))) @@ -40926,11 +40931,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); lex->udf.returns= (Item_result) (yyvsp[-2].num); lex->udf.dl= (yyvsp[0].lex_str).str; } -#line 40930 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40935 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2824: -#line 16007 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 16012 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { /* $5 */ LEX *lex= Lex; Lex_input_stream *lip= YYLIP; @@ -40950,50 +40955,50 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); tmp_param_begin++; lex->sphead->m_param_begin= tmp_param_begin; } -#line 40954 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40959 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2825: -#line 16028 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 16033 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { /* $8 */ Lex->sphead->m_param_end= YYLIP->get_cpp_tok_start(); } -#line 40962 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40967 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2826: -#line 16032 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 16037 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { /* $10 */ LEX *lex= Lex; lex->init_last_field(&lex->sphead->m_return_field_def, NULL, thd->variables.collation_database); } -#line 40972 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40977 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2827: -#line 16038 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 16043 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { /* $12 */ if (Lex->sphead->fill_field_definition(thd, Lex, (yyvsp[0].field_type), Lex->last_field)) MYSQL_YYABORT; } -#line 40982 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40987 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2828: -#line 16044 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 16049 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { /* $14 */ LEX *lex= thd->lex; Lex_input_stream *lip= YYLIP; lex->sphead->set_body_start(thd, lip->get_cpp_tok_start()); } -#line 40993 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40998 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2829: -#line 16051 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 16056 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= thd->lex; sp_head *sp= lex->sphead; @@ -41042,11 +41047,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } sp->restore_thd_mem_root(thd); } -#line 41046 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 41051 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2830: -#line 16103 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 16108 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (Lex->add_create_options_with_check((yyvsp[-1].object_ddl_options))) MYSQL_YYABORT; @@ -41058,11 +41063,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); MYSQL_YYABORT; Lex->spname= (yyvsp[0].spname); } -#line 41062 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 41067 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2831: -#line 16115 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 16120 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { const char* tmp_param_begin; @@ -41070,27 +41075,27 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); tmp_param_begin++; Lex->sphead->m_param_begin= tmp_param_begin; } -#line 41074 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 41079 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2832: -#line 16124 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 16129 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->sphead->m_param_end= YYLIP->get_cpp_tok_start(); } -#line 41082 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 41087 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2833: -#line 16128 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 16133 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->sphead->set_body_start(thd, YYLIP->get_cpp_tok_start()); } -#line 41090 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 41095 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2834: -#line 16132 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 16137 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; sp_head *sp= lex->sphead; @@ -41099,209 +41104,209 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); lex->sql_command= SQLCOM_CREATE_PROCEDURE; sp->restore_thd_mem_root(thd); } -#line 41103 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 41108 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2835: -#line 16146 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 16151 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->sql_command = SQLCOM_XA_START; } -#line 41111 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 41116 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2836: -#line 16150 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 16155 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->sql_command = SQLCOM_XA_END; } -#line 41119 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 41124 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2837: -#line 16154 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 16159 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->sql_command = SQLCOM_XA_PREPARE; } -#line 41127 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 41132 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2838: -#line 16158 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 16163 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->sql_command = SQLCOM_XA_COMMIT; } -#line 41135 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 41140 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2839: -#line 16162 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 16167 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->sql_command = SQLCOM_XA_ROLLBACK; } -#line 41143 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 41148 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2840: -#line 16166 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 16171 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->sql_command = SQLCOM_XA_RECOVER; } -#line 41151 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 41156 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2841: -#line 16173 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 16178 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { MYSQL_YYABORT_UNLESS((yyvsp[0].string)->length() <= MAXGTRIDSIZE); if (!(Lex->xid=(XID *)thd->alloc(sizeof(XID)))) MYSQL_YYABORT; Lex->xid->set(1L, (yyvsp[0].string)->ptr(), (yyvsp[0].string)->length(), 0, 0); } -#line 41162 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 41167 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2842: -#line 16180 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 16185 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { MYSQL_YYABORT_UNLESS((yyvsp[-2].string)->length() <= MAXGTRIDSIZE && (yyvsp[0].string)->length() <= MAXBQUALSIZE); if (!(Lex->xid=(XID *)thd->alloc(sizeof(XID)))) MYSQL_YYABORT; Lex->xid->set(1L, (yyvsp[-2].string)->ptr(), (yyvsp[-2].string)->length(), (yyvsp[0].string)->ptr(), (yyvsp[0].string)->length()); } -#line 41173 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 41178 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2843: -#line 16187 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 16192 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { MYSQL_YYABORT_UNLESS((yyvsp[-4].string)->length() <= MAXGTRIDSIZE && (yyvsp[-2].string)->length() <= MAXBQUALSIZE); if (!(Lex->xid=(XID *)thd->alloc(sizeof(XID)))) MYSQL_YYABORT; Lex->xid->set((yyvsp[0].ulong_num), (yyvsp[-4].string)->ptr(), (yyvsp[-4].string)->length(), (yyvsp[-2].string)->ptr(), (yyvsp[-2].string)->length()); } -#line 41184 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 41189 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2844: -#line 16196 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 16201 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 41190 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 41195 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2845: -#line 16197 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 16202 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 41196 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 41201 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2846: -#line 16201 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 16206 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->xa_opt=XA_NONE; } -#line 41202 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 41207 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2847: -#line 16202 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 16207 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->xa_opt=XA_JOIN; } -#line 41208 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 41213 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2848: -#line 16203 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 16208 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->xa_opt=XA_RESUME; } -#line 41214 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 41219 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2849: -#line 16207 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 16212 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->xa_opt=XA_NONE; } -#line 41220 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 41225 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2850: -#line 16208 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 16213 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->xa_opt=XA_ONE_PHASE; } -#line 41226 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 41231 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2851: -#line 16213 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 16218 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->xa_opt=XA_NONE; } -#line 41232 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 41237 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2852: -#line 16215 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 16220 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->xa_opt=XA_SUSPEND; } -#line 41238 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 41243 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2854: -#line 16220 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 16225 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 41244 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 41249 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2855: -#line 16221 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 16226 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->xa_opt=XA_FOR_MIGRATE; } -#line 41250 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 41255 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2856: -#line 16226 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 16231 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; lex->sql_command= SQLCOM_INSTALL_PLUGIN; lex->comment= (yyvsp[-2].lex_str); lex->ident= (yyvsp[0].lex_str); } -#line 41261 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 41266 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2857: -#line 16233 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 16238 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; lex->sql_command= SQLCOM_INSTALL_PLUGIN; lex->comment= null_lex_str; lex->ident= (yyvsp[0].lex_str); } -#line 41272 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 41277 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2858: -#line 16243 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 16248 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; lex->sql_command= SQLCOM_UNINSTALL_PLUGIN; lex->comment= (yyvsp[0].lex_str); } -#line 41282 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 41287 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2859: -#line 16249 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 16254 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; lex->sql_command= SQLCOM_UNINSTALL_PLUGIN; lex->comment= null_lex_str; lex->ident= (yyvsp[0].lex_str); } -#line 41293 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 41298 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2860: -#line 16260 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 16265 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { YYERROR; } -#line 41301 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 41306 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; -#line 41305 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 41310 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ default: break; } /* User semantic actions sometimes alter yychar, and that requires diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 1d380ce0c..fcfc63439 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -14503,6 +14503,11 @@ option_value_no_option_type: | '@' '@' opt_var_ident_type internal_variable_name equal set_expr_or_default { struct sys_var_with_base tmp= $4; + if (tmp.var == trg_new_row_fake_var) + { + my_error(ER_UNKNOWN_SYSTEM_VARIABLE, MYF(0), "NEW"); + MYSQL_YYABORT; + } /* Lookup if necessary: must be a system variable. */ if (tmp.var == NULL) { diff --git a/sql/sys_vars.cc b/sql/sys_vars.cc index 303633939..5470acc78 100644 --- a/sql/sys_vars.cc +++ b/sql/sys_vars.cc @@ -1,5 +1,5 @@ /* Copyright (c) 2002, 2015, Oracle and/or its affiliates. - Copyright (c) 2012, 2015, MariaDB + Copyright (c) 2012, 2018, MariaDB 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 @@ -428,7 +428,7 @@ error_if_in_trans_or_substatement(THD *thd, int in_substatement_error, return false; } -static bool check_has_super(sys_var *self, THD *thd, set_var *var) +bool check_has_super(sys_var *self, THD *thd, set_var *var) { DBUG_ASSERT(self->scope() != sys_var::GLOBAL);// don't abuse check_has_super() #ifndef NO_EMBEDDED_ACCESS_CHECKS @@ -1387,7 +1387,7 @@ static bool fix_max_connections(sys_var *self, THD *thd, enum_var_type type) static Sys_var_ulong Sys_max_connections( "max_connections", "The number of simultaneous clients allowed", PARSED_EARLY GLOBAL_VAR(max_connections), CMD_LINE(REQUIRED_ARG), - VALID_RANGE(1, 100000), + VALID_RANGE(10, 100000), DEFAULT(MAX_CONNECTIONS_DEFAULT), BLOCK_SIZE(1), NO_MUTEX_GUARD, NOT_IN_BINLOG, ON_CHECK(0), ON_UPDATE(fix_max_connections)); @@ -2111,11 +2111,11 @@ static Sys_var_ulong Sys_max_long_data_size( BLOCK_SIZE(1)); static PolyLock_mutex PLock_prepared_stmt_count(&LOCK_prepared_stmt_count); -static Sys_var_ulong Sys_max_prepared_stmt_count( +static Sys_var_uint Sys_max_prepared_stmt_count( "max_prepared_stmt_count", "Maximum number of prepared statements in the server", GLOBAL_VAR(max_prepared_stmt_count), CMD_LINE(REQUIRED_ARG), - VALID_RANGE(0, 1024*1024), DEFAULT(16382), BLOCK_SIZE(1), + VALID_RANGE(0, UINT_MAX32), DEFAULT(16382), BLOCK_SIZE(1), &PLock_prepared_stmt_count); static Sys_var_ulong Sys_max_sort_length( @@ -3192,7 +3192,7 @@ static bool fix_table_open_cache(sys_var *, THD *, enum_var_type) static Sys_var_ulong Sys_table_cache_size( "table_open_cache", "The number of cached open tables", GLOBAL_VAR(tc_size), CMD_LINE(REQUIRED_ARG), - VALID_RANGE(1, 1024*1024), DEFAULT(TABLE_OPEN_CACHE_DEFAULT), + VALID_RANGE(10, 1024*1024), DEFAULT(TABLE_OPEN_CACHE_DEFAULT), BLOCK_SIZE(1), NO_MUTEX_GUARD, NOT_IN_BINLOG, ON_CHECK(0), ON_UPDATE(fix_table_open_cache)); @@ -4967,6 +4967,14 @@ static Sys_var_mybool Sys_wsrep_desync ( ON_CHECK(wsrep_desync_check), ON_UPDATE(wsrep_desync_update)); +static const char *wsrep_reject_queries_names[]= { "NONE", "ALL", "ALL_KILL", NullS }; +static Sys_var_enum Sys_wsrep_reject_queries( + "wsrep_reject_queries", "Variable to set to reject queries", + GLOBAL_VAR(wsrep_reject_queries), CMD_LINE(OPT_ARG), + wsrep_reject_queries_names, DEFAULT(WSREP_REJECT_NONE), + NO_MUTEX_GUARD, NOT_IN_BINLOG, ON_CHECK(0), + ON_UPDATE(wsrep_reject_queries_update)); + static const char *wsrep_binlog_format_names[]= {"MIXED", "STATEMENT", "ROW", "NONE", NullS}; static Sys_var_enum Sys_wsrep_forced_binlog_format( diff --git a/sql/table.cc b/sql/table.cc index ea0bc8f5c..4407d631d 100644 --- a/sql/table.cc +++ b/sql/table.cc @@ -1,5 +1,5 @@ -/* Copyright (c) 2000, 2015, Oracle and/or its affiliates. - Copyright (c) 2008, 2015, MariaDB +/* Copyright (c) 2000, 2017, Oracle and/or its affiliates. + Copyright (c) 2008, 2018, MariaDB 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 @@ -2233,6 +2233,9 @@ int TABLE_SHARE::init_from_sql_statement_string(THD *thd, bool write, goto ret; thd->lex->create_info.db_type= hton; +#ifdef WITH_PARTITION_STORAGE_ENGINE + thd->work_part_info= 0; // For partitioning +#endif if (tabledef_version.str) thd->lex->create_info.tabledef_version= tabledef_version; @@ -3734,7 +3737,7 @@ Table_check_intact::check(TABLE *table, const TABLE_FIELD_DEF *table_def) /* Whether the table definition has already been validated. */ if (table->s->table_field_def_cache == table_def) - DBUG_RETURN(FALSE); + goto end; if (table->s->fields != table_def->count) { @@ -3898,6 +3901,16 @@ Table_check_intact::check(TABLE *table, const TABLE_FIELD_DEF *table_def) if (! error) table->s->table_field_def_cache= table_def; +end: + + if (has_keys && !error && !table->key_info) + { + report_error(0, "Incorrect definition of table %s.%s: " + "indexes are missing", + table->s->db.str, table->alias.c_ptr()); + error= TRUE; + } + DBUG_RETURN(error); } @@ -5415,6 +5428,8 @@ Item *create_view_field(THD *thd, TABLE_LIST *view, Item **field_ref, Item_direct_view_ref(thd, &view->view->select_lex.context, field_ref, view->alias, name, view)); + if (!item) + return NULL; /* Force creation of nullable item for the result tmp table for outer joined views/derived tables. @@ -7345,7 +7360,15 @@ int TABLE_LIST::fetch_number_of_rows() { int error= 0; if (jtbm_subselect) + { + if (jtbm_subselect->is_jtbm_merged) + { + table->file->stats.records= jtbm_subselect->jtbm_record_count; + set_if_bigger(table->file->stats.records, 2); + table->used_stat_records= table->file->stats.records; + } return 0; + } if (is_materialized_derived() && !fill_me) { diff --git a/sql/table.h b/sql/table.h index 5abb99cd0..bf9b55089 100644 --- a/sql/table.h +++ b/sql/table.h @@ -1,7 +1,7 @@ #ifndef TABLE_INCLUDED #define TABLE_INCLUDED -/* Copyright (c) 2000, 2013, Oracle and/or its affiliates. - Copyright (c) 2009, 2014, SkySQL Ab. +/* Copyright (c) 2000, 2017, Oracle and/or its affiliates. + Copyright (c) 2009, 2018, MariaDB 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 @@ -513,10 +513,11 @@ typedef struct st_table_field_def class Table_check_intact { protected: + bool has_keys; virtual void report_error(uint code, const char *fmt, ...)= 0; public: - Table_check_intact() {} + Table_check_intact(bool keys= false) : has_keys(keys) {} virtual ~Table_check_intact() {} /** Checks whether a table is intact. */ @@ -531,6 +532,8 @@ class Table_check_intact_log_error : public Table_check_intact { protected: void report_error(uint, const char *fmt, ...); +public: + Table_check_intact_log_error() : Table_check_intact(true) {} }; @@ -2305,6 +2308,7 @@ struct TABLE_LIST DBUG_PRINT("enter", ("Alias: '%s' Unit: %p", (alias ? alias : ""), get_unit())); + derived= get_unit(); derived_type= ((derived_type & (derived ? DTYPE_MASK : DTYPE_VIEW)) | DTYPE_TABLE | DTYPE_MATERIALIZE); set_check_materialized(); diff --git a/sql/tztime.cc b/sql/tztime.cc index bed5f416f..7df2ad7d0 100644 --- a/sql/tztime.cc +++ b/sql/tztime.cc @@ -2689,9 +2689,7 @@ main(int argc, char **argv) char **default_argv; MY_INIT(argv[0]); - if (load_defaults("my",load_default_groups,&argc,&argv)) - exit(1); - + load_defaults_or_exit("my", load_default_groups, &argc, &argv); default_argv= argv; if ((handle_options(&argc, &argv, my_long_options, get_one_option))) diff --git a/sql/wsrep_applier.cc b/sql/wsrep_applier.cc index e5c95780d..723804c76 100644 --- a/sql/wsrep_applier.cc +++ b/sql/wsrep_applier.cc @@ -98,11 +98,11 @@ static wsrep_cb_status_t wsrep_apply_events(THD* thd, DBUG_RETURN(WSREP_CB_FAILURE); } - mysql_mutex_lock(&thd->LOCK_wsrep_thd); + mysql_mutex_lock(&thd->LOCK_thd_data); thd->wsrep_query_state= QUERY_EXEC; if (thd->wsrep_conflict_state!= REPLAYING) thd->wsrep_conflict_state= NO_CONFLICT; - mysql_mutex_unlock(&thd->LOCK_wsrep_thd); + mysql_mutex_unlock(&thd->LOCK_thd_data); if (!buf_len) WSREP_DEBUG("empty rbr buffer to apply: %lld", (long long) wsrep_thd_trx_seqno(thd)); @@ -197,9 +197,9 @@ static wsrep_cb_status_t wsrep_apply_events(THD* thd, } error: - mysql_mutex_lock(&thd->LOCK_wsrep_thd); + mysql_mutex_lock(&thd->LOCK_thd_data); thd->wsrep_query_state= QUERY_IDLE; - mysql_mutex_unlock(&thd->LOCK_wsrep_thd); + mysql_mutex_unlock(&thd->LOCK_thd_data); assert(thd->wsrep_exec_mode== REPL_RECV); diff --git a/sql/wsrep_check_opts.cc b/sql/wsrep_check_opts.cc index 690c1a4b2..28bd3a449 100644 --- a/sql/wsrep_check_opts.cc +++ b/sql/wsrep_check_opts.cc @@ -51,7 +51,7 @@ int wsrep_check_opts() (!strcasecmp(my_bind_addr_str, "127.0.0.1") || !strcasecmp(my_bind_addr_str, "localhost"))) { - WSREP_ERROR("wsrep_sst_method is set to 'mysqldump' yet " + WSREP_WARN("wsrep_sst_method is set to 'mysqldump' yet " "mysqld bind_address is set to '%s', which makes it " "impossible to receive state transfer from another " "node, since mysqld won't accept such connections. " @@ -59,7 +59,6 @@ int wsrep_check_opts() "set bind_address to allow mysql client connections " "from other cluster members (e.g. 0.0.0.0).", my_bind_addr_str); - return 1; } } else diff --git a/sql/wsrep_hton.cc b/sql/wsrep_hton.cc index 75c1526cb..e5c754a9d 100644 --- a/sql/wsrep_hton.cc +++ b/sql/wsrep_hton.cc @@ -117,10 +117,10 @@ void wsrep_post_commit(THD* thd, bool all) switch (thd->wsrep_exec_mode) { - case LOCAL_COMMIT: + case LOCAL_COMMIT: { DBUG_ASSERT(thd->wsrep_trx_meta.gtid.seqno != WSREP_SEQNO_UNDEFINED); - if (wsrep->post_commit(wsrep, &thd->wsrep_ws_handle)) + if (wsrep && wsrep->post_commit(wsrep, &thd->wsrep_ws_handle)) { DBUG_PRINT("wsrep", ("set committed fail")); WSREP_WARN("set committed fail: %llu %d", @@ -129,18 +129,30 @@ void wsrep_post_commit(THD* thd, bool all) wsrep_cleanup_transaction(thd); break; } - case LOCAL_STATE: - { - /* - Non-InnoDB statements may have populated events in stmt cache => cleanup - */ - WSREP_DEBUG("cleanup transaction for LOCAL_STATE: %s", thd->query()); - wsrep_cleanup_transaction(thd); - break; - } - default: break; + case LOCAL_STATE: + { + /* non-InnoDB statements may have populated events in stmt cache + => cleanup + */ + WSREP_DEBUG("cleanup transaction for LOCAL_STATE"); + /* + Run post-rollback hook to clean up in the case if + some keys were populated for the transaction in provider + but during commit time there was no write set to replicate. + This may happen when client sets the SAVEPOINT and immediately + rolls back to savepoint after first operation. + */ + if (all && thd->wsrep_conflict_state != MUST_REPLAY && + wsrep && wsrep->post_rollback(wsrep, &thd->wsrep_ws_handle)) + { + WSREP_WARN("post_rollback fail: %llu %d", + (long long)thd->thread_id, thd->get_stmt_da()->status()); + } + wsrep_cleanup_transaction(thd); + break; + } + default: break; } - } /* @@ -238,12 +250,12 @@ static int wsrep_rollback(handlerton *hton, THD *thd, bool all) DBUG_RETURN(0); } - mysql_mutex_lock(&thd->LOCK_wsrep_thd); + mysql_mutex_lock(&thd->LOCK_thd_data); switch (thd->wsrep_exec_mode) { case TOTAL_ORDER: case REPL_RECV: - mysql_mutex_unlock(&thd->LOCK_wsrep_thd); + mysql_mutex_unlock(&thd->LOCK_thd_data); WSREP_DEBUG("Avoiding wsrep rollback for failed DDL: %s", thd->query()); DBUG_RETURN(0); default: break; @@ -252,7 +264,7 @@ static int wsrep_rollback(handlerton *hton, THD *thd, bool all) if ((all || !thd_test_options(thd, OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN)) && (thd->variables.wsrep_on && thd->wsrep_conflict_state != MUST_REPLAY)) { - if (wsrep->post_rollback(wsrep, &thd->wsrep_ws_handle)) + if (wsrep && wsrep->post_rollback(wsrep, &thd->wsrep_ws_handle)) { DBUG_PRINT("wsrep", ("setting rollback fail")); WSREP_ERROR("settting rollback fail: thd: %llu, schema: %s, SQL: %s", @@ -261,7 +273,7 @@ static int wsrep_rollback(handlerton *hton, THD *thd, bool all) } wsrep_cleanup_transaction(thd); } - mysql_mutex_unlock(&thd->LOCK_wsrep_thd); + mysql_mutex_unlock(&thd->LOCK_thd_data); DBUG_RETURN(0); } @@ -274,7 +286,7 @@ int wsrep_commit(handlerton *hton, THD *thd, bool all) DBUG_RETURN(0); } - mysql_mutex_lock(&thd->LOCK_wsrep_thd); + mysql_mutex_lock(&thd->LOCK_thd_data); if ((all || !thd_test_options(thd, OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN)) && (thd->variables.wsrep_on && thd->wsrep_conflict_state != MUST_REPLAY)) { @@ -294,7 +306,7 @@ int wsrep_commit(handlerton *hton, THD *thd, bool all) possible changes to clean state. */ if (WSREP_PROVIDER_EXISTS) { - if (wsrep->post_rollback(wsrep, &thd->wsrep_ws_handle)) + if (wsrep && wsrep->post_rollback(wsrep, &thd->wsrep_ws_handle)) { DBUG_PRINT("wsrep", ("setting rollback fail")); WSREP_ERROR("settting rollback fail: thd: %llu, schema: %s, SQL: %s", @@ -305,7 +317,7 @@ int wsrep_commit(handlerton *hton, THD *thd, bool all) wsrep_cleanup_transaction(thd); } } - mysql_mutex_unlock(&thd->LOCK_wsrep_thd); + mysql_mutex_unlock(&thd->LOCK_thd_data); DBUG_RETURN(0); } @@ -333,20 +345,20 @@ wsrep_run_wsrep_commit(THD *thd, bool all) if (thd->wsrep_exec_mode == REPL_RECV) { - mysql_mutex_lock(&thd->LOCK_wsrep_thd); + mysql_mutex_lock(&thd->LOCK_thd_data); if (thd->wsrep_conflict_state == MUST_ABORT) { if (wsrep_debug) WSREP_INFO("WSREP: must abort for BF"); DBUG_PRINT("wsrep", ("BF apply commit fail")); thd->wsrep_conflict_state = NO_CONFLICT; - mysql_mutex_unlock(&thd->LOCK_wsrep_thd); + mysql_mutex_unlock(&thd->LOCK_thd_data); // // TODO: test all calls of the rollback. // rollback must happen automagically innobase_rollback(hton, thd, 1); // DBUG_RETURN(WSREP_TRX_ERROR); } - mysql_mutex_unlock(&thd->LOCK_wsrep_thd); + mysql_mutex_unlock(&thd->LOCK_thd_data); } if (thd->wsrep_exec_mode != LOCAL_STATE) DBUG_RETURN(WSREP_TRX_OK); @@ -358,11 +370,11 @@ wsrep_run_wsrep_commit(THD *thd, bool all) DBUG_PRINT("wsrep", ("replicating commit")); - mysql_mutex_lock(&thd->LOCK_wsrep_thd); + mysql_mutex_lock(&thd->LOCK_thd_data); if (thd->wsrep_conflict_state == MUST_ABORT) { DBUG_PRINT("wsrep", ("replicate commit fail")); thd->wsrep_conflict_state = ABORTED; - mysql_mutex_unlock(&thd->LOCK_wsrep_thd); + mysql_mutex_unlock(&thd->LOCK_thd_data); if (wsrep_debug) { WSREP_INFO("innobase_commit, abort %s", (thd->query()) ? thd->query() : "void"); @@ -379,7 +391,7 @@ wsrep_run_wsrep_commit(THD *thd, bool all) { mysql_mutex_unlock(&LOCK_wsrep_replaying); - mysql_mutex_unlock(&thd->LOCK_wsrep_thd); + mysql_mutex_unlock(&thd->LOCK_thd_data); mysql_mutex_lock(&thd->mysys_var->mutex); thd_proc_info(thd, "wsrep waiting on replaying"); @@ -407,7 +419,7 @@ wsrep_run_wsrep_commit(THD *thd, bool all) thd->mysys_var->current_cond= 0; mysql_mutex_unlock(&thd->mysys_var->mutex); - mysql_mutex_lock(&thd->LOCK_wsrep_thd); + mysql_mutex_lock(&thd->LOCK_thd_data); mysql_mutex_lock(&LOCK_wsrep_replaying); } mysql_mutex_unlock(&LOCK_wsrep_replaying); @@ -415,14 +427,14 @@ wsrep_run_wsrep_commit(THD *thd, bool all) if (thd->wsrep_conflict_state == MUST_ABORT) { DBUG_PRINT("wsrep", ("replicate commit fail")); thd->wsrep_conflict_state = ABORTED; - mysql_mutex_unlock(&thd->LOCK_wsrep_thd); + mysql_mutex_unlock(&thd->LOCK_thd_data); WSREP_DEBUG("innobase_commit abort after replaying wait %s", (thd->query()) ? thd->query() : "void"); DBUG_RETURN(WSREP_TRX_CERT_FAIL); } thd->wsrep_query_state = QUERY_COMMITTING; - mysql_mutex_unlock(&thd->LOCK_wsrep_thd); + mysql_mutex_unlock(&thd->LOCK_thd_data); cache = get_trans_log(thd); rcode = 0; @@ -471,7 +483,7 @@ wsrep_run_wsrep_commit(THD *thd, bool all) } else if (!rcode) { - if (WSREP_OK == rcode) + if (WSREP_OK == rcode && wsrep) rcode = wsrep->pre_commit(wsrep, (wsrep_conn_id_t)thd->thread_id, &thd->wsrep_ws_handle, @@ -487,10 +499,10 @@ wsrep_run_wsrep_commit(THD *thd, bool all) } else if (rcode == WSREP_BF_ABORT) { WSREP_DEBUG("thd %lu seqno %lld BF aborted by provider, will replay", thd->thread_id, (long long)thd->wsrep_trx_meta.gtid.seqno); - mysql_mutex_lock(&thd->LOCK_wsrep_thd); + mysql_mutex_lock(&thd->LOCK_thd_data); thd->wsrep_conflict_state = MUST_REPLAY; DBUG_ASSERT(wsrep_thd_trx_seqno(thd) > 0); - mysql_mutex_unlock(&thd->LOCK_wsrep_thd); + mysql_mutex_unlock(&thd->LOCK_thd_data); mysql_mutex_lock(&LOCK_wsrep_replaying); wsrep_replaying++; WSREP_DEBUG("replaying increased: %d, thd: %lu", @@ -504,7 +516,7 @@ wsrep_run_wsrep_commit(THD *thd, bool all) DBUG_RETURN(WSREP_TRX_ERROR); } - mysql_mutex_lock(&thd->LOCK_wsrep_thd); + mysql_mutex_lock(&thd->LOCK_thd_data); DEBUG_SYNC(thd, "wsrep_after_replication"); @@ -558,26 +570,26 @@ wsrep_run_wsrep_commit(THD *thd, bool all) WSREP_LOG_CONFLICT(NULL, thd, FALSE); } } - mysql_mutex_unlock(&thd->LOCK_wsrep_thd); + mysql_mutex_unlock(&thd->LOCK_thd_data); DBUG_RETURN(WSREP_TRX_CERT_FAIL); case WSREP_SIZE_EXCEEDED: WSREP_ERROR("transaction size exceeded"); - mysql_mutex_unlock(&thd->LOCK_wsrep_thd); + mysql_mutex_unlock(&thd->LOCK_thd_data); DBUG_RETURN(WSREP_TRX_SIZE_EXCEEDED); case WSREP_CONN_FAIL: WSREP_ERROR("connection failure"); - mysql_mutex_unlock(&thd->LOCK_wsrep_thd); + mysql_mutex_unlock(&thd->LOCK_thd_data); DBUG_RETURN(WSREP_TRX_ERROR); default: WSREP_ERROR("unknown connection failure"); - mysql_mutex_unlock(&thd->LOCK_wsrep_thd); + mysql_mutex_unlock(&thd->LOCK_thd_data); DBUG_RETURN(WSREP_TRX_ERROR); } thd->wsrep_query_state= QUERY_EXEC; - mysql_mutex_unlock(&thd->LOCK_wsrep_thd); + mysql_mutex_unlock(&thd->LOCK_thd_data); DBUG_RETURN(WSREP_TRX_OK); } diff --git a/sql/wsrep_mysqld.cc b/sql/wsrep_mysqld.cc index 285bb520b..b127d3a8f 100644 --- a/sql/wsrep_mysqld.cc +++ b/sql/wsrep_mysqld.cc @@ -13,6 +13,7 @@ along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA */ +#include // SHOW_MY_BOOL #include #include #include @@ -128,7 +129,7 @@ ulong wsrep_running_threads = 0; // # of currently running wsrep threads ulong my_bind_addr; #ifdef HAVE_PSI_INTERFACE -PSI_mutex_key key_LOCK_wsrep_rollback, key_LOCK_wsrep_thd, +PSI_mutex_key key_LOCK_wsrep_rollback, key_LOCK_wsrep_replaying, key_LOCK_wsrep_ready, key_LOCK_wsrep_sst, key_LOCK_wsrep_sst_thread, key_LOCK_wsrep_sst_init, key_LOCK_wsrep_slave_threads, key_LOCK_wsrep_desync, @@ -148,7 +149,6 @@ static PSI_mutex_info wsrep_mutexes[]= { &key_LOCK_wsrep_sst_init, "LOCK_wsrep_sst_init", PSI_FLAG_GLOBAL}, { &key_LOCK_wsrep_sst, "LOCK_wsrep_sst", PSI_FLAG_GLOBAL}, { &key_LOCK_wsrep_rollback, "LOCK_wsrep_rollback", PSI_FLAG_GLOBAL}, - { &key_LOCK_wsrep_thd, "THD::LOCK_wsrep_thd", 0}, { &key_LOCK_wsrep_replaying, "LOCK_wsrep_replaying", PSI_FLAG_GLOBAL}, { &key_LOCK_wsrep_slave_threads, "LOCK_wsrep_slave_threads", PSI_FLAG_GLOBAL}, { &key_LOCK_wsrep_desync, "LOCK_wsrep_desync", PSI_FLAG_GLOBAL}, @@ -289,8 +289,7 @@ wsrep_view_handler_cb (void* app_ctx, if (memcmp(&cluster_uuid, &view->state_id.uuid, sizeof(wsrep_uuid_t))) { - memcpy((wsrep_uuid_t*)&cluster_uuid, &view->state_id.uuid, - sizeof(cluster_uuid)); + memcpy(&cluster_uuid, &view->state_id.uuid, sizeof(cluster_uuid)); wsrep_uuid_print (&cluster_uuid, cluster_uuid_str, sizeof(cluster_uuid_str)); @@ -336,7 +335,7 @@ wsrep_view_handler_cb (void* app_ctx, // version change if (view->proto_ver != wsrep_protocol_version) { - my_bool wsrep_ready_saved= wsrep_ready; + my_bool wsrep_ready_saved= wsrep_ready_get(); wsrep_ready_set(FALSE); WSREP_INFO("closing client connections for " "protocol change %ld -> %d", @@ -369,7 +368,7 @@ wsrep_view_handler_cb (void* app_ctx, if (!wsrep_before_SE()) { WSREP_DEBUG("[debug]: closing client connections for PRIM"); - wsrep_close_client_connections(TRUE); + wsrep_close_client_connections(FALSE); } ssize_t const req_len= wsrep_sst_prepare (sst_req); @@ -451,16 +450,34 @@ wsrep_view_handler_cb (void* app_ctx, return WSREP_CB_SUCCESS; } -void wsrep_ready_set (my_bool x) +my_bool wsrep_ready_set (my_bool x) { WSREP_DEBUG("Setting wsrep_ready to %d", x); if (mysql_mutex_lock (&LOCK_wsrep_ready)) abort(); - if (wsrep_ready != x) + my_bool ret= (wsrep_ready != x); + if (ret) { wsrep_ready= x; mysql_cond_signal (&COND_wsrep_ready); } mysql_mutex_unlock (&LOCK_wsrep_ready); + return ret; +} + +my_bool wsrep_ready_get (void) +{ + if (mysql_mutex_lock (&LOCK_wsrep_ready)) abort(); + my_bool ret= wsrep_ready; + mysql_mutex_unlock (&LOCK_wsrep_ready); + return ret; +} + +int wsrep_show_ready(THD *thd, SHOW_VAR *var, char *buff) +{ + var->type= SHOW_MY_BOOL; + var->value= buff; + *((my_bool *)buff)= wsrep_ready_get(); + return 0; } // Wait until wsrep has reached ready state @@ -479,17 +496,8 @@ void wsrep_ready_wait () static void wsrep_synced_cb(void* app_ctx) { WSREP_INFO("Synchronized with group, ready for connections"); - bool signal_main= false; - if (mysql_mutex_lock (&LOCK_wsrep_ready)) abort(); - if (!wsrep_ready) - { - wsrep_ready= TRUE; - mysql_cond_signal (&COND_wsrep_ready); - signal_main= true; - - } + my_bool signal_main= wsrep_ready_set(TRUE); wsrep_config_state.set(WSREP_MEMBER_SYNCED); - mysql_mutex_unlock (&LOCK_wsrep_ready); if (signal_main) { @@ -961,6 +969,8 @@ bool wsrep_must_sync_wait (THD* thd, uint mask) { return (thd->variables.wsrep_sync_wait & mask) && thd->variables.wsrep_on && + !(thd->variables.wsrep_dirty_reads && + !is_update_query(thd->lex->sql_command)) && !thd->in_active_multi_stmt_transaction() && thd->wsrep_conflict_state != REPLAYING && thd->wsrep_sync_wait_gtid.seqno == WSREP_SEQNO_UNDEFINED; @@ -1008,17 +1018,7 @@ bool wsrep_sync_wait (THD* thd, uint mask) return false; } -/* - * Helpers to deal with TOI key arrays - */ -typedef struct wsrep_key_arr -{ - wsrep_key_t* keys; - size_t keys_len; -} wsrep_key_arr_t; - - -static void wsrep_keys_free(wsrep_key_arr_t* key_arr) +void wsrep_keys_free(wsrep_key_arr_t* key_arr) { for (size_t i= 0; i < key_arr->keys_len; ++i) { @@ -1083,11 +1083,11 @@ static bool wsrep_prepare_key_for_isolation(const char* db, } /* Prepare key list from db/table and table_list */ -static bool wsrep_prepare_keys_for_isolation(THD* thd, - const char* db, - const char* table, - const TABLE_LIST* table_list, - wsrep_key_arr_t* ka) +bool wsrep_prepare_keys_for_isolation(THD* thd, + const char* db, + const char* table, + const TABLE_LIST* table_list, + wsrep_key_arr_t* ka) { ka->keys= 0; ka->keys_len= 0; @@ -1659,7 +1659,7 @@ int wsrep_to_isolation_begin(THD *thd, char *db_, char *table_, if (thd->wsrep_exec_mode == REPL_RECV) return 0; - mysql_mutex_lock(&thd->LOCK_wsrep_thd); + mysql_mutex_lock(&thd->LOCK_thd_data); if (thd->wsrep_conflict_state == MUST_ABORT) { @@ -1667,10 +1667,10 @@ int wsrep_to_isolation_begin(THD *thd, char *db_, char *table_, thd->thread_id, (thd->db ? thd->db : "(null)"), thd->query()); - mysql_mutex_unlock(&thd->LOCK_wsrep_thd); + mysql_mutex_unlock(&thd->LOCK_thd_data); return WSREP_TRX_FAIL; } - mysql_mutex_unlock(&thd->LOCK_wsrep_thd); + mysql_mutex_unlock(&thd->LOCK_thd_data); DBUG_ASSERT(thd->wsrep_exec_mode == LOCAL_STATE); DBUG_ASSERT(thd->wsrep_trx_meta.gtid.seqno == WSREP_SEQNO_UNDEFINED); @@ -1786,23 +1786,23 @@ wsrep_grant_mdl_exception(MDL_context *requestor_ctx, const char* schema= key->db_name(); int schema_len= key->db_name_length(); - mysql_mutex_lock(&request_thd->LOCK_wsrep_thd); + mysql_mutex_lock(&request_thd->LOCK_thd_data); if (request_thd->wsrep_exec_mode == TOTAL_ORDER || request_thd->wsrep_exec_mode == REPL_RECV) { - mysql_mutex_unlock(&request_thd->LOCK_wsrep_thd); + mysql_mutex_unlock(&request_thd->LOCK_thd_data); WSREP_MDL_LOG(DEBUG, "MDL conflict ", schema, schema_len, request_thd, granted_thd); ticket->wsrep_report(wsrep_debug); - mysql_mutex_lock(&granted_thd->LOCK_wsrep_thd); + mysql_mutex_lock(&granted_thd->LOCK_thd_data); if (granted_thd->wsrep_exec_mode == TOTAL_ORDER || granted_thd->wsrep_exec_mode == REPL_RECV) { WSREP_MDL_LOG(INFO, "MDL BF-BF conflict", schema, schema_len, request_thd, granted_thd); ticket->wsrep_report(true); - mysql_mutex_unlock(&granted_thd->LOCK_wsrep_thd); + mysql_mutex_unlock(&granted_thd->LOCK_thd_data); ret = TRUE; } else if (granted_thd->lex->sql_command == SQLCOM_FLUSH || @@ -1810,14 +1810,14 @@ wsrep_grant_mdl_exception(MDL_context *requestor_ctx, { WSREP_DEBUG("BF thread waiting for FLUSH"); ticket->wsrep_report(wsrep_debug); - mysql_mutex_unlock(&granted_thd->LOCK_wsrep_thd); + mysql_mutex_unlock(&granted_thd->LOCK_thd_data); ret = FALSE; } else if (request_thd->lex->sql_command == SQLCOM_DROP_TABLE) { - WSREP_DEBUG("DROP caused BF abort"); + WSREP_DEBUG("DROP caused BF abort, conf %d", granted_thd->wsrep_conflict_state); ticket->wsrep_report(wsrep_debug); - mysql_mutex_unlock(&granted_thd->LOCK_wsrep_thd); + mysql_mutex_unlock(&granted_thd->LOCK_thd_data); wsrep_abort_thd((void*)request_thd, (void*)granted_thd, 1); ret = FALSE; } @@ -1825,7 +1825,7 @@ wsrep_grant_mdl_exception(MDL_context *requestor_ctx, { WSREP_DEBUG("MDL granted, but committing thd abort scheduled"); ticket->wsrep_report(wsrep_debug); - mysql_mutex_unlock(&granted_thd->LOCK_wsrep_thd); + mysql_mutex_unlock(&granted_thd->LOCK_thd_data); wsrep_abort_thd((void*)request_thd, (void*)granted_thd, 1); ret = FALSE; } @@ -1834,14 +1834,14 @@ wsrep_grant_mdl_exception(MDL_context *requestor_ctx, WSREP_MDL_LOG(DEBUG, "MDL conflict-> BF abort", schema, schema_len, request_thd, granted_thd); ticket->wsrep_report(wsrep_debug); - mysql_mutex_unlock(&granted_thd->LOCK_wsrep_thd); + mysql_mutex_unlock(&granted_thd->LOCK_thd_data); wsrep_abort_thd((void*)request_thd, (void*)granted_thd, 1); ret = FALSE; } } else { - mysql_mutex_unlock(&request_thd->LOCK_wsrep_thd); + mysql_mutex_unlock(&request_thd->LOCK_thd_data); } return ret; } @@ -2006,9 +2006,9 @@ static inline bool is_replaying_connection(THD *thd) { bool ret; - mysql_mutex_lock(&thd->LOCK_wsrep_thd); + mysql_mutex_lock(&thd->LOCK_thd_data); ret= (thd->wsrep_conflict_state == REPLAYING) ? true : false; - mysql_mutex_unlock(&thd->LOCK_wsrep_thd); + mysql_mutex_unlock(&thd->LOCK_thd_data); return ret; } @@ -2018,9 +2018,9 @@ static inline bool is_committing_connection(THD *thd) { bool ret; - mysql_mutex_lock(&thd->LOCK_wsrep_thd); + mysql_mutex_lock(&thd->LOCK_thd_data); ret= (thd->wsrep_query_state == QUERY_COMMITTING) ? true : false; - mysql_mutex_unlock(&thd->LOCK_wsrep_thd); + mysql_mutex_unlock(&thd->LOCK_thd_data); return ret; } @@ -2336,7 +2336,7 @@ extern "C" void wsrep_thd_set_query_state( void wsrep_thd_set_conflict_state(THD *thd, enum wsrep_conflict_state state) { - thd->wsrep_conflict_state= state; + if (WSREP(thd)) thd->wsrep_conflict_state= state; } @@ -2403,13 +2403,13 @@ wsrep_ws_handle_t* wsrep_thd_ws_handle(THD *thd) void wsrep_thd_LOCK(THD *thd) { - mysql_mutex_lock(&thd->LOCK_wsrep_thd); + mysql_mutex_lock(&thd->LOCK_thd_data); } void wsrep_thd_UNLOCK(THD *thd) { - mysql_mutex_unlock(&thd->LOCK_wsrep_thd); + mysql_mutex_unlock(&thd->LOCK_thd_data); } diff --git a/sql/wsrep_mysqld.h b/sql/wsrep_mysqld.h index fd68fab99..272e4ac49 100644 --- a/sql/wsrep_mysqld.h +++ b/sql/wsrep_mysqld.h @@ -80,6 +80,7 @@ extern const char* wsrep_notify_cmd; extern long wsrep_max_protocol_version; extern ulong wsrep_forced_binlog_format; extern my_bool wsrep_desync; +extern ulong wsrep_reject_queries; extern my_bool wsrep_replicate_myisam; extern ulong wsrep_mysql_replication_bundle; extern my_bool wsrep_restart_slave; @@ -92,6 +93,12 @@ extern bool wsrep_gtid_mode; extern uint32 wsrep_gtid_domain_id; extern bool wsrep_dirty_reads; +enum enum_wsrep_reject_types { + WSREP_REJECT_NONE, /* nothing rejected */ + WSREP_REJECT_ALL, /* reject all queries, with UNKNOWN_COMMAND error */ + WSREP_REJECT_ALL_KILL /* kill existing connections and reject all queries*/ +}; + enum enum_wsrep_OSU_method { WSREP_OSU_TOI, WSREP_OSU_RSU, @@ -227,6 +234,7 @@ extern wsrep_seqno_t wsrep_locked_seqno; #define WSREP_QUERY(thd) (thd->query()) +extern my_bool wsrep_ready_get(); extern void wsrep_ready_wait(); class Ha_trx_info; @@ -265,8 +273,6 @@ extern my_bool wsrep_preordered_opt; extern handlerton *wsrep_hton; #ifdef HAVE_PSI_INTERFACE -extern PSI_mutex_key key_LOCK_wsrep_thd; -extern PSI_cond_key key_COND_wsrep_thd; extern PSI_mutex_key key_LOCK_wsrep_ready; extern PSI_mutex_key key_COND_wsrep_ready; extern PSI_mutex_key key_LOCK_wsrep_sst; @@ -321,6 +327,18 @@ bool wsrep_create_like_table(THD* thd, TABLE_LIST* table, bool wsrep_node_is_donor(); bool wsrep_node_is_synced(); +typedef struct wsrep_key_arr +{ + wsrep_key_t* keys; + size_t keys_len; +} wsrep_key_arr_t; +bool wsrep_prepare_keys_for_isolation(THD* thd, + const char* db, + const char* table, + const TABLE_LIST* table_list, + wsrep_key_arr_t* ka); +void wsrep_keys_free(wsrep_key_arr_t* key_arr); + #else /* WITH_WSREP */ #define WSREP(T) (0) @@ -350,6 +368,5 @@ bool wsrep_node_is_synced(); #define wsrep_thr_init() do {} while(0) #define wsrep_thr_deinit() do {} while(0) #define wsrep_running_threads (0) - #endif /* WITH_WSREP */ #endif /* WSREP_MYSQLD_H */ diff --git a/sql/wsrep_priv.h b/sql/wsrep_priv.h index 119f17c2a..b00bfda16 100644 --- a/sql/wsrep_priv.h +++ b/sql/wsrep_priv.h @@ -26,7 +26,7 @@ #include #include -void wsrep_ready_set (my_bool x); +my_bool wsrep_ready_set (my_bool x); ssize_t wsrep_sst_prepare (void** msg); wsrep_cb_status wsrep_sst_donate_cb (void* app_ctx, diff --git a/sql/wsrep_sst.cc b/sql/wsrep_sst.cc index 94804a6d3..4df969496 100644 --- a/sql/wsrep_sst.cc +++ b/sql/wsrep_sst.cc @@ -85,37 +85,14 @@ static void make_wsrep_defaults_file() } -// TODO: Improve address verification. -static bool sst_receive_address_check (const char* str) -{ - if (!strncasecmp(str, "127.0.0.1", strlen("127.0.0.1")) || - !strncasecmp(str, "localhost", strlen("localhost"))) - { - return 1; - } - - return 0; -} - bool wsrep_sst_receive_address_check (sys_var *self, THD* thd, set_var* var) { - char addr_buf[FN_REFLEN]; - if ((! var->save_result.string_value.str) || (var->save_result.string_value.length > (FN_REFLEN - 1))) // safety { goto err; } - memcpy(addr_buf, var->save_result.string_value.str, - var->save_result.string_value.length); - addr_buf[var->save_result.string_value.length]= 0; - - if (sst_receive_address_check(addr_buf)) - { - goto err; - } - return 0; err: @@ -182,8 +159,8 @@ bool wsrep_sst_auth_update (sys_var *self, THD* thd, enum_var_type type) void wsrep_sst_auth_init (const char* value) { - if (wsrep_sst_auth == value) wsrep_sst_auth = NULL; - if (value) sst_auth_real_set (value); + DBUG_ASSERT(wsrep_sst_auth == value); + sst_auth_real_set (wsrep_sst_auth); } bool wsrep_sst_donor_check (sys_var *self, THD* thd, set_var* var) @@ -579,11 +556,11 @@ static ssize_t sst_prepare_other (const char* method, ret= snprintf (cmd_str(), cmd_len, "wsrep_sst_%s " - WSREP_SST_OPT_ROLE" 'joiner' " - WSREP_SST_OPT_ADDR" '%s' " - WSREP_SST_OPT_DATA" '%s' " + WSREP_SST_OPT_ROLE " 'joiner' " + WSREP_SST_OPT_ADDR " '%s' " + WSREP_SST_OPT_DATA " '%s' " " %s " - WSREP_SST_OPT_PARENT" '%d'" + WSREP_SST_OPT_PARENT " '%d'" " %s '%s' ", method, addr_in, mysql_real_data_home, wsrep_defaults_file, @@ -865,13 +842,13 @@ static int sst_donate_mysqldump (const char* addr, int ret= snprintf (cmd_str(), cmd_len, "wsrep_sst_mysqldump " - WSREP_SST_OPT_ADDR" '%s' " - WSREP_SST_OPT_PORT" '%d' " - WSREP_SST_OPT_LPORT" '%u' " - WSREP_SST_OPT_SOCKET" '%s' " - " '%s' " - WSREP_SST_OPT_GTID" '%s:%lld' " - WSREP_SST_OPT_GTID_DOMAIN_ID" '%d'" + WSREP_SST_OPT_ADDR " '%s' " + WSREP_SST_OPT_PORT " '%d' " + WSREP_SST_OPT_LPORT " '%u' " + WSREP_SST_OPT_SOCKET " '%s' " + " %s " + WSREP_SST_OPT_GTID " '%s:%lld' " + WSREP_SST_OPT_GTID_DOMAIN_ID " '%d'" "%s", addr, port, mysqld_port, mysqld_unix_port, wsrep_defaults_file, uuid_str, @@ -1228,14 +1205,14 @@ static int sst_donate_other (const char* method, ret= snprintf (cmd_str(), cmd_len, "wsrep_sst_%s " - WSREP_SST_OPT_ROLE" 'donor' " - WSREP_SST_OPT_ADDR" '%s' " - WSREP_SST_OPT_SOCKET" '%s' " - WSREP_SST_OPT_DATA" '%s' " + WSREP_SST_OPT_ROLE " 'donor' " + WSREP_SST_OPT_ADDR " '%s' " + WSREP_SST_OPT_SOCKET " '%s' " + WSREP_SST_OPT_DATA " '%s' " " %s " " %s '%s' " - WSREP_SST_OPT_GTID" '%s:%lld' " - WSREP_SST_OPT_GTID_DOMAIN_ID" '%d'" + WSREP_SST_OPT_GTID " '%s:%lld' " + WSREP_SST_OPT_GTID_DOMAIN_ID " '%d'" "%s", method, addr, mysqld_unix_port, mysql_real_data_home, wsrep_defaults_file, diff --git a/sql/wsrep_thd.cc b/sql/wsrep_thd.cc index 7b73273b8..eb26da612 100644 --- a/sql/wsrep_thd.cc +++ b/sql/wsrep_thd.cc @@ -47,7 +47,7 @@ int wsrep_show_bf_aborts (THD *thd, SHOW_VAR *var, char *buff, return 0; } -/* must have (&thd->LOCK_wsrep_thd) */ +/* must have (&thd->LOCK_thd_data) */ void wsrep_client_rollback(THD *thd) { WSREP_DEBUG("client rollback due to BF abort for (%ld), query: %s", @@ -56,7 +56,7 @@ void wsrep_client_rollback(THD *thd) WSREP_ATOMIC_ADD_LONG(&wsrep_bf_aborts_counter, 1); thd->wsrep_conflict_state= ABORTING; - mysql_mutex_unlock(&thd->LOCK_wsrep_thd); + mysql_mutex_unlock(&thd->LOCK_thd_data); trans_rollback(thd); if (thd->locked_tables_mode && thd->lock) @@ -83,7 +83,7 @@ void wsrep_client_rollback(THD *thd) WSREP_DEBUG("clearing binlog table map for BF abort (%ld)", thd->thread_id); thd->clear_binlog_table_maps(); } - mysql_mutex_lock(&thd->LOCK_wsrep_thd); + mysql_mutex_lock(&thd->LOCK_thd_data); thd->wsrep_conflict_state= ABORTED; } @@ -229,7 +229,7 @@ void wsrep_replay_transaction(THD *thd) thd->get_stmt_da()->reset_diagnostics_area(); thd->wsrep_conflict_state= REPLAYING; - mysql_mutex_unlock(&thd->LOCK_wsrep_thd); + mysql_mutex_unlock(&thd->LOCK_thd_data); thd->reset_for_next_command(); thd->reset_killed(); @@ -269,7 +269,7 @@ void wsrep_replay_transaction(THD *thd) if (thd->wsrep_conflict_state!= REPLAYING) WSREP_WARN("lost replaying mode: %d", thd->wsrep_conflict_state ); - mysql_mutex_lock(&thd->LOCK_wsrep_thd); + mysql_mutex_lock(&thd->LOCK_thd_data); switch (rcode) { @@ -326,7 +326,7 @@ void wsrep_replay_transaction(THD *thd) /* we're now in inconsistent state, must abort */ /* http://bazaar.launchpad.net/~codership/codership-mysql/5.6/revision/3962#sql/wsrep_thd.cc */ - mysql_mutex_unlock(&thd->LOCK_wsrep_thd); + mysql_mutex_unlock(&thd->LOCK_thd_data); unireg_abort(1); break; @@ -496,29 +496,29 @@ static void wsrep_rollback_process(THD *thd) */ mysql_mutex_unlock(&LOCK_wsrep_rollback); - mysql_mutex_lock(&aborting->LOCK_wsrep_thd); + mysql_mutex_lock(&aborting->LOCK_thd_data); if (aborting->wsrep_conflict_state== ABORTED) { WSREP_DEBUG("WSREP, thd already aborted: %llu state: %d", (long long)aborting->real_id, aborting->wsrep_conflict_state); - mysql_mutex_unlock(&aborting->LOCK_wsrep_thd); + mysql_mutex_unlock(&aborting->LOCK_thd_data); mysql_mutex_lock(&LOCK_wsrep_rollback); continue; } aborting->wsrep_conflict_state= ABORTING; - mysql_mutex_unlock(&aborting->LOCK_wsrep_thd); + mysql_mutex_unlock(&aborting->LOCK_thd_data); set_current_thd(aborting); aborting->store_globals(); - mysql_mutex_lock(&aborting->LOCK_wsrep_thd); + mysql_mutex_lock(&aborting->LOCK_thd_data); wsrep_client_rollback(aborting); WSREP_DEBUG("WSREP rollbacker aborted thd: (%lu %llu)", aborting->thread_id, (long long)aborting->real_id); - mysql_mutex_unlock(&aborting->LOCK_wsrep_thd); + mysql_mutex_unlock(&aborting->LOCK_thd_data); set_current_thd(thd); thd->store_globals(); @@ -558,10 +558,10 @@ enum wsrep_conflict_state wsrep_thd_conflict_state(THD *thd, my_bool sync) enum wsrep_conflict_state state = NO_CONFLICT; if (thd) { - if (sync) mysql_mutex_lock(&thd->LOCK_wsrep_thd); + if (sync) mysql_mutex_lock(&thd->LOCK_thd_data); state = thd->wsrep_conflict_state; - if (sync) mysql_mutex_unlock(&thd->LOCK_wsrep_thd); + if (sync) mysql_mutex_unlock(&thd->LOCK_thd_data); } return state; } @@ -585,12 +585,12 @@ my_bool wsrep_thd_is_BF(THD *thd, my_bool sync) if (wsrep_thd_is_wsrep(thd)) { if (sync) - mysql_mutex_lock(&thd->LOCK_wsrep_thd); + mysql_mutex_lock(&thd->LOCK_thd_data); status = ((thd->wsrep_exec_mode == REPL_RECV) || (thd->wsrep_exec_mode == TOTAL_ORDER)); if (sync) - mysql_mutex_unlock(&thd->LOCK_wsrep_thd); + mysql_mutex_unlock(&thd->LOCK_thd_data); } } return status; @@ -603,12 +603,12 @@ my_bool wsrep_thd_is_BF_or_commit(void *thd_ptr, my_bool sync) if (thd_ptr) { THD* thd = (THD*)thd_ptr; - if (sync) mysql_mutex_lock(&thd->LOCK_wsrep_thd); + if (sync) mysql_mutex_lock(&thd->LOCK_thd_data); status = ((thd->wsrep_exec_mode == REPL_RECV) || (thd->wsrep_exec_mode == TOTAL_ORDER) || (thd->wsrep_exec_mode == LOCAL_COMMIT)); - if (sync) mysql_mutex_unlock(&thd->LOCK_wsrep_thd); + if (sync) mysql_mutex_unlock(&thd->LOCK_thd_data); } return status; } @@ -620,10 +620,10 @@ my_bool wsrep_thd_is_local(void *thd_ptr, my_bool sync) if (thd_ptr) { THD* thd = (THD*)thd_ptr; - if (sync) mysql_mutex_lock(&thd->LOCK_wsrep_thd); + if (sync) mysql_mutex_lock(&thd->LOCK_thd_data); status = (thd->wsrep_exec_mode == LOCAL_STATE); - if (sync) mysql_mutex_unlock(&thd->LOCK_wsrep_thd); + if (sync) mysql_mutex_unlock(&thd->LOCK_thd_data); } return status; } diff --git a/sql/wsrep_var.cc b/sql/wsrep_var.cc index ad1f4ec0e..216bab0cd 100644 --- a/sql/wsrep_var.cc +++ b/sql/wsrep_var.cc @@ -34,6 +34,7 @@ const char* wsrep_node_name = 0; const char* wsrep_node_address = 0; const char* wsrep_node_incoming_address = 0; const char* wsrep_start_position = 0; +ulong wsrep_reject_queries; static long wsrep_prev_slave_threads = wsrep_slave_threads; @@ -68,6 +69,9 @@ bool wsrep_on_check(sys_var *self, THD* thd, set_var* var) { bool new_wsrep_on= (bool)var->save_result.ulonglong_value; + if (check_has_super(self, thd, var)) + return true; + if (new_wsrep_on && innodb_lock_schedule_algorithm != 0) { my_message(ER_WRONG_ARGUMENTS, " WSREP (galera) can't be enabled " "if innodb_lock_schedule_algorithm=VATS. Please configure" @@ -384,6 +388,27 @@ void wsrep_provider_options_init(const char* value) wsrep_provider_options = (value) ? my_strdup(value, MYF(0)) : NULL; } +bool wsrep_reject_queries_update(sys_var *self, THD* thd, enum_var_type type) +{ + switch (wsrep_reject_queries) { + case WSREP_REJECT_NONE: + WSREP_INFO("Allowing client queries due to manual setting"); + break; + case WSREP_REJECT_ALL: + WSREP_INFO("Rejecting client queries due to manual setting"); + break; + case WSREP_REJECT_ALL_KILL: + wsrep_close_client_connections(FALSE); + WSREP_INFO("Rejecting client queries and killing connections due to manual setting"); + break; + default: + WSREP_INFO("Unknown value for wsrep_reject_queries: %lu", + wsrep_reject_queries); + return true; + } + return false; +} + static int wsrep_cluster_address_verify (const char* cluster_address_str) { /* There is no predefined address format, it depends on provider. */ diff --git a/sql/wsrep_var.h b/sql/wsrep_var.h index 55eb2fbc5..53952173c 100644 --- a/sql/wsrep_var.h +++ b/sql/wsrep_var.h @@ -93,6 +93,7 @@ extern bool wsrep_desync_update UPDATE_ARGS; extern bool wsrep_max_ws_size_check CHECK_ARGS; extern bool wsrep_max_ws_size_update UPDATE_ARGS; +extern bool wsrep_reject_queries_update UPDATE_ARGS; #else /* WITH_WSREP */ diff --git a/storage/archive/archive_reader.c b/storage/archive/archive_reader.c index 1b15fa16c..e87bc70ad 100644 --- a/storage/archive/archive_reader.c +++ b/storage/archive/archive_reader.c @@ -408,8 +408,7 @@ static void print_version(void) static void get_options(int *argc, char ***argv) { - if (load_defaults("my", load_default_groups, argc, argv)) - exit(1); + load_defaults_or_exit("my", load_default_groups, argc, argv); default_argv= *argv; handle_options(argc, argv, my_long_options, get_one_option); diff --git a/storage/archive/ha_archive.cc b/storage/archive/ha_archive.cc index 6842319b8..d70757e81 100644 --- a/storage/archive/ha_archive.cc +++ b/storage/archive/ha_archive.cc @@ -1888,7 +1888,7 @@ maria_declare_plugin(archive) &archive_storage_engine, "ARCHIVE", "Brian Aker, MySQL AB", - "Archive storage engine", + "gzip-compresses tables for a low storage footprint", PLUGIN_LICENSE_GPL, archive_db_init, /* Plugin Init */ NULL, /* Plugin Deinit */ diff --git a/storage/connect/CMakeLists.txt b/storage/connect/CMakeLists.txt index e283da97c..6e8c8baf9 100644 --- a/storage/connect/CMakeLists.txt +++ b/storage/connect/CMakeLists.txt @@ -230,7 +230,7 @@ ENDIF(CONNECT_WITH_ODBC) # # JDBC with MongoDB Java Driver included but disabled if without MONGO # -# OPTION(CONNECT_WITH_MONGO "Compile CONNECT storage engine with MONGO support" ON) +#OPTION(CONNECT_WITH_MONGO "Compile CONNECT storage engine with MONGO support" ON) OPTION(CONNECT_WITH_JDBC "Compile CONNECT storage engine with JDBC support" ON) IF(CONNECT_WITH_JDBC) @@ -326,6 +326,13 @@ IF(NOT TARGET connect) RETURN() ENDIF() +IF(WIN32) + IF (libmongoc-1.0_FOUND) + SET_TARGET_PROPERTIES(connect PROPERTIES LINK_FLAGS + "/DELAYLOAD:libbson-1.0.dll /DELAYLOAD:libmongoc-1.0.dll") + ENDIF(libmongoc-1.0_FOUND) +ENDIF(WIN32) + # Install some extra files that belong to connect engine IF(WIN32) # install ha_connect.lib diff --git a/storage/connect/Client.java b/storage/connect/Client.java index aaf1b7bf2..afa54fa42 100644 --- a/storage/connect/Client.java +++ b/storage/connect/Client.java @@ -1,9 +1,13 @@ + package wrappers; import java.io.BufferedReader; import java.io.Console; import java.io.IOException; import java.io.InputStreamReader; +import java.sql.Date; +import java.sql.Time; +import java.sql.Timestamp; public class Client { static boolean DEBUG = true; @@ -58,6 +62,9 @@ public class Client { String query; System.out.println("Successfully connected to " + parms[1]); + s = jdi.GetQuoteString(); + System.out.println("Qstr = '" + s + "'"); + while ((query = getLine("Query: ", false)) != null) { n = jdi.Execute(query); System.out.println("Returned n = " + n); @@ -79,7 +86,11 @@ public class Client { private static void PrintResult(int ncol) { // Get result set meta data int i; + Date date = new Date(0); + Time time = new Time(0); + Timestamp tsp = new Timestamp(0); String columnName; + Object job; // Get the column names; column indices start from 1 for (i = 1; i <= ncol; i++) { @@ -112,6 +123,7 @@ public class Client { case java.sql.Types.VARCHAR: case java.sql.Types.LONGVARCHAR: case java.sql.Types.CHAR: + case 1111: System.out.print(jdi.StringField(i, null)); break; case java.sql.Types.INTEGER: @@ -120,14 +132,17 @@ public class Client { case java.sql.Types.BIGINT: System.out.print(jdi.BigintField(i, null)); break; - case java.sql.Types.TIMESTAMP: - System.out.print(jdi.TimestampField(i, null)); - break; case java.sql.Types.TIME: - System.out.print(jdi.TimeField(i, null)); + time.setTime((long)jdi.TimeField(i, null) * 1000); + System.out.print(time); break; case java.sql.Types.DATE: - System.out.print(jdi.DateField(i, null)); + date.setTime((long)jdi.DateField(i, null) * 1000); + System.out.print(date); + break; + case java.sql.Types.TIMESTAMP: + tsp.setTime((long)jdi.TimestampField(i, null) * 1000); + System.out.print(tsp); break; case java.sql.Types.SMALLINT: System.out.print(jdi.IntField(i, null)); @@ -141,6 +156,8 @@ public class Client { case java.sql.Types.BOOLEAN: System.out.print(jdi.BooleanField(i, null)); default: + job = jdi.ObjectField(i, null); + System.out.print(job.toString()); break; } // endswitch Type diff --git a/storage/connect/JavaWrappers.jar b/storage/connect/JavaWrappers.jar index ef407f6a9c2d1e0ad1730c4b7194b012572ba8ce..33b29e7685b66ee03d1b3f5921f2ba32d48f76b3 100644 GIT binary patch delta 13062 zcmZ8|1yCMKvo=m}65K<8H)w$H;_eXK-QC?~gS)%C1oz-B!QI{6-EYqS)qn4~x3{-; zXZD$?>7J^t?U`p17N8yyAW>x{pkXi}K79B9Q4wz@8H1_?Q}oZ%1`KE@D5zk*vG|`v z6Gq!JQ;U@+p_j>-$AChWh5AHDdy-9lt~w3OOZpMG4Jx#p zALb177)_;g4`iw|K>(QggUt?H$of-^UKJ7QhP(K1DgZGR%+yn(VISx4Y z-J!G&gEdKs{jfzg$M=pFl=xZN8M9|?bmNMZ?L3teE&ig5Z zc&YR-pvD-jeI8ytrW-fH9;9ZzC=uJ@_K~J&PtnBbTCcIlLSClRfKeB`iMyn^yj+Vk*r^gQ9W&W{)9~ql5!BAoNaj4L7 zzDB-@a60*OQf$eB7}2-)5G@$82R=c3lSLEBVRbjFxq`3CjIyofq4DNr4)}$( znKon+ZuJJ*&A44)WAbkmw_PIjfohsx7~Q!oT$_Ky@SVG7{fM8`GLSm;XfM-4RXJc! zqS}FJXy0oF%u}M6J$+?TrWN3xD>ry?+apu4NN}FlDcyORD@grlC$-+KP1-yV=O!4U zxV{e6ZANfPca73)I6V?|q%gmLbkD_;CFM{KJ)27s8k-X{B8)w2DKZ*o=G@k2##;8Q zP@%hsKeVU~G?dLAPHZr|^ivGTPnSjN2}UNb9=f9d8SaT4sXND>TKB%Bet|_{-Y-^AhObga=3l1wdYI}#D=}g{r-WQ`U zf81CCM24L+IVbvb0#@40wfL1=MuR_jAl=iU)4P`Q3w&5VRkqY{qIm;pG8xfC^!Rjj z%GQXJ`+cF>ra5>ejtM%jS=SPwCAKnOSLyc-#ImB^-XOtkN=N4DIZzF26A^7g z^OWp&+S&x&^1y4Fd@Og;FW$=*4`=()&-2XVk@Ehs>vVt_`xX^-QzNp!MQoE8bsL@# z$Vrl;oxZ{$?12t{9LzGoOX)GcQqj%XNOFf2UhptTFD=@ zA_s3Y9cUeIIIF02)&qD-)Lh;fL=q48eS#5+SI?K71gj?Wzh8hE^p4MKQ3YAlMi$Se7c; z{+d;%QOfsKvN)1g=Hyq9J)UcxnVVZuU#^@}uTN07sxMccdT&j!WKjRQKCCqcjB`J? z-KT7$k-*v}rW<4@WuJpMXI3m1L#|3pdqXKu8ew6N0YL)6-AUQ9YR}2kTV*z?3&ruw zdd~_z0eF^F|KY(T#3P=<-efjp8|t*b*;V*KcZN4Ggs#uRiXr7ZImO6l2wb@ zb5v6l(7>FPxccov_c3hpXOa|UXZi4HtRUVr?M`NYqjVcz{y z#e*M%2Y484Vfj>xU6?wjdRH@nuSHNC5hOT?Mar4GePXCxK$c4K4Vjq{7t|+F5k{^! zj}b1Uv?7%wCdrU(sAR<|7w1eq$5!tc;KSs8w1NJD8}bP{?@x7D{+(H!B}M^dUO=j# zbN5zyb`?4NK0dU8>6WycF-uVQahWv1Gb8@CBJg1UL$yX8Hia+Fu^Y!y+%ni%FlvC! zFXyK&jzGjzRUyHiWS`_&`{5T(%t+^T$5;Vs7(Y(ZudwN|S=Q-BxrnolUU>>wJ)K(GDjISpeO&IYZUQOp zjDXID4&e`SmcCOsqWRe8bRomi0>1z#2eXAp(L8({>KBC5J$(5%CJ2rrcsq7I6A3-9_269ELaiNRH!D- z4fvsPcGRvP@xi8LG6>CBp{C$!RLOHLC#^Dm1{R!~{9k3r3JHA_pj>ldo9}Be=!{^3 zV5T$&QzL!9P($#sBDio*B3X<&=%q>7UYt6!?z?B}f>?#bC-D|n^-D^6mRgYrdEiAE zBgtGHua;F~Q*r8QOTw4ON%_0cK(S}IE!N5R*;D&|`qdjee8nw93>E#f&VkqCG9l_z zM{2c*{zD~DML)A+d7c2g5_d;;SY-|2h-M3mfdgkdRaZva13raDY|RNBzEMJBSMPj+ zM?0LT6M4*SEY7-anNvjADe9xsB)}@QQU;QXFbi{7h+!}W*>>{L^c^#1i3O&n zzKU)CHzmPCrCW|x;gxF`eX>PCGY>5l} zh`*c$d532?e%Ed&Se)`J0zmVZ8-2B!$|b{@td|O{ovtJ3`$A==esg1*$My-;KVDXP z!P11YkfZi72=o>JTpuK3?MsnkK1*WLB=m_6 zu+_ijjb{rd1}iTCCnoYQy7xz|DdNMS>vFYshU_Sn=SGwoFI^mN}fNK_&zlg zmz_Atsrh|!#9YC{9>|V6KyyK|ntyso%|uuxjlPL#58R1+MZf_oAnsr;1<$tSY`lki;oHG3otKR+_w7vG_?L2&|F{V}1`k%n5!IC`{3>*+tu+gVWorThpNP9Gb zI`|reP8;oFD;wbUm55=LqoVUb;E$fA4SyB1ixryY21i1Bd-uKLv$x6UZ30mz0Rrt2 zOoOga;zp-6M>tVFyt91aw+YCnD&9bbFV2jA0I)u)KJq&}F8eDkSpf2Hg^&-Qn1V0m z{XgP{y7kf*&C_or40q$T3P%bd=2fLsHl0%TFz-}D8`#nGT(u+zdwEK6``2EujrCu9 zvb6Ok1JL^$xP@Xik_kSZ#3=nu_AJIj;E`B&9#3V1235~N&7rR&O2sk9c9|=Ek6xoHN$qH;Hpxa4h zz;QwqsJW36>FJtpaOYigB_5F2ad&qYwYb*Pka5~z>9e>OFCWaYIBFwWco4i!Ws~AY zw(MS8o}#7FSsi#y?M;8BFMFF|JY`w zTVQ74d^x>)d+;KU;6-O-iI~>_Y#)c7PVUM*Ui30W&B4N&2jkkf=2C%PLvuV)*(92h0`u6`>)oCuM1tZ zXDn{WEjtJ+-{|$DT0=Q^q{x%=?*G77?Xoe+WN^@93`wIx3+^(14RX6oKAsq#~Od0BCQcZEP-U*LK(+IUoa06<70`YUevi{TjNy{xJcikaVpN zSVcbJ&SPO>BIAP_v$JL1wY`m%u}YXyDB^Ja+;14$;kg1Bg*iW3_ShyaK^j$%*%tI! zCUp8@OCF|D?NpUX`QBQ|D+02CbwgFk>;|M>N+R*tzfPAyAq`JttKPgvO z|H*#h^+8CVeCF+z(AUm;xj1Odqt6!Cq=}jEYEIKPU!vf-MzBPi_CC%fh#t0mB|@5G z{~cW=na#a%1L9!yCoKy$v9G{kcf7%Nyi?AWX<)?&Xx+~craCfR^iZo@jii%^QAw|y z9hW+;z7UTNkQrJwqbE%oV}l*$6(q>nb!Cqke24xgspzPWpoK(+fQZ3@_`f;D3jqf} zPD<)eyHRCAaqe_a4#cDf();+kDA>v3Z?16TR6U!ENoO7*WPYkY z`BXf+G*{tVseW3jRUdlww%+7&wjvJtdAhB#zvhv6{_?)=-0ooWv;r^V84+Aq;zcYk zDd^Jol9AD++G=ffoXBU8PlLOBga!j}?-&oQ@2wwJB0ZB?ISv1|M1pHh)-1Ps!Dc?p zJgbmxJQDy~+lD(R2+K@{%n|B^U$j=MKTpFR_K#Tq2(>&64ftYp+ic{b9w z0j3ZyvfwYP z%{7!O26G?lCIpe>J?o8R2tf?RKG^(LlV|xofw@%*lvA)O2v3}RRtU`Q2LgrN;4KvO zA2^Igze9w#>;Qrpw*1_hjsc_T@9Jkcd;ZBYO32O0$_#EC1yr=&YLhxbyZBvG`V-WD zqZ1bMa!yD#N;{fcAwO_Y-+5>BCOzD*CJ~G8&_#@1SH+FH(C%)8G5r88E$o5pzQebp z*FprkJ#{)sLWEj8HGJE}T-a!JS;J(?E2)z(y}>&=PZXa+BSpES{3mZX zHxe5+QvVxyI12P=46;*a_H7+$8jo<+-2_ndFjL~(s|b|xXXT7TDQ0tG3zjewJc|@9 zmR!$s!+B-4|8(V}J%-gA3VoyWpYwwAia}-E1qC8rekRP$e}}0p)&9w&JE8aVY2|yQ znH;W-%hAbHC?rUw;&RH*w(E?|@}z)%dv3m|6wBQ;nfP{sY#}G^IsVSy=ri zguw)Vnl>=8w3eKhp^%Pd8pqR8knO6e%+asNUPbXday5lfW3Y_EQw`~PCjO94kDK)4 zGo}q%!`_6#4GNkUcMO|CAMTCR6ZTFWg^N((CRT#U!tXw}cB=^lceroCmJ7Kqhk97S zZH@#@$nTN-4u?=^uV`_VQ30uWT48ysG0L1I?gv0im96|lD5yok9Ew+-zCvR=XL$2r zC0G$3tv7eGDkW2iwi8@ZNpPbfbQH)Ih{IZ-RjeI8T({n?LoOcQ9LLvht&M)laSTvTm*n9DItH7iIg&bJ>1H zFe;F4*LnlbcboI~Ka{y@K>dN)Pdf=VGy{oN67_nDV8TVvwvj#lZv(%DTv)s&I z>)&%-a+0NM4;&7FtrS0Ut%L)CAj`e23gG*j{=>)I_FTr*yL7>#6z+>})I_SqU7>5D z+~_jFy$|SbelEracqepw_;_2i>iP2@*dzs!d3mqF=nF&N zW{7PKNkk+8E7G8cf<1pyI2=1j{ZAOFx%lJq3U6DsGg*Y~3xwL{ws>evyT_2Y9RSul z9m~9Furpcqi8#t$ehggH*0to^-iMLS!cG*1csA=|L3tU`B6d4ffsS1MmhmaufUX3t zF~`p>Xu0w-FoSA;YT#A+aO|D@w4>ma-6t6zixjPy7b;Y@Uw?x0rD?EtC_SgE7 zvzT{e^rq-nbm-V;qFcCTPsbYxk9u zAEmq}T$`fY+Q;M4X%!x!dcDxg#|YP{xuxYvy z3C3GAy^yEw!G}Eb*~*7A|Ii1$XT7m&H1Q$;kfS396(ELu)g;;+8%AkY1py{-HxTrd z{^~{uczDxpeen70t)T?mtxG9KCuQ5a^6LEf_iwQpr}W?uPhOmk_ zCeU9mqo7hu6(V=W+tx`9l>>#k`Q@cr{g$k3v<88x1|xnBN72Dua(MEFsFPa?q9+V& zd+7RK#8LVAI_d2B?S)+wok{J)QhrZwXxT^N1-eC)%Nm$kP~tiucVqt+jGg=>exI88 zV3L}WI6RUEE#` zoTy^+lAP}@>m6TyLMCB-kWPeJM?8dV7`**{7YDbVv0)k5zIU?gm)w!d8Jq_%B;m!o zW)fnNu^V=<%4QIBlLojmGKTh!<9VV1Yb%#lJ6jxPcy5o{Gek6}FdG*4176y1UkDMZ zX;_MbRRofSHOQ{6p#MONpK(ei*E}R4^K?_rMr0d!K0%*C*vhWpeEs#bwd%w7cda@U z8Ij!&n>{W+N$wF%V(Vb8T$)WMX6H$U{+_REk1(r1!7`o3?g}vL#}jI8oZtAmqqrZL z4VgNN6_XM>b(>D*i@iXDV!Y6e{e(FERKNhpFh-MdzUzdGDU-mr>`=Wyn5y zQoHUAlZQ0vB%3Q6gg~n%V~UjaF*8ivcY_P@r=k;|9I;Y%(H$O}i~EHvwnuV`CNlhD ziZ)VQ(Izd;$wq*b$U5d4+7F<#?@g(~ffcYD+&OSv+#rz%O2^iK@)mENzm!3FO92}P zZPo0iP_$VTk$BDoiY(I9@AT#9HY%+(BTN5jV4(11!T#k@;A$6@jAbL(E zr9WfZO=pcbH-7r3;T;Kzx8MiEhQm)Xsc-%uIon9JdO&SqTEp;{L_jdwpcKIz-x$|_zNG`W!-G?1-0XN6VStvoVU5~@I*X9$V;qqR!J9= zl{dDr%f?UDW_d`x-NbujfoPHsw5R%Q79=D^WtYdvR4~oN2PI^bR4y^k^sPp9X9ri+ zIQr098K|eRIB4fO94664iSOz6H3bvih>kUe3N_*D7k>${Ulc4CpVFiq{j;yOkmrk_ zBUcbet+4xNs#_z;5*91s7yNm4vT{VU4`s7x7CXYx<)V2${;6Ev1`iccAU;`te0_fI z*yq>r+tk)&=>&-6@7;lF0l!L`>DlmdyJmmf`vbMU)7!PPLXfP32+|z#d2JEATOH7HIL+dlR}uehSB}-~ zbod(384!*v^(Cl+!iKz;C-H_&o~0^-X3oBnVR+QmGDyNFW>fQ4#ToMK$V-Lm)-H~L zg5EPW=Byj#Nd0X`_KjK&ik;_yPu%4Qf^6fl>cR`oBhr{EQeGcsB?_e<4FgVBo`8JD z=BVt&SI}@!x8-%-=2rCEOTyKYr*C*s3{1Ef_2N!KrLpVPhWKX4jzgj}8~faBHvdzq zgxgc9jNfhjPsCfN4_JrCvea|)dWyd52+>MEjG{Foi>e!kI*`5N19{7mIM6y$nw$JR zn*%PuQ<>kf=%&)tcHPrODE1AHV}NbQ7J+f55jj=;bPBz2icRbA`09NXZt3k(%_zBo z7ey7U86FWQr59YO*et3mCMj>@KjV^*zbdJF4t7%GsuAU|ntZ+?)i{{3nMOfeU0)pM zO{&)WipbHOffSfWv+*OWiksR4q|WxDTMe9sX_S$SItA3!Z?Q_a`22`-+<;l`y2hZ? z5?d{VV&9$uJ4{`W98oy)N0H?4+ak6(s``1Vg4sH_tNEi8F5KTq6T)-85p%wNRk~Vn zzaozESmrfPai??EuQ#EXh_2w(u9$R}oLoN{Gb=+>`R#29{*y@DG>` zHv39NO&iH5;XE*TP)=wbrvjSjM>(hPl%;dr?2P2pg67h)j7#Pd9uwy4q^C-zw86)7 zP)(zb)f71UfrOg+w`+%r}d=@byEy4VY8Y92F4*hg0 zf5)2j4Ac1c1aUKA&Ajh<(a?qVIR^>f<7WP!5d$H2H4LudtU>fj;=HQ3I{E-Ne zR&P>sVT;srVpsdXVTlv$JeTymatr8w!in3_PgTQZKf7gv%vER}A+-#C#SuL-jpH%T z3$*=)yV}q&Ufg0Bzg!JN+!%DmBLZLQe&E3EXoI$@li?G9e_4u?Y7&Z@gl;D!B)0AZ zi?&(B!K8%WJmDA~`2|Qu?aKT6=1yKym&}O3*oN*`D9-JuDdfdWC8X|gXd(G2L}|Cj z+o3tb)K~5=lQgFQF@JtZ=RiSJrzxsaAg?j<>$JlYN0ju@u{~S< zAFq(WcG2gMA zd0x^6PDg>&4g8X{jo!>M=B8eq-+(;Myd0}cK?YZtv)=7$>(9H307rK8lU*!F*vbML zH)yTASL*^pwRZ5POQQ!dPyf@I$BnN){+TxUqsUHo*?Hb5%Awkaqoinloa}x08^M+G z&I}m$z`OBHFmQlrx<6+e=^B-YWf-BepR=Fnc3@Z=l(^HmC^NyNTxPuGJ{7K<89|KT z-?O6W{WCC>8?I%I@Z`yX{`HUWXi)KlrF)O{cPov!s#6)gE27~FSJhnKX-k4ES!8gmkW@{GyF`V(3Ow|UUBCeTK43Z3@4;Rt=T8NqNo`X}=D z=M9?xb8G&>C){v1g6?b7=G3#^KP?m2;>}q+yJFBmr(j!E0-xK}F!$ebxHM@QDR9U` zY{C@8Pr}-(fAGVf;a{hJl&x1^X%|>TIv*ctyK8h+nh@r0?Ukrs?y?8{VX(R8O;+$0 zLK+V`hy$KDy6;q&qP$Scb@-m!7A()8o9Oj>NpIGp=*}Q_>d8_&6=N|33Z$}Q*QVVh z^?L8?c~QCoNr}m7+LjC?seAr7sk^3#hwt9+$g_pv)XI=Xq}5f_m}2=%hu5TPKXt-l zs(~Vc>I?0oEtB$3^5$?R zg?;jC!&?Qg_p!M(^QB~Um8j46?mpiXc7OQRFQmT;m zppb@{(Z6W_-T!@XZ<;`%Wv^XPqBvv9W)EpN@9xSRP`=NFma2{@To6$}1`F1w8JmNx zzXJG+51}zA(`Lq!^hxP{#@@jVBtFN(6C*O?B`NmA-k{O&jq54%!rUaU{rnV_i8~3~ zS1j=La;>>BIEp>axc{mVQa@xM%g;uhE% zF2sxJG%p2D`HVZiHK^ebUIeyCuW#eZ14za$`C?Kl-Vp78p4Ii75P(m?#vldITWKi{ zUKf;p<1^@xC1D0FE`0r~YHpt~mbJO>C~zJ?XG2s2&85t3$<;|Vm`@A8;Kr_2bpbkr5A`1z~PcnR< z7tRy|t=p$bHH{V$65JwjbR`{uPkfo%P~R!Zo$!&wVF$|`&SPm;zWHlOcFGu(#BbF< zo{wYqel-o(bl-hGwX~!fE-{B;wnn*TdG}j1swprOwCM}BYKp8$Q5>|3lv^b$GTatp zfEhHv#hJ40r~H;X8GMHLtNa|0cb!c+BV{zRjoRXz{F$4POujtJp5NHFFVd@Hf~ZS|T3=X$*9{UNT)G5~E8o zRg-ujvIJ6MFUk?}i~dVj+mdYcUg21kj6MmU95)b6ty@Ho7KwI&m+K(VBa9$%X@Om7 z!dz+gwYa-XA6bzxV8t+zZ`!>nWsqf##~3^YcG8W~(u>Skqyczzk3W-TEHF1LNXYj# zm%6)Vq{D!2Q>wbs8Ga?P7D!%jz-v*@E_^JeM5RJbVY?#J9``JzQryxUdoYVB%z@fldZkX%W z@;xm_g!3FaPYNqwx73tVM~cX^oQyixnK(>+vV!4D#r1+R4fRNCn#`Jl>PTlt8LTp& z<6G;NlNszCFe75~x^ME`q)q9xn*MA>1alj#KD>yf&J#Q!GzjLH5bt!PPm zEzRf1Ymbzg)k8Dx6vHNWJRaOUgy~eDu77N&vpzg;UaQ7gXjEs##+)fBuI2Lc@@sSh z4?WT+ybJI88gu`dP~@l~V#X?i5KCkwI|8%XQ6JwdnotRG zfz`6MAR-D_SSl8*3eG!IacIQzmzJ$~7B{!5aN5kFX!9LPM--5<%`3>9QoLQ@E{v~+ zrXKj#UFRNJ2D5#02%nwV!}dbl6?yx4_fnAIjqJ~nP7eMF4$2Fg)rR)NHO9sKwivNa zUg-nX(!jdo$>_6{)9LTo`f>Rrf)HaL?=A3**({*fo~YGSSRqoA^7zs7vY6xDts*6O66u=fs` zyFfDqaNdLOu7({^-fS0n7AENYZn3?a@q&embZ^oFHXLev4Kpnd6 zz;}6-#kd3~I zM;Obc&PFoOH+IKrzTZI>@dnMg!WqdHxrkS;&_Xs1@&L@wb=0jS71W7pwCpQ)V`c7K z2A`)}3`_Rac-&RZRtuw46)yV0XOGcz51P#0aPMt6eS_j&UcGY<@|fc=NpdfcFZTdA zLV@KZZ--!MCivJ<$7sqDlg7g9pILdZ_ob z&OpJ#vE!p}-Vd=~--qOPC)V7+;t@dp^(>`&QU3&p89S9g)XJQzz7+9DHeu$MIbmw( z;y-#+_r*J|{MQ|()NYIhc=l9wdi!p3kK>rE*K`^qD2>=9{1C!zCFsv7M=meGRT|kC zc~GfvrF58oEn5hR6_qOd#2oNrR*^$SDlcZ}u}Qx!plPPt#2a-GWY`-YM ze;#Do1$}lyRo?xg)4^Ct=$JxKUIOdo_ zIu-jJxlcpKx8AvC1l8OF1(wb|z#E$0ef(Yb8YG6%>7_9#he1d(D-e|TQ;Ls(bl-9o z#&nochZ%aw9zW+>V6O56fLlKVX_Jm(ldg1|ktDC~HmKA%Q}Q{pZ%=RQxO!+E@AWd` z8>d)PZfB~txAdVUt!)RAR_YmtDiK#M-ds=A4(YV}0|GIjF{7J#E#{y1b-Ma91uNY})I?I(QRifGN#+tiq3g)XJfNEMYA^mG+bY$wc2dX+k69uaiU z$h#V-?*tU*LbSm4D^G$r>BRi4UDc{?4ZP&Hptd{tjAma@35{85^B&Z<0;PnB}vB1ZDa+XjoeO&K-%-s!_OpSJL zj`aq!_M+Y8*`TUKeR!ROoP%Ld-wHjNZn=!#7vs`#->rSVOJddI>#8}gcb|IA#QJy@ zBQLfaU{U&}DU|s8c{tvKEeA!lC6Spx`5AnLq2OuAK_`D%x16S{)@-qyaV>o8e1KI79H*H)>O(w`N9%p8g%cF{)gQaZksbcAyw=7p)E)VK7i zDgQ8hx6rFg&Zy~tu#$(We431Wi`e|*v6P$Z&#&Ck-jMk^Fo)-UHxi#;p`*PY1*0nj z4w=ypLsD;gA;n}KtMZFD#Iv%hv3LA@z~wA|RxMr( zVn9vKuDm^1jQ#AuJBT8YYQ3m7mGoItpu3fsa3uh*K}NXnZ*!-XNN>j9^Nc#j^vF9{ z{aso8s}e@VBK4T|MMbSM)#7yDEdVR0k0l1z6V6F*X`ozAEr+OIMgudUYG+rUTq@Ov z*_f@l)z{Q_7eXmK>J zD!)qgvMv6+lyW+}0BT2C;>8Go zaiSe#i%9n>NepxBQpba7Q|xlx9~$eN zJSK*K$QS;*DPZGTgzsT||6%G12#LX;4yRSx7*EB;2vLY>OSjty z!2g!i&fg>2Arc(?5iY902||Bd9SL7cj-cUVpeVblFmK=(coif5$eXQGF?} z`$ED~B9IUe4bcA>2?>P>@jquWY5=G+0tg5QyuUXl#9wmqUx`C6`iAh&L5=@MSdJ4d z5+(VEk!;aw%)js#(f$Df;;+m8C8=@cMRfn+DX$gbL$xEuEhB!87tm{NFulvgU@Y{~bxw-;oggFQ6J{+$%fD ze*@j!<7!v_0{i{~N&Xkmk1vk+7hRm+FJkqwzjOc1*51b4$iVU6?)hi7|Lr=&|J6aB i$lq25mU<2jwt9}HvJ$Xx|9nRLdv!rUK#+?4Q~EDlvRBjq delta 37949 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 diff --git a/storage/connect/JdbcInterface.java b/storage/connect/JdbcInterface.java index a1b1360e6..72ee4ab0d 100644 --- a/storage/connect/JdbcInterface.java +++ b/storage/connect/JdbcInterface.java @@ -1,10 +1,22 @@ package wrappers; -import java.math.*; -import java.sql.*; +import java.math.BigDecimal; +import java.sql.Connection; +import java.sql.DatabaseMetaData; +import java.sql.Date; +import java.sql.Driver; +import java.sql.DriverManager; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.ResultSetMetaData; +import java.sql.SQLException; +import java.sql.Statement; +import java.sql.Time; +import java.sql.Timestamp; import java.util.Collections; import java.util.Hashtable; import java.util.List; +import java.util.UUID; import javax.sql.DataSource; @@ -223,6 +235,24 @@ public class JdbcInterface { } // end of SetTimestampParm + public void SetUuidParm(int i, String s) { + try { + UUID uuid; + + if (s == null) + uuid = null; + else if (s.isEmpty()) + uuid = UUID.randomUUID(); + else + uuid = UUID.fromString(s); + + pstmt.setObject(i, uuid); + } catch (Exception e) { + SetErrmsg(e); + } // end try/catch + + } // end of SetUuidParm + public int SetNullParm(int i, int typ) { int rc = 0; @@ -481,6 +511,8 @@ public class JdbcInterface { System.out.println("Executing query '" + query + "'"); try { + if (rs != null) + rs.close(); rs = stmt.executeQuery(query); rsmd = rs.getMetaData(); ncol = rsmd.getColumnCount(); @@ -708,7 +740,7 @@ public class JdbcInterface { return 0; } // end of TimestampField - public Object ObjectField(int n, String name) { + public Object ObjectField(int n, String name) { if (rs == null) { System.out.println("No result set"); } else try { @@ -720,6 +752,22 @@ public class JdbcInterface { return null; } // end of ObjectField + public String UuidField(int n, String name) { + Object job; + + if (rs == null) { + System.out.println("No result set"); + } else + try { + job = (n > 0) ? rs.getObject(n) : rs.getObject(name); + return job.toString(); + } catch (SQLException se) { + SetErrmsg(se); + } // end try/catch + + return null; + } // end of UuidField + public int GetDrivers(String[] s, int mxs) { int n = 0; List drivers = Collections.list(DriverManager.getDrivers()); diff --git a/storage/connect/PostgresqlInterface.java b/storage/connect/PostgresqlInterface.java index adce0616a..9f611eeb2 100644 --- a/storage/connect/PostgresqlInterface.java +++ b/storage/connect/PostgresqlInterface.java @@ -1,9 +1,10 @@ package wrappers; -import java.sql.*; +import java.sql.SQLException; import java.util.Hashtable; import javax.sql.DataSource; + import org.postgresql.jdbc2.optional.PoolingDataSource; public class PostgresqlInterface extends JdbcInterface { @@ -19,7 +20,7 @@ public class PostgresqlInterface extends JdbcInterface { } // end of constructor - @Override + @Override public int JdbcConnect(String[] parms, int fsize, boolean scrollable) { int rc = 0; String url = parms[1]; diff --git a/storage/connect/array.cpp b/storage/connect/array.cpp index 639edf63a..cd1785b48 100644 --- a/storage/connect/array.cpp +++ b/storage/connect/array.cpp @@ -82,7 +82,7 @@ PARRAY MakeValueArray(PGLOBAL g, PPARM pp) if ((valtyp = pp->Type) != TYPE_STRING) len = 1; - if (trace) + if (trace(1)) htrc("valtyp=%d len=%d\n", valtyp, len); /*********************************************************************/ @@ -287,7 +287,7 @@ bool ARRAY::AddValue(PGLOBAL g, PSZ strp) return true; } // endif Type - if (trace) + if (trace(1)) htrc(" adding string(%d): '%s'\n", Nval, strp); //Value->SetValue_psz(strp); @@ -306,7 +306,7 @@ bool ARRAY::AddValue(PGLOBAL g, void *p) return true; } // endif Type - if (trace) + if (trace(1)) htrc(" adding pointer(%d): %p\n", Nval, p); Vblp->SetValue((PSZ)p, Nval++); @@ -323,7 +323,7 @@ bool ARRAY::AddValue(PGLOBAL g, short n) return true; } // endif Type - if (trace) + if (trace(1)) htrc(" adding SHORT(%d): %hd\n", Nval, n); //Value->SetValue(n); @@ -342,7 +342,7 @@ bool ARRAY::AddValue(PGLOBAL g, int n) return true; } // endif Type - if (trace) + if (trace(1)) htrc(" adding int(%d): %d\n", Nval, n); //Value->SetValue(n); @@ -361,7 +361,7 @@ bool ARRAY::AddValue(PGLOBAL g, double d) return true; } // endif Type - if (trace) + if (trace(1)) htrc(" adding float(%d): %lf\n", Nval, d); Value->SetValue(d); @@ -380,7 +380,7 @@ bool ARRAY::AddValue(PGLOBAL g, PXOB xp) return true; } // endif Type - if (trace) + if (trace(1)) htrc(" adding (%d) from xp=%p\n", Nval, xp); //AddValue(xp->GetValue()); @@ -399,7 +399,7 @@ bool ARRAY::AddValue(PGLOBAL g, PVAL vp) return true; } // endif Type - if (trace) + if (trace(1)) htrc(" adding (%d) from vp=%p\n", Nval, vp); Vblp->SetValue(vp, Nval++); @@ -520,7 +520,7 @@ bool ARRAY::FilTest(PGLOBAL g, PVAL valp, OPVAL opc, int opm) } else if (opc != OP_EXIST) { sprintf(g->Message, MSG(MISSING_ARG), opc); - throw (int)TYPE_ARRAY; + throw (int)TYPE_ARRAY; } else // OP_EXIST return Nval > 0; @@ -990,7 +990,7 @@ PSZ ARRAY::MakeArrayList(PGLOBAL g) len += strlen(tp); } // enfor i - if (trace) + if (trace(1)) htrc("Arraylist: len=%d\n", len); p = (char *)PlugSubAlloc(g, NULL, len); @@ -1003,7 +1003,7 @@ PSZ ARRAY::MakeArrayList(PGLOBAL g) strcat(p, (++i == Nval) ? ")" : ","); } // enfor i - if (trace) + if (trace(1)) htrc("Arraylist: newlen=%d\n", strlen(p)); return p; diff --git a/storage/connect/blkfil.cpp b/storage/connect/blkfil.cpp index 802095f2f..76c9d09ac 100644 --- a/storage/connect/blkfil.cpp +++ b/storage/connect/blkfil.cpp @@ -241,7 +241,7 @@ int BLKFILARI::BlockEval(PGLOBAL) break; } // endswitch Opc - if (trace) + if (trace(1)) htrc("BlockEval: op=%d n=%d rc=%d\n", Opc, n, Result); return Result; @@ -338,7 +338,7 @@ int BLKFILAR2::BlockEval(PGLOBAL) break; } // endswitch Opc - if (trace) + if (trace(1)) htrc("BlockEval2: op=%d n=%d rc=%d\n", Opc, n, Result); return Result; @@ -474,7 +474,7 @@ int BLKFILMR2::BlockEval(PGLOBAL) break; } // endswitch Opc - if (trace) + if (trace(1)) htrc("BlockEval2: op=%d n=%d rc=%d\n", Opc, n, Result); return Result; @@ -567,7 +567,7 @@ int BLKSPCARI::BlockEval(PGLOBAL) break; } // endswitch Opc - if (trace) + if (trace(1)) htrc("BlockEval: op=%d n=%d rc=%d\n", Opc, n, Result); return Result; diff --git a/storage/connect/block.h b/storage/connect/block.h index 8ac7be809..737c74c12 100644 --- a/storage/connect/block.h +++ b/storage/connect/block.h @@ -38,8 +38,8 @@ typedef class BLOCK *PBLOCK; class DllExport BLOCK { public: void * operator new(size_t size, PGLOBAL g, void *p = NULL) { -// if (trace > 3) -// htrc("New BLOCK: size=%d g=%p p=%p\n", size, g, p); + if (trace(256)) + htrc("New BLOCK: size=%d g=%p p=%p\n", size, g, p); return (PlugSubAlloc(g, p, size)); } // end of new diff --git a/storage/connect/checklvl.h b/storage/connect/checklvl.h index 0c234dfb8..9029e616b 100644 --- a/storage/connect/checklvl.h +++ b/storage/connect/checklvl.h @@ -45,6 +45,7 @@ enum USETEMP {TMP_NO = 0, /* Never */ /***********************************************************************/ enum TYPCONV {TPC_NO = 0, /* Never */ TPC_YES = 1, /* Always */ - TPC_SKIP = 2}; /* Skip TEXT columns */ + TPC_FORCE = 2, /* Also convert BLOBs */ + TPC_SKIP = 3}; /* Skip TEXT columns */ #endif // _CHKLVL_DEFINED_ diff --git a/storage/connect/cmgoconn.cpp b/storage/connect/cmgoconn.cpp index 44fac5613..edee1874b 100644 --- a/storage/connect/cmgoconn.cpp +++ b/storage/connect/cmgoconn.cpp @@ -280,7 +280,7 @@ bool CMgoConn::MakeCursor(PGLOBAL g) all = true; if (Pcg->Pipe) { - if (trace) + if (trace(1)) htrc("Pipeline: %s\n", options); p = strrchr(options, ']'); @@ -330,7 +330,7 @@ bool CMgoConn::MakeCursor(PGLOBAL g) *(char*)p = ']'; // Restore Colist for discovery p = s->GetStr(); - if (trace) + if (trace(33)) htrc("New Pipeline: %s\n", p); Query = bson_new_from_json((const uint8_t *)p, -1, &Error); @@ -350,7 +350,7 @@ bool CMgoConn::MakeCursor(PGLOBAL g) } else { if (Pcg->Filter || filp) { - if (trace) { + if (trace(1)) { if (Pcg->Filter) htrc("Filter: %s\n", Pcg->Filter); @@ -377,7 +377,7 @@ bool CMgoConn::MakeCursor(PGLOBAL g) tp->SetFilter(NULL); // Not needed anymore } // endif To_Filter - if (trace) + if (trace(33)) htrc("selector: %s\n", s->GetStr()); s->Resize(s->GetLength() + 1); @@ -393,7 +393,7 @@ bool CMgoConn::MakeCursor(PGLOBAL g) if (!all) { if (options && *options) { - if (trace) + if (trace(1)) htrc("options=%s\n", options); p = options; @@ -450,10 +450,10 @@ int CMgoConn::ReadNext(PGLOBAL g) if (!Cursor && MakeCursor(g)) { rc = RC_FX; } else if (mongoc_cursor_next(Cursor, &Document)) { - if (trace > 1) { + if (trace(512)) { bson_iter_t iter; ShowDocument(&iter, Document, ""); - } else if (trace == 1) + } else if (trace(1)) htrc("%s\n", GetDocument(g)); } else if (mongoc_cursor_error(Cursor, &Error)) { @@ -589,7 +589,7 @@ int CMgoConn::Write(PGLOBAL g) if (DocWrite(g, Fpc)) return RC_FX; - if (trace) { + if (trace(2)) { char *str = bson_as_json(Fpc->Child, NULL); htrc("Inserting: %s\n", str); bson_free(str); @@ -623,7 +623,7 @@ int CMgoConn::Write(PGLOBAL g) } // endif iter if (b) { - if (trace) { + if (trace(2)) { char *str = bson_as_json(query, NULL); htrc("update query: %s\n", str); bson_free(str); diff --git a/storage/connect/colblk.cpp b/storage/connect/colblk.cpp index 2ffe51d20..a9cf43f3d 100644 --- a/storage/connect/colblk.cpp +++ b/storage/connect/colblk.cpp @@ -76,7 +76,7 @@ COLBLK::COLBLK(PCOL col1, PTDB tdbp) //To_Orig = col1; To_Tdb = tdbp; - if (trace > 1) + if (trace(2)) htrc(" copying COLBLK %s from %p to %p\n", Name, col1, this); if (tdbp) @@ -115,7 +115,7 @@ bool COLBLK::SetFormat(PGLOBAL, FORMAT& fmt) { fmt = Format; - if (trace > 1) + if (trace(2)) htrc("COLBLK: %p format=%c(%d,%d)\n", this, *fmt.Type, fmt.Length, fmt.Prec); @@ -128,7 +128,7 @@ bool COLBLK::SetFormat(PGLOBAL, FORMAT& fmt) /***********************************************************************/ bool COLBLK::Eval(PGLOBAL g) { - if (trace > 1) + if (trace(2)) htrc("Col Eval: %s status=%.4X\n", Name, Status); if (!GetStatus(BUF_READ)) { @@ -165,7 +165,7 @@ bool COLBLK::InitValue(PGLOBAL g) AddStatus(BUF_READY); Value->SetNullable(Nullable); - if (trace > 1) + if (trace(2)) htrc(" colp=%p type=%d value=%p coluse=%.4X status=%.4X\n", this, Buf_Type, Value, ColUse, Status); @@ -412,4 +412,3 @@ void SIDBLK::ReadColumn(PGLOBAL) // } // endif Sname } // end of ReadColumn - diff --git a/storage/connect/connect.cc b/storage/connect/connect.cc index 5e80201fc..39123b18c 100644 --- a/storage/connect/connect.cc +++ b/storage/connect/connect.cc @@ -92,7 +92,7 @@ void CntEndDB(PGLOBAL g) free(dbuserp); - if (trace) + if (trace(1)) htrc("CntEndDB: Freeing Dup\n"); g->Activityp->Aptr = NULL; @@ -112,14 +112,14 @@ bool CntCheckDB(PGLOBAL g, PHC handler, const char *pathname) bool rc= false; PDBUSER dbuserp= PlgGetUser(g); - if (trace) { + if (trace(1)) { printf("CntCheckDB: dbuserp=%p\n", dbuserp); } // endif trace if (!dbuserp || !handler) return true; - if (trace) + if (trace(1)) printf("cat=%p oldhandler=%p newhandler=%p\n", dbuserp->Catalog, (dbuserp->Catalog) ? ((MYCAT*)dbuserp->Catalog)->GetHandler() : NULL, handler); @@ -150,7 +150,7 @@ bool CntCheckDB(PGLOBAL g, PHC handler, const char *pathname) /*********************************************************************/ sprintf(g->Message, MSG(DATABASE_LOADED), "???"); - if (trace) + if (trace(1)) printf("msg=%s\n", g->Message); return rc; @@ -198,7 +198,7 @@ PTDB CntGetTDB(PGLOBAL g, LPCSTR name, MODE mode, PHC h) PDBUSER dup = PlgGetUser(g); volatile PCATLG cat = (dup) ? dup->Catalog : NULL; // Safe over throw - if (trace) + if (trace(1)) printf("CntGetTDB: name=%s mode=%d cat=%p\n", name, mode, cat); if (!cat) @@ -208,7 +208,7 @@ PTDB CntGetTDB(PGLOBAL g, LPCSTR name, MODE mode, PHC h) // Get table object from the catalog tabp = new(g) XTAB(name); - if (trace) + if (trace(1)) printf("CntGetTDB: tabp=%p\n", tabp); // Perhaps this should be made thread safe @@ -218,13 +218,13 @@ PTDB CntGetTDB(PGLOBAL g, LPCSTR name, MODE mode, PHC h) printf("CntGetTDB: %s\n", g->Message); } catch (int n) { - if (trace) + if (trace(1)) htrc("Exception %d: %s\n", n, g->Message); } catch (const char *msg) { strcpy(g->Message, msg); } // end catch - if (trace) + if (trace(1)) printf("Returning tdbp=%p mode=%d\n", tdbp, mode); return tdbp; @@ -243,7 +243,7 @@ bool CntOpenTable(PGLOBAL g, PTDB tdbp, MODE mode, char *c1, char *c2, //PCOLUMN cp; PDBUSER dup= PlgGetUser(g); - if (trace) + if (trace(1)) printf("CntOpenTable: tdbp=%p mode=%d\n", tdbp, mode); if (!tdbp) { @@ -260,7 +260,7 @@ bool CntOpenTable(PGLOBAL g, PTDB tdbp, MODE mode, char *c1, char *c2, } else for (p = c1; *p; p += n) { // Allocate only used column blocks - if (trace) + if (trace(1)) printf("Allocating column %s\n", p); g->Message[0] = 0; // To check whether ColDB made an error message @@ -325,7 +325,7 @@ bool CntOpenTable(PGLOBAL g, PTDB tdbp, MODE mode, char *c1, char *c2, tdbp->SetSetCols(tdbp->GetColumns()); // Now do open the physical table - if (trace) + if (trace(1)) printf("Opening table %s in mode %d tdbp=%p\n", tdbp->GetName(), mode, tdbp); @@ -341,7 +341,7 @@ bool CntOpenTable(PGLOBAL g, PTDB tdbp, MODE mode, char *c1, char *c2, } // endif del - if (trace) + if (trace(1)) printf("About to open the table: tdbp=%p\n", tdbp); if (mode != MODE_ANY && mode != MODE_ALTER) { @@ -356,7 +356,7 @@ bool CntOpenTable(PGLOBAL g, PTDB tdbp, MODE mode, char *c1, char *c2, rcop = false; } catch (int n) { - if (trace) + if (trace(1)) htrc("Exception %d: %s\n", n, g->Message); } catch (const char *msg) { strcpy(g->Message, msg); @@ -399,12 +399,13 @@ RCODE EvalColumns(PGLOBAL g, PTDB tdbp, bool reset, bool mrr) } // endfor colp } catch (int n) { - if (trace) + if (trace(1)) printf("Error %d reading columns: %s\n", n, g->Message); rc = RC_FX; } catch (const char *msg) { strcpy(g->Message, msg); + rc = RC_NF; } // end catch return rc; @@ -549,7 +550,7 @@ int CntCloseTable(PGLOBAL g, PTDB tdbp, bool nox, bool abort) return rc; } // endif !USE_OPEN - if (trace) + if (trace(1)) printf("CntCloseTable: tdbp=%p mode=%d nox=%d abort=%d\n", tdbp, tdbp->GetMode(), nox, abort); @@ -579,11 +580,11 @@ int CntCloseTable(PGLOBAL g, PTDB tdbp, bool nox, bool abort) tdbp->CloseDB(g); tdbp->SetAbort(false); - if (trace > 1) + if (trace(2)) printf("Table %s closed\n", tdbp->GetName()); if (!nox && tdbp->GetMode() != MODE_READ && tdbp->GetMode() != MODE_ANY) { - if (trace > 1) + if (trace(2)) printf("About to reset opt\n"); if (!tdbp->IsRemote()) { @@ -603,7 +604,7 @@ int CntCloseTable(PGLOBAL g, PTDB tdbp, bool nox, bool abort) rc = RC_FX; } // end catch - if (trace > 1) + if (trace(2)) htrc("Done rc=%d\n", rc); return (rc == RC_OK || rc == RC_INFO) ? 0 : rc; @@ -922,7 +923,7 @@ int CntIndexRange(PGLOBAL g, PTDB ptdb, const uchar* *key, uint *len, valp->SetBinValue((void*)p); #endif // !WORDS_BIGENDIAN - if (trace) { + if (trace(1)) { char bf[32]; printf("i=%d n=%d key=%s\n", i, n, valp->GetCharString(bf)); } // endif trace @@ -944,7 +945,7 @@ int CntIndexRange(PGLOBAL g, PTDB ptdb, const uchar* *key, uint *len, xbp->SetNval(n); - if (trace) + if (trace(1)) printf("xbp=%p Nval=%d i=%d incl=%d\n", xbp, n, i, incl[i]); k[i]= xbp->Range(g, i + 1, incl[i]); @@ -953,7 +954,7 @@ int CntIndexRange(PGLOBAL g, PTDB ptdb, const uchar* *key, uint *len, } // endfor i - if (trace) + if (trace(1)) printf("k1=%d k0=%d\n", k[1], k[0]); return k[1] - k[0]; diff --git a/storage/connect/csort.cpp b/storage/connect/csort.cpp index 13f325d8f..670131b8f 100644 --- a/storage/connect/csort.cpp +++ b/storage/connect/csort.cpp @@ -351,7 +351,7 @@ void CSORT::Qstx(int *base, int *max) zlo = zhi = cnm = 0; // Avoid warning message - lo = max - base; // Number of elements as longs + lo = (int)(max - base); // Number of elements as longs if (Dup) cnm = Cmpnum(lo); @@ -472,7 +472,7 @@ void CSORT::Qstx(int *base, int *max) i = him + 1; if (Pof) - Pof[him - Pex] = Pof[mid - Pex] = i - j; + Pof[him - Pex] = Pof[mid - Pex] = (int)(i - j); /*******************************************************************/ /* Look at sizes of the two partitions, do the smaller one first */ @@ -481,8 +481,8 @@ void CSORT::Qstx(int *base, int *max) /* But only repeat (recursively or by branching) if the partition */ /* is of at least size THRESH. */ /*******************************************************************/ - lo = j - base; - hi = max - i; + lo = (int)(j - base); + hi = (int)(max - i); if (Dup) { // Update progress information zlo = Cmpnum(lo); @@ -726,7 +726,7 @@ void CSORT::Qstc(int *base, int *max) zlo = zhi = cnm = 0; // Avoid warning message - lo = max - base; // Number of elements as longs + lo = (int)(max - base); // Number of elements as longs if (Dup) cnm = Cmpnum(lo); @@ -853,7 +853,7 @@ void CSORT::Qstc(int *base, int *max) /* the offset array values indicating break point and block size. */ /*******************************************************************/ if (Pof) - Pof[lt - Pex] = Pof[(jj - 1) - Pex] = jj - lt; + Pof[lt - Pex] = Pof[(jj - 1) - Pex] = (int)(jj - lt); /*******************************************************************/ /* Look at sizes of the two partitions, do the smaller one first */ @@ -862,8 +862,8 @@ void CSORT::Qstc(int *base, int *max) /* But only repeat (recursively or by branching) if the partition */ /* is of at least size THRESH. */ /*******************************************************************/ - lo = lt - base; - hi = gt - Swix; + lo = (int)(lt - base); + hi = (int)(gt - Swix); if (Dup) { // Update progress information zlo = Cmpnum(lo); diff --git a/storage/connect/domdoc.cpp b/storage/connect/domdoc.cpp index e24e10835..ba8eb829a 100644 --- a/storage/connect/domdoc.cpp +++ b/storage/connect/domdoc.cpp @@ -13,6 +13,7 @@ #elif defined(MSX4) #import "msxml4.dll" //Causes error C2872: DOMNodeType: ambiguous symbol ?? #elif defined(MSX6) +#pragma warning(suppress : 4192) #import "msxml6.dll" //Causes error C2872: DOMNodeType: ambiguous symbol ?? #else // MSX4 #error MSX? is not defined @@ -540,7 +541,7 @@ PXNODE DOMNODE::AddChildNode(PGLOBAL g, PCSZ name, PXNODE np) // If name has the format m[n] only m is taken as node name if ((p = strchr(name, '['))) - pn = BufAlloc(g, name, p - name); + pn = BufAlloc(g, name, (int)(p - name)); else pn = name; diff --git a/storage/connect/filamap.cpp b/storage/connect/filamap.cpp index 84dff422d..6e71e1bf2 100644 --- a/storage/connect/filamap.cpp +++ b/storage/connect/filamap.cpp @@ -90,7 +90,7 @@ int MAPFAM::GetFileLength(PGLOBAL g) len = (To_Fb && To_Fb->Count) ? To_Fb->Length : TXTFAM::GetFileLength(g); - if (trace) + if (trace(1)) htrc("Mapped file length=%d\n", len); return len; @@ -128,7 +128,7 @@ bool MAPFAM::OpenTableFile(PGLOBAL g) && fp->Count && fp->Mode == mode) break; - if (trace) + if (trace(1)) htrc("Mapping file, fp=%p\n", fp); } else @@ -166,7 +166,7 @@ bool MAPFAM::OpenTableFile(PGLOBAL g) sprintf(g->Message, MSG(OPEN_MODE_ERROR), "map", (int) rc, filename); - if (trace) + if (trace(1)) htrc("CreateFileMap: %s\n", g->Message); return (mode == MODE_READ && rc == ENOENT) @@ -227,7 +227,7 @@ bool MAPFAM::OpenTableFile(PGLOBAL g) Fpos = Mempos = Memory; Top = Memory + len; - if (trace) + if (trace(1)) htrc("fp=%p count=%d MapView=%p len=%d Top=%p\n", fp, fp->Count, Memory, len, Top); @@ -247,7 +247,7 @@ int MAPFAM::GetRowID(void) /***********************************************************************/ int MAPFAM::GetPos(void) { - return Fpos - Memory; + return (int)(Fpos - Memory); } // end of GetPos /***********************************************************************/ @@ -255,7 +255,7 @@ int MAPFAM::GetPos(void) /***********************************************************************/ int MAPFAM::GetNextPos(void) { - return Mempos - Memory; + return (int)(Mempos - Memory); } // end of GetNextPos /***********************************************************************/ @@ -368,7 +368,7 @@ int MAPFAM::ReadBuffer(PGLOBAL g) } // endif Mempos // Set caller line buffer - len = (Mempos - Fpos) - n; + len = (int)(Mempos - Fpos) - n; // Don't rely on ENDING setting if (len > 0 && *(Mempos - 2) == '\r') @@ -407,7 +407,7 @@ int MAPFAM::DeleteRecords(PGLOBAL g, int irc) { int n; - if (trace) + if (trace(1)) htrc("MAP DeleteDB: irc=%d mempos=%p tobuf=%p Tpos=%p Spos=%p\n", irc, Mempos, To_Buf, Tpos, Spos); @@ -417,7 +417,7 @@ int MAPFAM::DeleteRecords(PGLOBAL g, int irc) /*******************************************************************/ Fpos = Top; - if (trace) + if (trace(1)) htrc("Fpos placed at file top=%p\n", Fpos); } // endif irc @@ -428,14 +428,14 @@ int MAPFAM::DeleteRecords(PGLOBAL g, int irc) /* not required here, just setting of future Spos and Tpos. */ /*******************************************************************/ Tpos = Spos = Fpos; - } else if ((n = Fpos - Spos) > 0) { + } else if ((n = (int)(Fpos - Spos)) > 0) { /*******************************************************************/ /* Non consecutive line to delete. Move intermediate lines. */ /*******************************************************************/ memmove(Tpos, Spos, n); Tpos += n; - if (trace) + if (trace(1)) htrc("move %d bytes\n", n); } // endif n @@ -443,7 +443,7 @@ int MAPFAM::DeleteRecords(PGLOBAL g, int irc) if (irc == RC_OK) { Spos = Mempos; // New start position - if (trace) + if (trace(1)) htrc("after: Tpos=%p Spos=%p\n", Tpos, Spos); } else if (To_Fb) { // Can be NULL for deleted files @@ -461,7 +461,7 @@ int MAPFAM::DeleteRecords(PGLOBAL g, int irc) /*****************************************************************/ /* Remove extra records. */ /*****************************************************************/ - n = Tpos - Memory; + n = (int)(Tpos - Memory); #if defined(__WIN__) DWORD drc = SetFilePointer(fp->Handle, n, NULL, FILE_BEGIN); @@ -473,7 +473,7 @@ int MAPFAM::DeleteRecords(PGLOBAL g, int irc) return RC_FX; } // endif - if (trace) + if (trace(1)) htrc("done, Tpos=%p newsize=%d drc=%d\n", Tpos, n, drc); if (!SetEndOfFile(fp->Handle)) { @@ -511,7 +511,7 @@ void MAPFAM::CloseTableFile(PGLOBAL g, bool) PlugCloseFile(g, To_Fb); //To_Fb = NULL; // To get correct file size in Cardinality - if (trace) + if (trace(1)) htrc("MAP Close: closing %s count=%d\n", To_File, (To_Fb) ? To_Fb->Count : 0); @@ -627,7 +627,7 @@ int MBKFAM::ReadBuffer(PGLOBAL g) break; // Set caller line buffer - len = (Mempos - Fpos) - Ending; + len = (int)(Mempos - Fpos) - Ending; memcpy(Tdbp->GetLine(), Fpos, len); Tdbp->GetLine()[len] = '\0'; return RC_OK; diff --git a/storage/connect/filamdbf.cpp b/storage/connect/filamdbf.cpp index 44abd962c..893e3da0d 100644 --- a/storage/connect/filamdbf.cpp +++ b/storage/connect/filamdbf.cpp @@ -203,7 +203,7 @@ PQRYRES DBFColumns(PGLOBAL g, PCSZ dp, PCSZ fn, bool info) PQRYRES qrp; PCOLRES crp; - if (trace) + if (trace(1)) htrc("DBFColumns: File %s\n", SVP(fn)); if (!info) { @@ -245,7 +245,7 @@ PQRYRES DBFColumns(PGLOBAL g, PCSZ dp, PCSZ fn, bool info) return qrp; } // endif info - if (trace) { + if (trace(1)) { htrc("Structure of %s\n", filename); htrc("headlen=%hd reclen=%hd degree=%d\n", mainhead.Headlen(), mainhead.Reclen(), fields); @@ -271,7 +271,7 @@ PQRYRES DBFColumns(PGLOBAL g, PCSZ dp, PCSZ fn, bool info) } else len = thisfield.Length; - if (trace) + if (trace(1)) htrc("%-11s %c %6ld %3d %2d %3d %3d\n", thisfield.Name, thisfield.Type, thisfield.Offset, len, thisfield.Decimals, thisfield.Setfield, thisfield.Mdxfield); @@ -522,14 +522,14 @@ bool DBFFAM::OpenTableFile(PGLOBAL g) PlugSetPath(filename, To_File, Tdbp->GetPath()); if (!(Stream = PlugOpenFile(g, filename, opmode))) { - if (trace) + if (trace(1)) htrc("%s\n", g->Message); return (mode == MODE_READ && errno == ENOENT) ? PushWarning(g, Tdbp) : true; } // endif Stream - if (trace) + if (trace(1)) htrc("File %s is open in mode %s\n", filename, opmode); To_Fb = dbuserp->Openlist; // Keep track of File block @@ -938,7 +938,7 @@ void DBFFAM::CloseTableFile(PGLOBAL g, bool abort) rc = PlugCloseFile(g, To_Fb); fin: - if (trace) + if (trace(1)) htrc("DBF CloseTableFile: closing %s mode=%d wrc=%d rc=%d\n", To_File, mode, wrc, rc); diff --git a/storage/connect/filamfix.cpp b/storage/connect/filamfix.cpp index 1d6194b15..0a98ec5b5 100644 --- a/storage/connect/filamfix.cpp +++ b/storage/connect/filamfix.cpp @@ -322,7 +322,7 @@ int FIXFAM::ReadBuffer(PGLOBAL g) return RC_FX; } // endif fseek - if (trace > 1) + if (trace(2)) htrc("File position is now %d\n", ftell(Stream)); if (Padded) @@ -344,7 +344,7 @@ int FIXFAM::ReadBuffer(PGLOBAL g) sprintf(g->Message, MSG(READ_ERROR), To_File, strerror(errno)); #endif - if (trace) + if (trace(1)) htrc("%s\n", g->Message); return RC_FX; @@ -361,7 +361,7 @@ int FIXFAM::ReadBuffer(PGLOBAL g) /***********************************************************************/ int FIXFAM::WriteBuffer(PGLOBAL g) { - if (trace > 1) + if (trace(2)) htrc("FIX WriteDB: Mode=%d buf=%p line=%p Nrec=%d Rbuf=%d CurNum=%d\n", Tdbp->GetMode(), To_Buf, Tdbp->GetLine(), Nrec, Rbuf, CurNum); @@ -374,7 +374,7 @@ int FIXFAM::WriteBuffer(PGLOBAL g) return RC_OK; // We write only full blocks } // endif CurNum - if (trace > 1) + if (trace(2)) htrc(" First line is '%.*s'\n", Lrecl - 2, To_Buf); // Now start the writing process. @@ -388,7 +388,7 @@ int FIXFAM::WriteBuffer(PGLOBAL g) CurNum = 0; Tdbp->SetLine(To_Buf); - if (trace > 1) + if (trace(2)) htrc("write done\n"); } else { // Mode == MODE_UPDATE @@ -431,7 +431,7 @@ int FIXFAM::DeleteRecords(PGLOBAL g, int irc) /* file, and at the end erase all trailing records. */ /* This will be experimented. */ /*********************************************************************/ - if (trace > 1) + if (trace(2)) htrc("DOS DeleteDB: rc=%d UseTemp=%d Fpos=%d Tpos=%d Spos=%d\n", irc, UseTemp, Fpos, Tpos, Spos); @@ -441,7 +441,7 @@ int FIXFAM::DeleteRecords(PGLOBAL g, int irc) /*******************************************************************/ Fpos = Tdbp->Cardinality(g); - if (trace > 1) + if (trace(2)) htrc("Fpos placed at file end=%d\n", Fpos); } else // Fpos is the deleted line position @@ -491,7 +491,7 @@ int FIXFAM::DeleteRecords(PGLOBAL g, int irc) OldBlk = -2; // To force fseek to be executed on next block } // endif moved - if (trace > 1) + if (trace(2)) htrc("after: Tpos=%d Spos=%d\n", Tpos, Spos); } else { @@ -540,7 +540,7 @@ int FIXFAM::DeleteRecords(PGLOBAL g, int irc) close(h); - if (trace > 1) + if (trace(2)) htrc("done, h=%d irc=%d\n", h, irc); } // endif UseTemp @@ -572,7 +572,7 @@ bool FIXFAM::MoveIntermediateLines(PGLOBAL g, bool *b) req = (size_t)MY_MIN(n, Dbflen); len = fread(DelBuf, Lrecl, req, Stream); - if (trace > 1) + if (trace(2)) htrc("after read req=%d len=%d\n", req, len); if (len != req) { @@ -591,13 +591,13 @@ bool FIXFAM::MoveIntermediateLines(PGLOBAL g, bool *b) return true; } // endif - if (trace > 1) + if (trace(2)) htrc("after write pos=%d\n", ftell(Stream)); Tpos += (int)req; Spos += (int)req; - if (trace > 1) + if (trace(2)) htrc("loop: Tpos=%d Spos=%d\n", Tpos, Spos); *b = true; @@ -648,7 +648,7 @@ void FIXFAM::CloseTableFile(PGLOBAL g, bool abort) rc = PlugCloseFile(g, To_Fb); fin: - if (trace) + if (trace(1)) htrc("FIX CloseTableFile: closing %s mode=%d wrc=%d rc=%d\n", To_File, mode, wrc, rc); @@ -718,7 +718,7 @@ int BGXFAM::BigRead(PGLOBAL g __attribute__((unused)), DWORD nbr, drc, len = (DWORD)req; bool brc = ReadFile(h, inbuf, len, &nbr, NULL); - if (trace > 1) + if (trace(2)) htrc("after read req=%d brc=%d nbr=%d\n", req, brc, nbr); if (!brc) { @@ -730,7 +730,7 @@ int BGXFAM::BigRead(PGLOBAL g __attribute__((unused)), (LPTSTR)buf, sizeof(buf), NULL); sprintf(g->Message, MSG(READ_ERROR), To_File, buf); - if (trace > 1) + if (trace(2)) htrc("BIGREAD: %s\n", g->Message); rc = -1; @@ -757,7 +757,7 @@ bool BGXFAM::BigWrite(PGLOBAL g, HANDLE h, void *inbuf, int req) DWORD nbw, drc, len = (DWORD)req; bool brc = WriteFile(h, inbuf, len, &nbw, NULL); - if (trace > 1) + if (trace(2)) htrc("after write req=%d brc=%d nbw=%d\n", req, brc, nbw); if (!brc || nbw != len) { @@ -775,7 +775,7 @@ bool BGXFAM::BigWrite(PGLOBAL g, HANDLE h, void *inbuf, int req) sprintf(g->Message, MSG(WRITE_STRERROR), fn, buf); - if (trace > 1) + if (trace(2)) htrc("BIGWRITE: nbw=%d len=%d errno=%d %s\n", nbw, len, drc, g->Message); @@ -790,7 +790,7 @@ bool BGXFAM::BigWrite(PGLOBAL g, HANDLE h, void *inbuf, int req) sprintf(g->Message, MSG(WRITE_STRERROR), fn, strerror(errno)); - if (trace > 1) + if (trace(2)) htrc("BIGWRITE: nbw=%d len=%d errno=%d %s\n", nbw, len, errno, g->Message); @@ -828,7 +828,7 @@ bool BGXFAM::OpenTableFile(PGLOBAL g) PlugSetPath(filename, To_File, Tdbp->GetPath()); - if (trace) + if (trace(1)) htrc("OpenTableFile: filename=%s mode=%d\n", filename, mode); #if defined(__WIN__) @@ -888,7 +888,7 @@ bool BGXFAM::OpenTableFile(PGLOBAL g) } else rc = 0; - if (trace > 1) + if (trace(2)) htrc(" rc=%d access=%p share=%p creation=%d handle=%p fn=%s\n", rc, access, share, creation, Hfile, filename); @@ -942,7 +942,7 @@ bool BGXFAM::OpenTableFile(PGLOBAL g) } else rc = 0; - if (trace > 1) + if (trace(2)) htrc(" rc=%d oflag=%p tmode=%p handle=%p fn=%s\n", rc, oflag, tmode, Hfile, filename); @@ -1026,11 +1026,11 @@ int BGXFAM::Cardinality(PGLOBAL g) if (Hfile == INVALID_HANDLE_VALUE) { int h = open64(filename, O_RDONLY, 0); - if (trace) + if (trace(1)) htrc(" h=%d\n", h); if (h == INVALID_HANDLE_VALUE) { - if (trace) + if (trace(1)) htrc(" errno=%d ENOENT=%d\n", errno, ENOENT); if (errno != ENOENT) { @@ -1074,7 +1074,7 @@ int BGXFAM::Cardinality(PGLOBAL g) } else card = (int)(fsize / (BIGINT)Lrecl); // Fixed length file - if (trace) + if (trace(1)) htrc(" Computed max_K=%d fsize=%lf lrecl=%d\n", card, (double)fsize, Lrecl); @@ -1181,7 +1181,7 @@ int BGXFAM::ReadBuffer(PGLOBAL g) if (BigSeek(g, Hfile, (BIGINT)Fpos * (BIGINT)Lrecl)) return RC_FX; - if (trace > 1) + if (trace(2)) htrc("File position is now %d\n", Fpos); nbr = BigRead(g, Hfile, To_Buf, (Padded) ? Blksize : Lrecl * Nrec); @@ -1205,7 +1205,7 @@ int BGXFAM::ReadBuffer(PGLOBAL g) /***********************************************************************/ int BGXFAM::WriteBuffer(PGLOBAL g) { - if (trace > 1) + if (trace(2)) htrc("BIG WriteDB: Mode=%d buf=%p line=%p Nrec=%d Rbuf=%d CurNum=%d\n", Tdbp->GetMode(), To_Buf, Tdbp->GetLine(), Nrec, Rbuf, CurNum); @@ -1218,7 +1218,7 @@ int BGXFAM::WriteBuffer(PGLOBAL g) return RC_OK; // We write only full blocks } // endif CurNum - if (trace > 1) + if (trace(2)) htrc(" First line is '%.*s'\n", Lrecl - 2, To_Buf); // Now start the writing process. @@ -1229,7 +1229,7 @@ int BGXFAM::WriteBuffer(PGLOBAL g) CurNum = 0; Tdbp->SetLine(To_Buf); - if (trace > 1) + if (trace(2)) htrc("write done\n"); } else { // Mode == MODE_UPDATE @@ -1270,7 +1270,7 @@ int BGXFAM::DeleteRecords(PGLOBAL g, int irc) /* file, and at the end erase all trailing records. */ /* This will be experimented. */ /*********************************************************************/ - if (trace > 1) + if (trace(2)) htrc("BGX DeleteDB: rc=%d UseTemp=%d Fpos=%d Tpos=%d Spos=%d\n", irc, UseTemp, Fpos, Tpos, Spos); @@ -1280,7 +1280,7 @@ int BGXFAM::DeleteRecords(PGLOBAL g, int irc) /*******************************************************************/ Fpos = Tdbp->Cardinality(g); - if (trace > 1) + if (trace(2)) htrc("Fpos placed at file end=%d\n", Fpos); } else // Fpos is the deleted line position @@ -1318,7 +1318,7 @@ int BGXFAM::DeleteRecords(PGLOBAL g, int irc) return RC_FX; if (irc == RC_OK) { - if (trace) + if (trace(1)) assert(Spos == Fpos); Spos++; // New start position is on next line @@ -1330,7 +1330,7 @@ int BGXFAM::DeleteRecords(PGLOBAL g, int irc) OldBlk = -2; // To force fseek to be executed on next block } // endif moved - if (trace > 1) + if (trace(2)) htrc("after: Tpos=%d Spos=%d\n", Tpos, Spos); } else if (irc != RC_OK) { @@ -1459,7 +1459,7 @@ bool BGXFAM::MoveIntermediateLines(PGLOBAL g, bool *b) Tpos += (int)req; Spos += (int)req; - if (trace > 1) + if (trace(2)) htrc("loop: Tpos=%d Spos=%d\n", Tpos, Spos); *b = true; @@ -1510,7 +1510,7 @@ void BGXFAM::CloseTableFile(PGLOBAL g, bool abort) rc = PlugCloseFile(g, To_Fb); fin: - if (trace) + if (trace(1)) htrc("BGX CloseTableFile: closing %s mode=%d wrc=%d rc=%d\n", To_File, mode, wrc, rc); diff --git a/storage/connect/filamgz.cpp b/storage/connect/filamgz.cpp index df366ef15..880db54c9 100644 --- a/storage/connect/filamgz.cpp +++ b/storage/connect/filamgz.cpp @@ -203,7 +203,7 @@ bool GZFAM::AllocateBuffer(PGLOBAL g) Buflen = Lrecl + 2; // Lrecl does not include CRLF //Buflen *= ((Mode == MODE_DELETE) ? DOS_BUFF_LEN : 1); NIY - if (trace) + if (trace(1)) htrc("SubAllocating a buffer of %d bytes\n", Buflen); To_Buf = (char*)PlugSubAlloc(g, NULL, Buflen); @@ -347,7 +347,7 @@ int GZFAM::ReadBuffer(PGLOBAL g) } else rc = Zerror(g); - if (trace > 1) + if (trace(2)) htrc(" Read: '%s' rc=%d\n", To_Buf, rc); return rc; @@ -389,7 +389,7 @@ void GZFAM::CloseTableFile(PGLOBAL, bool) { int rc = gzclose(Zfile); - if (trace) + if (trace(1)) htrc("GZ CloseDB: closing %s rc=%d\n", To_File, rc); Zfile = NULL; // So we can know whether table is open @@ -537,7 +537,7 @@ int ZBKFAM::ReadBuffer(PGLOBAL g) while (*NxtLine++ != '\n') ; // Set caller line buffer - n = NxtLine - CurLine - Ending; + n = (int)(NxtLine - CurLine - Ending); memcpy(Tdbp->GetLine(), CurLine, n); Tdbp->GetLine()[n] = '\0'; return RC_OK; @@ -588,7 +588,7 @@ int ZBKFAM::ReadBuffer(PGLOBAL g) for (NxtLine = CurLine; *NxtLine++ != '\n';) ; // Set caller line buffer - n = NxtLine - CurLine - Ending; + n = (int)(NxtLine - CurLine - Ending); memcpy(Tdbp->GetLine(), CurLine, n); Tdbp->GetLine()[n] = '\0'; Rbuf = (CurBlk == Block - 1) ? Last : Nrec; @@ -702,7 +702,7 @@ void ZBKFAM::CloseTableFile(PGLOBAL g, bool) } else rc = gzclose(Zfile); - if (trace) + if (trace(1)) htrc("GZ CloseDB: closing %s rc=%d\n", To_File, rc); Zfile = NULL; // So we can know whether table is open @@ -1087,7 +1087,7 @@ bool ZLBFAM::SetPos(PGLOBAL g, int pos __attribute__((unused))) /***********************************************************************/ int ZLBFAM::ReadBuffer(PGLOBAL g) { - int n; + size_t n; void *rdbuf; /*********************************************************************/ @@ -1299,7 +1299,7 @@ int ZLBFAM::WriteBuffer(PGLOBAL g) else NxtLine = CurLine + Lrecl; - BlkLen = NxtLine - To_Buf; + BlkLen = (int)(NxtLine - To_Buf); if (WriteCompressedBuffer(g)) { Closing = TRUE; // To tell CloseDB about a Write error @@ -1382,7 +1382,7 @@ void ZLBFAM::CloseTableFile(PGLOBAL g, bool) } else rc = fclose(Stream); - if (trace) + if (trace(1)) htrc("ZLB CloseTableFile: closing %s mode=%d rc=%d\n", To_File, Tdbp->GetMode(), rc); @@ -1408,7 +1408,7 @@ void ZLBFAM::Rewind(void) rewind(Stream); - if (!(st = fread(Zlenp, sizeof(int), 1, Stream)) && trace) + if (!(st = fread(Zlenp, sizeof(int), 1, Stream)) && trace(1)) htrc("fread error %d in Rewind", errno); fseek(Stream, *Zlenp + sizeof(int), SEEK_SET); diff --git a/storage/connect/filamtxt.cpp b/storage/connect/filamtxt.cpp index c456ee9e9..7c222eb3c 100644 --- a/storage/connect/filamtxt.cpp +++ b/storage/connect/filamtxt.cpp @@ -194,12 +194,12 @@ int TXTFAM::GetFileLength(PGLOBAL g) PlugSetPath(filename, To_File, Tdbp->GetPath()); h= global_open(g, MSGID_OPEN_MODE_STRERROR, filename, _O_RDONLY); - if (trace) + if (trace(1)) htrc("GetFileLength: fn=%s h=%d\n", filename, h); if (h == -1) { if (errno != ENOENT) { - if (trace) + if (trace(1)) htrc("%s\n", g->Message); len = -1; @@ -249,7 +249,7 @@ int TXTFAM::Cardinality(PGLOBAL g) } // endif Padded - if (trace) + if (trace(1)) htrc(" Computed max_K=%d Filen=%d lrecl=%d\n", card, len, Lrecl); @@ -390,7 +390,7 @@ int TXTFAM::UpdateSortedRows(PGLOBAL g) return RC_OK; err: - if (trace) + if (trace(1)) htrc("%s\n", g->Message); return RC_FX; @@ -439,7 +439,7 @@ int TXTFAM::DeleteSortedRows(PGLOBAL g) return RC_OK; err: - if (trace) + if (trace(1)) htrc("%s\n", g->Message); return RC_FX; @@ -512,7 +512,7 @@ int DOSFAM::GetFileLength(PGLOBAL g) if ((len = _filelength(_fileno(Stream))) < 0) sprintf(g->Message, MSG(FILELEN_ERROR), "_filelength", To_File); - if (trace) + if (trace(1)) htrc("File length=%d\n", len); return len; @@ -598,14 +598,14 @@ bool DOSFAM::OpenTableFile(PGLOBAL g) PlugSetPath(filename, To_File, Tdbp->GetPath()); if (!(Stream = PlugOpenFile(g, filename, opmode))) { - if (trace) + if (trace(1)) htrc("%s\n", g->Message); return (mode == MODE_READ && errno == ENOENT) ? PushWarning(g, Tdbp) : true; } // endif Stream - if (trace) + if (trace(1)) htrc("File %s open Stream=%p mode=%s\n", filename, Stream, opmode); To_Fb = dbuserp->Openlist; // Keep track of File block @@ -628,7 +628,7 @@ bool DOSFAM::AllocateBuffer(PGLOBAL g) // Lrecl does not include line ending Buflen = Lrecl + Ending + ((Bin) ? 1 : 0) + 1; // Sergei - if (trace) + if (trace(1)) htrc("SubAllocating a buffer of %d bytes\n", Buflen); To_Buf = (char*)PlugSubAlloc(g, NULL, Buflen); @@ -768,7 +768,7 @@ int DOSFAM::ReadBuffer(PGLOBAL g) if (!Stream) return RC_EF; - if (trace > 1) + if (trace(2)) htrc("ReadBuffer: Tdbp=%p To_Line=%p Placed=%d\n", Tdbp, Tdbp->To_Line, Placed); @@ -782,7 +782,7 @@ int DOSFAM::ReadBuffer(PGLOBAL g) CurBlk = (int)Rows++; - if (trace > 1) + if (trace(2)) htrc("ReadBuffer: CurBlk=%d\n", CurBlk); /********************************************************************/ @@ -803,14 +803,14 @@ int DOSFAM::ReadBuffer(PGLOBAL g) } else Placed = false; - if (trace > 1) + if (trace(2)) htrc(" About to read: stream=%p To_Buf=%p Buflen=%d\n", Stream, To_Buf, Buflen); if (fgets(To_Buf, Buflen, Stream)) { p = To_Buf + strlen(To_Buf) - 1; - if (trace > 1) + if (trace(2)) htrc(" Read: To_Buf=%p p=%c\n", To_Buf, To_Buf, p); #if defined(__WIN__) @@ -838,7 +838,7 @@ int DOSFAM::ReadBuffer(PGLOBAL g) } else if (*p == '\n') *p = '\0'; // Eliminate ending new-line character - if (trace > 1) + if (trace(2)) htrc(" To_Buf='%s'\n", To_Buf); strcpy(Tdbp->To_Line, To_Buf); @@ -853,13 +853,13 @@ int DOSFAM::ReadBuffer(PGLOBAL g) sprintf(g->Message, MSG(READ_ERROR), To_File, strerror(0)); #endif - if (trace) + if (trace(1)) htrc("%s\n", g->Message); rc = RC_FX; } // endif's fgets - if (trace > 1) + if (trace(2)) htrc("ReadBuffer: rc=%d\n", rc); IsRead = true; @@ -895,7 +895,7 @@ int DOSFAM::WriteBuffer(PGLOBAL g) /*******************************************************************/ curpos = ftell(Stream); - if (trace) + if (trace(1)) htrc("Last : %d cur: %d\n", Fpos, curpos); if (UseTemp) { @@ -937,7 +937,7 @@ int DOSFAM::WriteBuffer(PGLOBAL g) return RC_FX; } // endif - if (trace) + if (trace(1)) htrc("write done\n"); return RC_OK; @@ -960,7 +960,7 @@ int DOSFAM::DeleteRecords(PGLOBAL g, int irc) /* file, and at the end erase all trailing records. */ /* This will be experimented. */ /*********************************************************************/ - if (trace) + if (trace(1)) htrc( "DOS DeleteDB: rc=%d UseTemp=%d curpos=%d Fpos=%d Tpos=%d Spos=%d\n", irc, UseTemp, curpos, Fpos, Tpos, Spos); @@ -972,7 +972,7 @@ int DOSFAM::DeleteRecords(PGLOBAL g, int irc) fseek(Stream, 0, SEEK_END); Fpos = ftell(Stream); - if (trace) + if (trace(1)) htrc("Fpos placed at file end=%d\n", Fpos); } // endif irc @@ -1015,7 +1015,7 @@ int DOSFAM::DeleteRecords(PGLOBAL g, int irc) Spos = GetNextPos(); // New start position - if (trace) + if (trace(1)) htrc("after: Tpos=%d Spos=%d\n", Tpos, Spos); } else { @@ -1058,7 +1058,7 @@ int DOSFAM::DeleteRecords(PGLOBAL g, int irc) close(h); - if (trace) + if (trace(1)) htrc("done, h=%d irc=%d\n", h, irc); } // endif !UseTemp @@ -1083,7 +1083,7 @@ bool DOSFAM::OpenTempFile(PGLOBAL g) strcat(PlugRemoveType(tempname, tempname), ".t"); if (!(T_Stream = PlugOpenFile(g, tempname, "wb"))) { - if (trace) + if (trace(1)) htrc("%s\n", g->Message); rc = true; @@ -1112,7 +1112,7 @@ bool DOSFAM::MoveIntermediateLines(PGLOBAL g, bool *b) req = (size_t)MY_MIN(n, Dbflen); len = fread(DelBuf, 1, req, Stream); - if (trace) + if (trace(1)) htrc("after read req=%d len=%d\n", req, len); if (len != req) { @@ -1131,13 +1131,13 @@ bool DOSFAM::MoveIntermediateLines(PGLOBAL g, bool *b) return true; } // endif - if (trace) + if (trace(1)) htrc("after write pos=%d\n", ftell(Stream)); Tpos += (int)req; Spos += (int)req; - if (trace) + if (trace(1)) htrc("loop: Tpos=%d Spos=%d\n", Tpos, Spos); *b = true; @@ -1217,7 +1217,7 @@ void DOSFAM::CloseTableFile(PGLOBAL g, bool abort) } else { rc = PlugCloseFile(g, To_Fb); - if (trace) + if (trace(1)) htrc("DOS Close: closing %s rc=%d\n", To_File, rc); } // endif UseTemp @@ -1351,7 +1351,7 @@ int BLKFAM::GetPos(void) /***********************************************************************/ int BLKFAM::GetNextPos(void) { - return Fpos + NxtLine - CurLine; + return (int)(Fpos + NxtLine - CurLine); } // end of GetNextPos /***********************************************************************/ @@ -1396,7 +1396,8 @@ int BLKFAM::SkipRecord(PGLOBAL, bool header) /***********************************************************************/ int BLKFAM::ReadBuffer(PGLOBAL g) { - int i, n, rc = RC_OK; + int i, rc = RC_OK; + size_t n; /*********************************************************************/ /* Sequential reading when Placed is not true. */ @@ -1452,13 +1453,13 @@ int BLKFAM::ReadBuffer(PGLOBAL g) // Calculate the length of block to read BlkLen = BlkPos[CurBlk + 1] - BlkPos[CurBlk]; - if (trace) + if (trace(1)) htrc("File position is now %d\n", ftell(Stream)); // Read the entire next block n = fread(To_Buf, 1, (size_t)BlkLen, Stream); - if (n == BlkLen) { + if ((size_t) n == (size_t) BlkLen) { // ReadBlks++; num_read++; Rbuf = (CurBlk == Block - 1) ? Last : Nrec; @@ -1486,7 +1487,7 @@ int BLKFAM::ReadBuffer(PGLOBAL g) sprintf(g->Message, MSG(READ_ERROR), To_File, strerror(errno)); #endif - if (trace) + if (trace(1)) htrc("%s\n", g->Message); return RC_FX; @@ -1497,7 +1498,7 @@ int BLKFAM::ReadBuffer(PGLOBAL g) fin: // Store the current record file position for Delete and Update - Fpos = BlkPos[CurBlk] + CurLine - To_Buf; + Fpos = (int)(BlkPos[CurBlk] + CurLine - To_Buf); return rc; } // end of ReadBuffer @@ -1524,7 +1525,7 @@ int BLKFAM::WriteBuffer(PGLOBAL g) // Now start the writing process. NxtLine = CurLine + strlen(CurLine); - BlkLen = NxtLine - To_Buf; + BlkLen = (int)(NxtLine - To_Buf); if (fwrite(To_Buf, 1, BlkLen, Stream) != (size_t)BlkLen) { sprintf(g->Message, MSG(FWRITE_ERROR), strerror(errno)); @@ -1636,7 +1637,7 @@ void BLKFAM::CloseTableFile(PGLOBAL g, bool abort) rc = PlugCloseFile(g, To_Fb); - if (trace) + if (trace(1)) htrc("BLK CloseTableFile: closing %s mode=%d wrc=%d rc=%d\n", To_File, Tdbp->GetMode(), wrc, rc); diff --git a/storage/connect/filamvct.cpp b/storage/connect/filamvct.cpp index 871613cb4..244acfdc5 100755 --- a/storage/connect/filamvct.cpp +++ b/storage/connect/filamvct.cpp @@ -336,7 +336,7 @@ int VCTFAM::Cardinality(PGLOBAL g) else sprintf(g->Message, MSG(NOT_FIXED_LEN), To_File, len, clen); - if (trace) + if (trace(1)) htrc(" Computed max_K=%d Filen=%d Clen=%d\n", card, len, clen); } else @@ -469,14 +469,14 @@ bool VCTFAM::OpenTableFile(PGLOBAL g) PlugSetPath(filename, To_File, Tdbp->GetPath()); if (!(Stream = PlugOpenFile(g, filename, opmode))) { - if (trace) + if (trace(1)) htrc("%s\n", g->Message); return (mode == MODE_READ && errno == ENOENT) ? PushWarning(g, Tdbp) : true; } // endif Stream - if (trace) + if (trace(1)) htrc("File %s is open in mode %s\n", filename, opmode); To_Fb = dbuserp->Openlist; // Keep track of File block @@ -581,7 +581,7 @@ bool VCTFAM::InitInsert(PGLOBAL g) cp->ReadBlock(g); } catch (int n) { - if (trace) + if (trace(1)) htrc("Exception %d: %s\n", n, g->Message); rc = true; } catch (const char *msg) { @@ -652,7 +652,7 @@ int VCTFAM::ReadBuffer(PGLOBAL g) OldBlk = CurBlk; // Last block actually read } // endif oldblk - if (trace) + if (trace(1)) htrc(" Read: CurNum=%d CurBlk=%d rc=%d\n", CurNum, CurBlk, RC_OK); return rc; @@ -663,7 +663,7 @@ int VCTFAM::ReadBuffer(PGLOBAL g) /***********************************************************************/ int VCTFAM::WriteBuffer(PGLOBAL g) { - if (trace) + if (trace(1)) htrc("VCT WriteBuffer: R%d Mode=%d CurNum=%d CurBlk=%d\n", Tdbp->GetTdb_No(), Tdbp->GetMode(), CurNum, CurBlk); @@ -756,7 +756,7 @@ int VCTFAM::DeleteRecords(PGLOBAL g, int irc) { bool eof = false; - if (trace) + if (trace(1)) htrc("VCT DeleteDB: rc=%d UseTemp=%d Fpos=%d Tpos=%d Spos=%d\n", irc, UseTemp, Fpos, Tpos, Spos); @@ -766,7 +766,7 @@ int VCTFAM::DeleteRecords(PGLOBAL g, int irc) /*******************************************************************/ Fpos = (Block - 1) * Nrec + Last; - if (trace) + if (trace(1)) htrc("Fpos placed at file end=%d\n", Fpos); eof = UseTemp && !MaxBlk; @@ -807,7 +807,7 @@ int VCTFAM::DeleteRecords(PGLOBAL g, int irc) #endif Spos++; // New start position is on next line - if (trace) + if (trace(1)) htrc("after: Tpos=%d Spos=%d\n", Tpos, Spos); } else { @@ -856,7 +856,7 @@ int VCTFAM::DeleteRecords(PGLOBAL g, int irc) close(h); - if (trace) + if (trace(1)) htrc("done, h=%d irc=%d\n", h, irc); } else @@ -899,7 +899,7 @@ bool VCTFAM::OpenTempFile(PGLOBAL g) opmode = "wb"; if (!(T_Stream = PlugOpenFile(g, tempname, opmode))) { - if (trace) + if (trace(1)) htrc("%s\n", g->Message); rc = true; @@ -947,7 +947,7 @@ bool VCTFAM::MoveIntermediateLines(PGLOBAL g, bool *b) len = fread(To_Buf, Clens[i], req, Stream); - if (trace) + if (trace(1)) htrc("after read req=%d len=%d\n", req, len); if (len != req) { @@ -976,7 +976,7 @@ bool VCTFAM::MoveIntermediateLines(PGLOBAL g, bool *b) } // endif UseTemp - if (trace) + if (trace(1)) htrc("after write pos=%d\n", ftell(Stream)); } // endfor i @@ -1007,7 +1007,7 @@ bool VCTFAM::MoveIntermediateLines(PGLOBAL g, bool *b) } // endif UseTemp - if (trace) + if (trace(1)) htrc("loop: Tpos=%d Spos=%d\n", Tpos, Spos); } // endfor n @@ -1144,7 +1144,7 @@ void VCTFAM::CloseTableFile(PGLOBAL g, bool abort) if (!(UseTemp && T_Stream)) rc = PlugCloseFile(g, To_Fb); - if (trace) + if (trace(1)) htrc("VCT CloseTableFile: closing %s wrc=%d rc=%d\n", To_File, wrc, rc); @@ -1217,7 +1217,7 @@ bool VCTFAM::ReadBlock(PGLOBAL g, PVCTCOL colp) else // Blocked vector format len = Nrec * (colp->Deplac + Lrecl * CurBlk); - if (trace) + if (trace(1)) htrc("len=%d Nrec=%d Deplac=%d Lrecl=%d CurBlk=%d maxblk=%d\n", len, Nrec, colp->Deplac, Lrecl, CurBlk, MaxBlk); @@ -1236,13 +1236,13 @@ bool VCTFAM::ReadBlock(PGLOBAL g, PVCTCOL colp) sprintf(g->Message, MSG(READ_ERROR), To_File, strerror(errno)); - if (trace) + if (trace(1)) htrc(" Read error: %s\n", g->Message); return true; } // endif - if (trace) + if (trace(1)) num_read++; return false; @@ -1268,7 +1268,7 @@ bool VCTFAM::WriteBlock(PGLOBAL g, PVCTCOL colp) else // Old VCT format len = Nrec * (colp->Deplac + Lrecl * colp->ColBlk); - if (trace) + if (trace(1)) htrc("modif=%d len=%d Nrec=%d Deplac=%d Lrecl=%d colblk=%d\n", Modif, len, Nrec, colp->Deplac, Lrecl, colp->ColBlk); @@ -1287,7 +1287,7 @@ bool VCTFAM::WriteBlock(PGLOBAL g, PVCTCOL colp) sprintf(g->Message, MSG(WRITE_STRERROR), (UseTemp) ? To_Fbt->Fname : To_File, strerror(errno)); - if (trace) + if (trace(1)) htrc("Write error: %s\n", strerror(errno)); return true; @@ -1358,7 +1358,7 @@ bool VCMFAM::OpenTableFile(PGLOBAL g) && fp->Count && fp->Mode == mode) break; - if (trace) + if (trace(1)) htrc("Mapping VCM file, fp=%p cnt=%d\n", fp, fp->Count); } else @@ -1416,7 +1416,7 @@ bool VCMFAM::OpenTableFile(PGLOBAL g) sprintf(g->Message, MSG(OPEN_MODE_ERROR), "map", (int) rc, filename); - if (trace) + if (trace(1)) htrc("%s\n", g->Message); return (mode == MODE_READ && rc == ENOENT) @@ -1467,7 +1467,7 @@ bool VCMFAM::OpenTableFile(PGLOBAL g) To_Fb = fp; // Useful when closing - if (trace) + if (trace(1)) htrc("fp=%p count=%d MapView=%p len=%d Top=%p\n", fp, fp->Count, Memory, len); @@ -1551,7 +1551,7 @@ bool VCMFAM::InitInsert(PGLOBAL g) cp->ReadBlock(g); } catch (int n) { - if (trace) + if (trace(1)) htrc("Exception %d: %s\n", n, g->Message); rc = true; } catch (const char *msg) { @@ -1567,7 +1567,7 @@ bool VCMFAM::InitInsert(PGLOBAL g) /***********************************************************************/ int VCMFAM::WriteBuffer(PGLOBAL g) { - if (trace) + if (trace(1)) htrc("VCM WriteBuffer: R%d Mode=%d CurNum=%d CurBlk=%d\n", Tdbp->GetTdb_No(), Tdbp->GetMode(), CurNum, CurBlk); @@ -1608,7 +1608,7 @@ int VCMFAM::WriteBuffer(PGLOBAL g) /***********************************************************************/ int VCMFAM::DeleteRecords(PGLOBAL g, int irc) { - if (trace) + if (trace(1)) htrc("VCM DeleteDB: irc=%d tobuf=%p Tpos=%p Spos=%p\n", irc, To_Buf, Tpos, Spos); @@ -1618,7 +1618,7 @@ int VCMFAM::DeleteRecords(PGLOBAL g, int irc) /*******************************************************************/ Fpos = (Block - 1) * Nrec + Last; - if (trace) + if (trace(1)) htrc("Fpos placed at file top=%p\n", Fpos); } else // Fpos is the Deleted line position @@ -1636,7 +1636,7 @@ int VCMFAM::DeleteRecords(PGLOBAL g, int irc) if (irc == RC_OK) { Spos = Fpos + 1; // New start position - if (trace) + if (trace(1)) htrc("after: Tpos=%p Spos=%p\n", Tpos, Spos); } else { @@ -1680,7 +1680,7 @@ int VCMFAM::DeleteRecords(PGLOBAL g, int irc) return RC_FX; } // endif - if (trace) + if (trace(1)) htrc("done, Tpos=%p newsize=%d drc=%d\n", Tpos, n, drc); if (!SetEndOfFile(fp->Handle)) { @@ -1755,7 +1755,7 @@ bool VCMFAM::MoveIntermediateLines(PGLOBAL, bool *) Tpos += n; } // endif MaxBlk - if (trace) + if (trace(1)) htrc("move %d bytes\n", n); } // endif n @@ -1812,14 +1812,14 @@ bool VCMFAM::ReadBlock(PGLOBAL, PVCTCOL colp) /*********************************************************************/ mempos = Memcol[i] + n * CurBlk; - if (trace) + if (trace(1)) htrc("mempos=%p i=%d Nrec=%d Clen=%d CurBlk=%d\n", mempos, i, Nrec, colp->Clen, CurBlk); if (colp->GetStatus(BUF_MAPPED)) colp->Blk->SetValPointer(mempos); - if (trace) + if (trace(1)) num_read++; return false; @@ -1843,7 +1843,7 @@ bool VCMFAM::WriteBlock(PGLOBAL, PVCTCOL colp __attribute__((unused))) /*********************************************************************/ mempos = Memcol[i] + n * CurBlk; - if (trace) + if (trace(1)) htrc("modif=%d mempos=%p i=%d Nrec=%d Clen=%d colblk=%d\n", Modif, mempos, i, Nrec, colp->Clen, colp->ColBlk); @@ -2008,14 +2008,14 @@ bool VECFAM::OpenColumnFile(PGLOBAL g, PCSZ opmode, int i) sprintf(filename, Colfn, i+1); if (!(Streams[i] = PlugOpenFile(g, filename, opmode))) { - if (trace) + if (trace(1)) htrc("%s\n", g->Message); return (Tdbp->GetMode() == MODE_READ && errno == ENOENT) ? PushWarning(g, Tdbp) : true; } // endif Streams - if (trace) + if (trace(1)) htrc("File %s is open in mode %s\n", filename, opmode); To_Fbs[i] = dup->Openlist; // Keep track of File blocks @@ -2163,7 +2163,7 @@ void VECFAM::ResetBuffer(PGLOBAL g) /***********************************************************************/ int VECFAM::WriteBuffer(PGLOBAL g) { - if (trace) + if (trace(1)) htrc("VCT WriteBuffer: R%d Mode=%d CurNum=%d CurBlk=%d\n", Tdbp->GetTdb_No(), Tdbp->GetMode(), CurNum, CurBlk); @@ -2205,7 +2205,7 @@ int VECFAM::WriteBuffer(PGLOBAL g) /***********************************************************************/ int VECFAM::DeleteRecords(PGLOBAL g, int irc) { - if (trace) + if (trace(1)) htrc("VEC DeleteDB: rc=%d UseTemp=%d Fpos=%d Tpos=%d Spos=%d\n", irc, UseTemp, Fpos, Tpos, Spos); @@ -2215,7 +2215,7 @@ int VECFAM::DeleteRecords(PGLOBAL g, int irc) /*******************************************************************/ Fpos = Cardinality(g); - if (trace) + if (trace(1)) htrc("Fpos placed at file end=%d\n", Fpos); } else // Fpos is the Deleted line position @@ -2251,7 +2251,7 @@ int VECFAM::DeleteRecords(PGLOBAL g, int irc) #endif Spos++; // New start position is on next line - if (trace) + if (trace(1)) htrc("after: Tpos=%d Spos=%d\n", Tpos, Spos); } else { @@ -2294,7 +2294,7 @@ int VECFAM::DeleteRecords(PGLOBAL g, int irc) close(h); - if (trace) + if (trace(1)) htrc("done, h=%d irc=%d\n", h, irc); } // endfor i @@ -2332,7 +2332,7 @@ bool VECFAM::OpenTempFile(PGLOBAL g) sprintf(tempname, Tempat, i+1); if (!(T_Streams[i] = PlugOpenFile(g, tempname, "wb"))) { - if (trace) + if (trace(1)) htrc("%s\n", g->Message); return true; @@ -2391,7 +2391,7 @@ bool VECFAM::MoveIntermediateLines(PGLOBAL g, bool *) len = fread(To_Buf, Clens[i], req, Streams[i]); - if (trace) + if (trace(1)) htrc("after read req=%d len=%d\n", req, len); if (len != req) { @@ -2410,7 +2410,7 @@ bool VECFAM::MoveIntermediateLines(PGLOBAL g, bool *) return true; } // endif - if (trace) + if (trace(1)) htrc("after write pos=%d\n", ftell(Streams[i])); } // endfor i @@ -2418,7 +2418,7 @@ bool VECFAM::MoveIntermediateLines(PGLOBAL g, bool *) Tpos += (int)req; Spos += (int)req; - if (trace) + if (trace(1)) htrc("loop: Tpos=%d Spos=%d\n", Tpos, Spos); b = true; @@ -2541,7 +2541,7 @@ void VECFAM::CloseTableFile(PGLOBAL g, bool abort) To_Fbs[i] = NULL; } // endif Streams - if (trace) + if (trace(1)) htrc("VCT CloseTableFile: closing %s wrc=%d rc=%d\n", To_File, wrc, rc); } // end of CloseTableFile @@ -2560,7 +2560,7 @@ bool VECFAM::ReadBlock(PGLOBAL g, PVCTCOL colp) len = Nrec * colp->Clen * CurBlk; i = colp->Index - 1; - if (trace) + if (trace(1)) htrc("len=%d i=%d Nrec=%d Deplac=%d Lrecl=%d CurBlk=%d\n", len, i, Nrec, colp->Deplac, Lrecl, CurBlk); @@ -2586,13 +2586,13 @@ bool VECFAM::ReadBlock(PGLOBAL g, PVCTCOL colp) sprintf(g->Message, MSG(READ_ERROR), fn, strerror(errno)); - if (trace) + if (trace(1)) htrc(" Read error: %s\n", g->Message); return true; } // endif - if (trace) + if (trace(1)) num_read++; return false; @@ -2615,7 +2615,7 @@ bool VECFAM::WriteBlock(PGLOBAL g, PVCTCOL colp) len = Nrec * colp->Clen * colp->ColBlk; i = colp->Index - 1; - if (trace) + if (trace(1)) htrc("modif=%d len=%d i=%d Nrec=%d Deplac=%d Lrecl=%d colblk=%d\n", Modif, len, i, Nrec, colp->Deplac, Lrecl, colp->ColBlk); @@ -2638,7 +2638,7 @@ bool VECFAM::WriteBlock(PGLOBAL g, PVCTCOL colp) sprintf(fn, (UseTemp) ? Tempat : Colfn, colp->Index); sprintf(g->Message, MSG(WRITE_STRERROR), fn, strerror(errno)); - if (trace) + if (trace(1)) htrc("Write error: %s\n", strerror(errno)); return true; @@ -2782,7 +2782,7 @@ bool VMPFAM::MapColumnFile(PGLOBAL g, MODE mode, int i) && fp->Count && fp->Mode == mode) break; - if (trace) + if (trace(1)) htrc("Mapping file, fp=%p\n", fp); } else @@ -2807,7 +2807,7 @@ bool VMPFAM::MapColumnFile(PGLOBAL g, MODE mode, int i) if (!(*g->Message)) sprintf(g->Message, MSG(OPEN_MODE_ERROR), "map", (int) rc, filename); - if (trace) + if (trace(1)) htrc("%s\n", g->Message); return (mode == MODE_READ && rc == ENOENT) @@ -2858,7 +2858,7 @@ bool VMPFAM::MapColumnFile(PGLOBAL g, MODE mode, int i) To_Fbs[i] = fp; // Useful when closing - if (trace) + if (trace(1)) htrc("fp=%p count=%d MapView=%p len=%d\n", fp, fp->Count, Memcol[i], len); @@ -2903,7 +2903,7 @@ int VMPFAM::DeleteRecords(PGLOBAL g, int irc) int i; int m, n; - if (trace) + if (trace(1)) htrc("VMP DeleteDB: irc=%d tobuf=%p Tpos=%p Spos=%p\n", irc, To_Buf, Tpos, Spos); @@ -2913,7 +2913,7 @@ int VMPFAM::DeleteRecords(PGLOBAL g, int irc) /*******************************************************************/ Fpos = (Block - 1) * Nrec + Last; - if (trace) + if (trace(1)) htrc("Fpos placed at file top=%p\n", Fpos); } else // Fpos is the Deleted line position @@ -2936,7 +2936,7 @@ int VMPFAM::DeleteRecords(PGLOBAL g, int irc) Tpos += n; - if (trace) + if (trace(1)) htrc("move %d bytes\n", n); } // endif n @@ -2944,7 +2944,7 @@ int VMPFAM::DeleteRecords(PGLOBAL g, int irc) if (irc == RC_OK) { Spos = Fpos + 1; // New start position - if (trace) + if (trace(1)) htrc("after: Tpos=%p Spos=%p\n", Tpos, Spos); } else { @@ -2981,7 +2981,7 @@ int VMPFAM::DeleteRecords(PGLOBAL g, int irc) return RC_FX; } // endif - if (trace) + if (trace(1)) htrc("done, Tpos=%p newsize=%d drc=%d\n", Tpos, n, drc); if (!SetEndOfFile(fp->Handle)) { @@ -3088,7 +3088,7 @@ bool BGVFAM::BigRead(PGLOBAL g, HANDLE h, void *inbuf, int req) DWORD nbr, drc, len = (DWORD)req; bool brc = ReadFile(h, inbuf, len, &nbr, NULL); - if (trace) + if (trace(1)) htrc("after read req=%d brc=%d nbr=%d\n", req, brc, nbr); if (!brc || nbr != len) { @@ -3105,7 +3105,7 @@ bool BGVFAM::BigRead(PGLOBAL g, HANDLE h, void *inbuf, int req) sprintf(g->Message, MSG(READ_ERROR), To_File, buf); - if (trace) + if (trace(1)) htrc("BIGREAD: %s\n", g->Message); rc = true; @@ -3119,7 +3119,7 @@ bool BGVFAM::BigRead(PGLOBAL g, HANDLE h, void *inbuf, int req) sprintf(g->Message, MSG(READ_ERROR), fn, strerror(errno)); - if (trace) + if (trace(1)) htrc("BIGREAD: nbr=%d len=%d errno=%d %s\n", nbr, len, errno, g->Message); @@ -3141,7 +3141,7 @@ bool BGVFAM::BigWrite(PGLOBAL g, HANDLE h, void *inbuf, int req) DWORD nbw, drc, len = (DWORD)req; bool brc = WriteFile(h, inbuf, len, &nbw, NULL); - if (trace) + if (trace(1)) htrc("after write req=%d brc=%d nbw=%d\n", req, brc, nbw); if (!brc || nbw != len) { @@ -3159,7 +3159,7 @@ bool BGVFAM::BigWrite(PGLOBAL g, HANDLE h, void *inbuf, int req) sprintf(g->Message, MSG(WRITE_STRERROR), fn, buf); - if (trace) + if (trace(1)) htrc("BIGWRITE: nbw=%d len=%d errno=%d %s\n", nbw, len, drc, g->Message); @@ -3174,7 +3174,7 @@ bool BGVFAM::BigWrite(PGLOBAL g, HANDLE h, void *inbuf, int req) sprintf(g->Message, MSG(WRITE_STRERROR), fn, strerror(errno)); - if (trace) + if (trace(1)) htrc("BIGWRITE: nbw=%d len=%d errno=%d %s\n", nbw, len, errno, g->Message); @@ -3224,7 +3224,7 @@ int BGVFAM::GetBlockInfo(PGLOBAL g) if (h == INVALID_HANDLE_VALUE || !_filelength(h)) { #endif // !__WIN__ // Consider this is a void table - if (trace) + if (trace(1)) htrc("Void table h=%d\n", h); Last = Nrec; @@ -3248,7 +3248,7 @@ int BGVFAM::GetBlockInfo(PGLOBAL g) Block = (vh.NumRec > 0) ? (vh.NumRec + Nrec - 1) / Nrec : 0; Last = (vh.NumRec + Nrec - 1) % Nrec + 1; - if (trace) + if (trace(1)) htrc("Block=%d Last=%d\n", Block, Last); } // endif's @@ -3348,7 +3348,7 @@ bool BGVFAM::MakeEmptyFile(PGLOBAL g, PCSZ fn) of.QuadPart = (BIGINT)n + (BIGINT)MaxBlk * (BIGINT)Blksize - (BIGINT)1; - if (trace) + if (trace(1)) htrc("MEF: of=%lld n=%d maxblk=%d blksize=%d\n", of.QuadPart, n, MaxBlk, Blksize); @@ -3394,7 +3394,7 @@ bool BGVFAM::MakeEmptyFile(PGLOBAL g, PCSZ fn) pos = (BIGINT)n + (BIGINT)MaxBlk * (BIGINT)Blksize - (BIGINT)1; - if (trace) + if (trace(1)) htrc("MEF: pos=%lld n=%d maxblk=%d blksize=%d\n", pos, n, MaxBlk, Blksize); @@ -3439,7 +3439,7 @@ bool BGVFAM::OpenTableFile(PGLOBAL g) PlugSetPath(filename, To_File, Tdbp->GetPath()); - if (trace) + if (trace(1)) htrc("OpenTableFile: filename=%s mode=%d Last=%d\n", filename, mode, Last); @@ -3516,7 +3516,7 @@ bool BGVFAM::OpenTableFile(PGLOBAL g) strcat(g->Message, filename); } // endif Hfile - if (trace) + if (trace(1)) htrc(" rc=%d access=%p share=%p creation=%d handle=%p fn=%s\n", rc, access, share, creation, Hfile, filename); @@ -3605,7 +3605,7 @@ bool BGVFAM::OpenTableFile(PGLOBAL g) strcat(g->Message, strerror(errno)); } // endif Hfile - if (trace) + if (trace(1)) htrc(" rc=%d oflag=%p mode=%p handle=%d fn=%s\n", rc, oflag, mode, Hfile, filename); #endif // UNIX @@ -3626,7 +3626,7 @@ bool BGVFAM::OpenTableFile(PGLOBAL g) To_Fb->Mode = mode; To_Fb->Handle = Hfile; - if (trace) + if (trace(1)) htrc("File %s is open in mode %d\n", filename, mode); if (del) @@ -3729,7 +3729,7 @@ bool BGVFAM::AllocateBuffer(PGLOBAL g) /***********************************************************************/ int BGVFAM::WriteBuffer(PGLOBAL g) { - if (trace) + if (trace(1)) htrc("BGV WriteDB: R%d Mode=%d CurNum=%d CurBlk=%d\n", Tdbp->GetTdb_No(), Tdbp->GetMode(), CurNum, CurBlk); @@ -3829,7 +3829,7 @@ int BGVFAM::DeleteRecords(PGLOBAL g, int irc) /* 2 - directly move the not deleted lines inside the original */ /* file, and at the end erase all trailing records. */ /*********************************************************************/ - if (trace) + if (trace(1)) htrc("BGV DeleteDB: irc=%d UseTemp=%d Fpos=%d Tpos=%d Spos=%d\n", irc, UseTemp, Fpos, Tpos, Spos); @@ -3839,7 +3839,7 @@ int BGVFAM::DeleteRecords(PGLOBAL g, int irc) /*******************************************************************/ Fpos = (Block - 1) * Nrec + Last; - if (trace) + if (trace(1)) htrc("Fpos placed at file end=%d\n", Fpos); eof = UseTemp && !MaxBlk; @@ -3878,7 +3878,7 @@ int BGVFAM::DeleteRecords(PGLOBAL g, int irc) #endif Spos++; // New start position is on next line - if (trace) + if (trace(1)) htrc("after: Tpos=%d Spos=%d\n", Tpos, Spos); } else { @@ -4065,7 +4065,7 @@ bool BGVFAM::MoveIntermediateLines(PGLOBAL g, bool *b) } // endif Usetemp... - if (trace) + if (trace(1)) htrc("loop: Tpos=%d Spos=%d\n", Tpos, Spos); } // endfor n @@ -4201,7 +4201,7 @@ void BGVFAM::CloseTableFile(PGLOBAL g, bool abort) if (Hfile != INVALID_HANDLE_VALUE) rc = PlugCloseFile(g, To_Fb); - if (trace) + if (trace(1)) htrc("BGV CloseTableFile: closing %s wrc=%d rc=%d\n", To_File, wrc, rc); @@ -4247,7 +4247,7 @@ bool BGVFAM::ReadBlock(PGLOBAL g, PVCTCOL colp) pos = (BIGINT)Nrec * ((BIGINT)colp->Deplac + (BIGINT)Lrecl * (BIGINT)CurBlk); - if (trace) + if (trace(1)) htrc("RB: offset=%lld Nrec=%d Deplac=%d Lrecl=%d CurBlk=%d MaxBlk=%d\n", pos, Nrec, colp->Deplac, Lrecl, CurBlk, MaxBlk); @@ -4257,7 +4257,7 @@ bool BGVFAM::ReadBlock(PGLOBAL g, PVCTCOL colp) if (BigRead(g, Hfile, colp->Blk->GetValPointer(), colp->Clen * Nrec)) return true; - if (trace) + if (trace(1)) num_read++; return false; @@ -4284,7 +4284,7 @@ bool BGVFAM::WriteBlock(PGLOBAL g, PVCTCOL colp) pos = (BIGINT)Nrec * ((BIGINT)colp->Deplac + (BIGINT)Lrecl * (BIGINT)colp->ColBlk); - if (trace) + if (trace(1)) htrc("WB: offset=%lld Nrec=%d Deplac=%d Lrecl=%d ColBlk=%d\n", pos, Nrec, colp->Deplac, Lrecl, colp->ColBlk); diff --git a/storage/connect/filamzip.cpp b/storage/connect/filamzip.cpp index dfd9343af..e76dc4962 100644 --- a/storage/connect/filamzip.cpp +++ b/storage/connect/filamzip.cpp @@ -699,7 +699,7 @@ bool UNZIPUTL::openEntry(PGLOBAL g) entryopen = true; } // endif rc - if (trace) + if (trace(1)) htrc("Openning entry%s %s\n", fn, (entryopen) ? "oked" : "failed"); return !entryopen; @@ -748,10 +748,10 @@ UNZFAM::UNZFAM(PUNZFAM txfp) : MAPFAM(txfp) /***********************************************************************/ int UNZFAM::GetFileLength(PGLOBAL g) { - int len = (zutp && zutp->entryopen) ? Top - Memory + int len = (zutp && zutp->entryopen) ? (int)(Top - Memory) : TXTFAM::GetFileLength(g) * 3; - if (trace) + if (trace(1)) htrc("Zipped file length=%d\n", len); return len; @@ -1088,7 +1088,7 @@ int ZIPFAM::WriteBuffer(PGLOBAL g) // Prepare to write the new line strcat(strcpy(To_Buf, Tdbp->GetLine()), (Bin) ? CrLf : "\n"); - len = strchr(To_Buf, '\n') - To_Buf + 1; + len = (int)(strchr(To_Buf, '\n') - To_Buf + 1); return zutp->writeEntry(g, To_Buf, len); } // end of WriteBuffer diff --git a/storage/connect/filter.cpp b/storage/connect/filter.cpp index 079128f9a..469cd90d1 100644 --- a/storage/connect/filter.cpp +++ b/storage/connect/filter.cpp @@ -87,7 +87,7 @@ BYTE OpBmp(PGLOBAL g, OPVAL opc) case OP_EXIST: bt = 0x00; break; default: sprintf(g->Message, MSG(BAD_FILTER_OP), opc); - throw (int)TYPE_ARRAY; + throw (int)TYPE_FILTER; } // endswitch opc return bt; @@ -301,7 +301,7 @@ PFIL FILTER::Link(PGLOBAL g, PFIL fil2) { PFIL fil1; - if (trace) + if (trace(1)) htrc("Linking filter %p with op=%d... to filter %p with op=%d\n", this, Opc, fil2, (fil2) ? fil2->Opc : 0); @@ -355,7 +355,7 @@ int FILTER::CheckColumn(PGLOBAL g, PSQL sqlp, PXOB &p, int &ag) char errmsg[MAX_STR] = ""; int agg, k, n = 0; - if (trace) + if (trace(1)) htrc("FILTER CheckColumn: sqlp=%p ag=%d\n", sqlp, ag); switch (Opc) { @@ -540,7 +540,7 @@ PFIL FILTER::SortJoin(PGLOBAL g) bool FILTER::FindJoinFilter(POPJOIN opj, PFIL fprec, bool teq, bool tek, bool tk2, bool tc2, bool tix, bool thx) { - if (trace) + if (trace(1)) htrc("FindJoinFilter: opj=%p fprec=%p tests=(%d,%d,%d,%d)\n", opj, fprec, teq, tek, tk2, tc2); @@ -867,7 +867,7 @@ bool FILTER::CheckLocal(PTDB tdbp) { bool local = TRUE; - if (trace) { + if (trace(1)) { if (tdbp) htrc("CheckLocal: filp=%p R%d\n", this, tdbp->GetTdb_No()); else @@ -877,7 +877,7 @@ bool FILTER::CheckLocal(PTDB tdbp) for (int i = 0; local && i < 2; i++) local = Arg(i)->CheckLocal(tdbp); - if (trace) + if (trace(1)) htrc("FCL: returning %d\n", local); return (local); @@ -983,7 +983,7 @@ bool FILTER::Convert(PGLOBAL g, bool having) { int i, comtype = TYPE_ERROR; - if (trace) + if (trace(1)) htrc("converting(?) %s %p opc=%d\n", (having) ? "having" : "filter", this, Opc); @@ -1014,7 +1014,7 @@ bool FILTER::Convert(PGLOBAL g, bool having) return TRUE; } // endswitch - if (trace) + if (trace(1)) htrc("Filter(%d): Arg type=%d\n", i, GetArgType(i)); // Set default values @@ -1059,7 +1059,7 @@ bool FILTER::Convert(PGLOBAL g, bool having) return TRUE; } // endif - if (trace) + if (trace(1)) htrc(" comtype=%d, B_T(%d)=%d Val(%d)=%p\n", comtype, i, Test[i].B_T, i, Val(i)); @@ -1067,7 +1067,7 @@ bool FILTER::Convert(PGLOBAL g, bool having) // Set or allocate the filter argument values and buffers for (i = 0; i < 2; i++) { - if (trace) + if (trace(1)) htrc(" conv type %d ? i=%d B_T=%d comtype=%d\n", GetArgType(i), i, Test[i].B_T, comtype); @@ -1144,7 +1144,7 @@ bool FILTER::Convert(PGLOBAL g, bool having) TEST: // Test for possible Eval optimization - if (trace) + if (trace(1)) htrc("Filp %p op=%d argtypes=(%d,%d)\n", this, Opc, GetArgType(0), GetArgType(1)); @@ -1233,7 +1233,7 @@ bool FILTER::Eval(PGLOBAL g) else if (Test[i].Conv) Val(i)->SetValue_pval(Arg(i)->GetValue()); - if (trace) + if (trace(1)) htrc(" Filter: op=%d type=%d %d B_T=%d %d val=%p %p\n", Opc, GetArgType(0), GetArgType(1), Test[0].B_T, Test[1].B_T, Val(0), Val(1)); @@ -1273,7 +1273,7 @@ bool FILTER::Eval(PGLOBAL g) goto FilterError; } // endswitch Type - if (trace) { + if (trace(1)) { htrc(" IN filtering: ap=%p\n", ap); if (ap) @@ -1363,7 +1363,7 @@ bool FILTER::Eval(PGLOBAL g) goto FilterError; } // endswitch Opc - if (trace) + if (trace(1)) htrc("Eval: filter %p Opc=%d result=%d\n", this, Opc, Value->GetIntValue()); @@ -1775,7 +1775,7 @@ PFIL PrepareFilter(PGLOBAL g, PFIL fp, bool having) { PFIL filp = NULL; - if (trace) + if (trace(1)) htrc("PrepareFilter: fp=%p having=%d\n", fp, having); while (fp) { @@ -1790,14 +1790,14 @@ PFIL PrepareFilter(PGLOBAL g, PFIL fp, bool having) break; // Remove eventual ending separator(s) // if (fp->Convert(g, having)) -// (int)throw TYPE_ARRAY; +// throw (int)TYPE_FILTER; filp = fp; fp = fp->Next; filp->Next = NULL; } // endwhile - if (trace) + if (trace(1)) htrc(" returning filp=%p\n", filp); return filp; @@ -1823,7 +1823,7 @@ DllExport bool ApplyFilter(PGLOBAL g, PFIL filp) if (filp->Eval(g)) throw (int)TYPE_FILTER; - if (trace > 1) + if (trace(2)) htrc("PlugFilter filp=%p result=%d\n", filp, filp->GetResult()); diff --git a/storage/connect/fmdlex.c b/storage/connect/fmdlex.c index a8d48a5d3..729b1b883 100644 --- a/storage/connect/fmdlex.c +++ b/storage/connect/fmdlex.c @@ -283,7 +283,7 @@ static void yy_fatal_error YY_PROTO(( const char msg[] )); */ #define YY_DO_BEFORE_ACTION \ yytext_ptr = yy_bp; \ - yyleng = yy_cp - yy_bp; \ + yyleng = (int)(yy_cp - yy_bp); \ yy_hold_char = *yy_cp; \ *yy_cp = '\0'; \ yy_c_buf_p = yy_cp; @@ -695,7 +695,7 @@ case YY_STATE_EOF(dqt): case YY_END_OF_BUFFER: { /* Amount of text matched not including the EOB char. */ - int yy_amount_of_matched_text = yy_cp - yytext_ptr - 1; + int yy_amount_of_matched_text = (int)(yy_cp - yytext_ptr - 1); /* Undo the effects of YY_DO_BEFORE_ACTION. */ *yy_cp = yy_hold_char; @@ -862,7 +862,7 @@ static int yy_get_next_buffer() /* Try to read more data. */ /* First move last chars to start of buffer. */ - number_to_move = yy_c_buf_p - yytext_ptr; + number_to_move = (int)(yy_c_buf_p - yytext_ptr); for ( i = 0; i < number_to_move; ++i ) *(dest++) = *(source++); @@ -888,7 +888,7 @@ static int yy_get_next_buffer() /* just a shorter name for the current buffer */ YY_BUFFER_STATE b = yy_current_buffer; - int yy_c_buf_p_offset = yy_c_buf_p - b->yy_ch_buf; + int yy_c_buf_p_offset = (int)(yy_c_buf_p - b->yy_ch_buf); b->yy_buf_size *= 2; b->yy_ch_buf = (char *) diff --git a/storage/connect/global.h b/storage/connect/global.h index e4b00786e..472d09408 100644 --- a/storage/connect/global.h +++ b/storage/connect/global.h @@ -52,7 +52,7 @@ /***********************************************************************/ /* Define access to the thread based trace value. */ /***********************************************************************/ -#define trace GetTraceValue() +#define trace(T) (bool)(GetTraceValue() & (uint)T) /***********************************************************************/ /* Miscellaneous Constants */ @@ -220,14 +220,19 @@ DllExport BOOL PlugIsAbsolutePath(LPCSTR path); DllExport bool AllocSarea(PGLOBAL, uint); DllExport void FreeSarea(PGLOBAL); DllExport BOOL PlugSubSet(PGLOBAL, void *, uint); -DllExport void *PlugSubAlloc(PGLOBAL, void *, size_t); DllExport char *PlugDup(PGLOBAL g, const char *str); DllExport void *MakePtr(void *, OFFSET); DllExport void htrc(char const *fmt, ...); -DllExport int GetTraceValue(void); +//DllExport int GetTraceValue(void); +DllExport uint GetTraceValue(void); #if defined(__cplusplus) } // extern "C" #endif +/***********************************************************************/ +/* Non exported routine declarations. */ +/***********************************************************************/ +void *PlugSubAlloc(PGLOBAL, void *, size_t); // Does throw + /*-------------------------- End of Global.H --------------------------*/ diff --git a/storage/connect/ha_connect.cc b/storage/connect/ha_connect.cc index 5964b1d04..af329c0c8 100644 --- a/storage/connect/ha_connect.cc +++ b/storage/connect/ha_connect.cc @@ -98,8 +98,8 @@ rnd_next signals that it has reached the end of its data. Calls to ha_connect::extra() are hints as to what will be occuring to the request. - Author Olivier Bertrand -*/ + Author Olivier Bertrand + */ #ifdef USE_PRAGMA_IMPLEMENTATION #pragma implementation // gcc: Class implementation @@ -174,9 +174,9 @@ #define JSONMAX 10 // JSON Default max grp size extern "C" { - char version[]= "Version 1.06.0005 October 14, 2017"; + char version[]= "Version 1.06.0007 March 11, 2018"; #if defined(__WIN__) - char compver[]= "Version 1.06.0005 " __DATE__ " " __TIME__; + char compver[]= "Version 1.06.0007 " __DATE__ " " __TIME__; char slash= '\\'; #else // !__WIN__ char slash= '/'; @@ -266,16 +266,38 @@ static char *strz(PGLOBAL g, LEX_STRING &ls) /***********************************************************************/ /* CONNECT session variables definitions. */ /***********************************************************************/ -// Tracing: 0 no, 1 yes, >1 more tracing -static MYSQL_THDVAR_INT(xtrace, - PLUGIN_VAR_RQCMDARG, "Console trace value.", - NULL, NULL, 0, 0, INT_MAX, 1); +// Tracing: 0 no, 1 yes, 2 more, 4 index... 511 all +const char *xtrace_names[] = +{ + "YES", "MORE", "INDEX", "MEMORY", "SUBALLOC", + "QUERY", "STMT", "HANDLER", "BLOCK", "MONGO", NullS +}; + +TYPELIB xtrace_typelib = +{ + array_elements(xtrace_names) - 1, "xtrace_typelib", + xtrace_names, NULL +}; + +static MYSQL_THDVAR_SET( + xtrace, // name + PLUGIN_VAR_RQCMDARG, // opt + "Trace values.", // comment + NULL, // check + NULL, // update function + 0, // def (NO) + &xtrace_typelib); // typelib // Getting exact info values static MYSQL_THDVAR_BOOL(exact_info, PLUGIN_VAR_RQCMDARG, "Getting exact info values", NULL, NULL, 0); +// Enabling cond_push +static MYSQL_THDVAR_BOOL(cond_push, PLUGIN_VAR_RQCMDARG, + "Enabling cond_push", + NULL, NULL, 1); // YES by default + /** Temporary file usage: no: Not using temporary file @@ -314,17 +336,18 @@ static MYSQL_THDVAR_UINT(work_size, static MYSQL_THDVAR_INT(conv_size, PLUGIN_VAR_RQCMDARG, // opt "Size used when converting TEXT columns.", - NULL, NULL, SZCONV, 0, 65500, 1); + NULL, NULL, SZCONV, 0, 65500, 8192); /** Type conversion: no: Unsupported types -> TYPE_ERROR yes: TEXT -> VARCHAR + force: Do it also for ODBC BINARY and BLOBs skip: skip unsupported type columns in Discovery */ const char *xconv_names[]= { - "NO", "YES", "SKIP", NullS + "NO", "YES", "FORCE", "SKIP", NullS }; TYPELIB xconv_typelib= @@ -339,7 +362,7 @@ static MYSQL_THDVAR_ENUM( "Unsupported types conversion.", // comment NULL, // check NULL, // update function - 0, // def (no) + 1, // def (yes) &xconv_typelib); // typelib // Null representation for JSON values @@ -364,12 +387,17 @@ static MYSQL_THDVAR_STR(java_wrapper, NULL, NULL, "wrappers/JdbcInterface"); #endif // JAVA_SUPPORT -#if 0 // This is apparently not acceptable for a plugin +// This is apparently not acceptable for a plugin so it is undocumented +#if defined(JAVA_SUPPORT) || defined(CMGO_SUPPORT) // Enabling MONGO table type +#if defined(MONGO_SUPPORT) || (MYSQL_VERSION_ID > 100200) static MYSQL_THDVAR_BOOL(enable_mongo, PLUGIN_VAR_RQCMDARG, - "Enabling the MongoDB access", - NULL, NULL, MONGO_ENABLED); -#endif // 0 + "Enabling the MongoDB access", NULL, NULL, 1); +#else // !version 2,3 +static MYSQL_THDVAR_BOOL(enable_mongo, PLUGIN_VAR_RQCMDARG, + "Enabling the MongoDB access", NULL, NULL, 0); +#endif // !version 2,3 +#endif // JAVA_SUPPORT || CMGO_SUPPORT #if defined(XMSG) || defined(NEWMSG) const char *language_names[]= @@ -401,9 +429,10 @@ handlerton *connect_hton= NULL; /***********************************************************************/ /* Function to export session variable values to other source files. */ /***********************************************************************/ -extern "C" int GetTraceValue(void) - {return connect_hton ? THDVAR(current_thd, xtrace) : 0;} +uint GetTraceValue(void) + {return (uint)(connect_hton ? THDVAR(current_thd, xtrace) : 0);} bool ExactInfo(void) {return THDVAR(current_thd, exact_info);} +static bool CondPushEnabled(void) {return THDVAR(current_thd, cond_push);} USETEMP UseTemp(void) {return (USETEMP)THDVAR(current_thd, use_tempfile);} int GetConvSize(void) {return THDVAR(current_thd, conv_size);} TYPCONV GetTypeConv(void) {return (TYPCONV)THDVAR(current_thd, type_conv);} @@ -419,22 +448,20 @@ void SetWorkSize(uint) push_warning(current_thd, Sql_condition::WARN_LEVEL_WARN, 0, "Work size too big, try setting a smaller value"); } // end of SetWorkSize -#if defined(XMSG) || defined(NEWMSG) -extern "C" const char *msglang(void) -{ - return language_names[THDVAR(current_thd, msg_lang)]; -} // end of msglang -#else // !XMSG && !NEWMSG #if defined(JAVA_SUPPORT) char *GetJavaWrapper(void) {return connect_hton ? THDVAR(current_thd, java_wrapper) : (char*)"wrappers/JdbcInterface";} #endif // JAVA_SUPPORT -#if defined(JAVA_SUPPORT) -//bool MongoEnabled(void) { return THDVAR(current_thd, enable_mongo); } -#endif // JAVA_SUPPORT +#if defined(JAVA_SUPPORT) || defined(CMGO_SUPPORT) +bool MongoEnabled(void) {return THDVAR(current_thd, enable_mongo);} +#endif // JAVA_SUPPORT || CMGO_SUPPORT +#if defined(XMSG) || defined(NEWMSG) +extern "C" const char *msglang(void) + {return language_names[THDVAR(current_thd, msg_lang)];} +#else // !XMSG && !NEWMSG extern "C" const char *msglang(void) { #if defined(FRENCH) @@ -726,7 +753,7 @@ static int connect_init_func(void *p) connect_hton->tablefile_extensions= ha_connect_exts; connect_hton->discover_table_structure= connect_assisted_discovery; - if (trace) + if (trace(128)) sql_print_information("connect_init: hton=%p", p); DTVAL::SetTimeShift(); // Initialize time zone shift once for all @@ -818,7 +845,7 @@ static handler* connect_create_handler(handlerton *hton, { handler *h= new (mem_root) ha_connect(hton, table); - if (trace) + if (trace(128)) htrc("New CONNECT %p, table: %.*s\n", h, table ? table->table_name.length : 6, table ? table->table_name.str : ""); @@ -874,7 +901,7 @@ ha_connect::ha_connect(handlerton *hton, TABLE_SHARE *table_arg) /****************************************************************************/ ha_connect::~ha_connect(void) { - if (trace) + if (trace(128)) htrc("Delete CONNECT %p, table: %.*s, xp=%p count=%d\n", this, table ? table->s->table_name.length : 6, table ? table->s->table_name.str : "", @@ -1086,55 +1113,55 @@ PCSZ GetListOption(PGLOBAL g, PCSZ opname, PCSZ oplist, PCSZ def) if (!oplist) return (char*)def; - char key[16], val[256]; - char *pv, *pn, *pk= (char*)oplist; - PCSZ opval= def; - int n; + char key[16], val[256]; + char *pv, *pn, *pk = (char*)oplist; + PCSZ opval = def; + int n; while (*pk == ' ') pk++; - for (; pk; pk= pn) { - pn= strchr(pk, ','); - pv= strchr(pk, '='); + for (; pk; pk = pn) { + pn = strchr(pk, ','); + pv = strchr(pk, '='); - if (pv && (!pn || pv < pn)) { + if (pv && (!pn || pv < pn)) { n = MY_MIN(static_cast(pv - pk), sizeof(key) - 1); memcpy(key, pk, n); while (n && key[n - 1] == ' ') n--; - key[n]= 0; + key[n] = 0; - while(*(++pv) == ' ') ; + while (*(++pv) == ' '); - n= MY_MIN((pn ? pn - pv : strlen(pv)), sizeof(val) - 1); - memcpy(val, pv, n); + n = MY_MIN((pn ? pn - pv : strlen(pv)), sizeof(val) - 1); + memcpy(val, pv, n); while (n && val[n - 1] == ' ') n--; - val[n]= 0; - } else { - n= MY_MIN((pn ? pn - pk : strlen(pk)), sizeof(key) - 1); - memcpy(key, pk, n); + val[n] = 0; + } else { + n = MY_MIN((pn ? pn - pk : strlen(pk)), sizeof(key) - 1); + memcpy(key, pk, n); while (n && key[n - 1] == ' ') n--; - key[n]= 0; - val[0]= 0; - } // endif pv + key[n] = 0; + val[0] = 0; + } // endif pv - if (!stricmp(opname, key)) { - opval= PlugDup(g, val); - break; - } else if (!pn) - break; + if (!stricmp(opname, key)) { + opval = PlugDup(g, val); + break; + } else if (!pn) + break; - while (*(++pn) == ' ') ; - } // endfor pk + while (*(++pn) == ' '); + } // endfor pk return opval; } // end of GetListOption @@ -1658,7 +1685,7 @@ PIXDEF ha_connect::GetIndexInfo(TABLE_SHARE *s) s= table->s; for (int n= 0; (unsigned)n < s->keynames.count; n++) { - if (trace) + if (trace(1)) htrc("Getting created index %d info\n", n + 1); // Find the index to describe @@ -1754,11 +1781,13 @@ bool ha_connect::CheckVirtualIndex(TABLE_SHARE *s) bool ha_connect::IsPartitioned(void) { +#ifdef WITH_PARTITION_STORAGE_ENGINE if (tshp) return tshp->partition_info_str_len > 0; else if (table && table->part_info) return true; else +#endif return false; } // end of IsPartitioned @@ -2004,7 +2033,7 @@ bool ha_connect::CheckColumnList(PGLOBAL g) } // endif } catch (int n) { - if (trace) + if (trace(1)) htrc("Exception %d: %s\n", n, g->Message); brc = true; } catch (const char *msg) { @@ -2061,7 +2090,7 @@ int ha_connect::MakeRecord(char *buf) PCOL colp= NULL; DBUG_ENTER("ha_connect::MakeRecord"); - if (trace > 1) + if (trace(2)) htrc("Maps: read=%08X write=%08X vcol=%08X defr=%08X defw=%08X\n", *table->read_set->bitmap, *table->write_set->bitmap, (table->vcol_set) ? *table->vcol_set->bitmap : 0, @@ -2585,14 +2614,14 @@ PFIL ha_connect::CondFilter(PGLOBAL g, Item *cond) if (!cond) return NULL; - if (trace) + if (trace(1)) htrc("Cond type=%d\n", cond->type()); if (cond->type() == COND::COND_ITEM) { PFIL fp; Item_cond *cond_item= (Item_cond *)cond; - if (trace) + if (trace(1)) htrc("Cond: Ftype=%d name=%s\n", cond_item->functype(), cond_item->func_name()); @@ -2626,7 +2655,7 @@ PFIL ha_connect::CondFilter(PGLOBAL g, Item *cond) Item_func *condf= (Item_func *)cond; Item* *args= condf->arguments(); - if (trace) + if (trace(1)) htrc("Func type=%d argnum=%d\n", condf->functype(), condf->argument_count()); @@ -2655,11 +2684,11 @@ PFIL ha_connect::CondFilter(PGLOBAL g, Item *cond) return NULL; for (i= 0; i < condf->argument_count(); i++) { - if (trace) + if (trace(1)) htrc("Argtype(%d)=%d\n", i, args[i]->type()); if (i >= 2 && !ismul) { - if (trace) + if (trace(1)) htrc("Unexpected arg for vop=%d\n", vop); continue; @@ -2689,7 +2718,7 @@ PFIL ha_connect::CondFilter(PGLOBAL g, Item *cond) break; } // endswitch type - if (trace) { + if (trace(1)) { htrc("Field index=%d\n", pField->field->field_index); htrc("Field name=%s\n", pField->field->field_name); } // endif trace @@ -2736,7 +2765,7 @@ PFIL ha_connect::CondFilter(PGLOBAL g, Item *cond) return NULL; } // endswitch type - if (trace) + if (trace(1)) htrc("Value type=%hd\n", pp->Type); // Append the value to the argument list @@ -2754,7 +2783,7 @@ PFIL ha_connect::CondFilter(PGLOBAL g, Item *cond) filp= MakeFilter(g, colp, pop, pfirst, neg); } else { - if (trace) + if (trace(1)) htrc("Unsupported condition\n"); return NULL; @@ -2780,7 +2809,7 @@ PCFIL ha_connect::CheckCond(PGLOBAL g, PCFIL filp, const Item *cond) if (!cond) return NULL; - if (trace) + if (trace(1)) htrc("Cond type=%d\n", cond->type()); if (cond->type() == COND::COND_ITEM) { @@ -2793,7 +2822,7 @@ PCFIL ha_connect::CheckCond(PGLOBAL g, PCFIL filp, const Item *cond) else pb0= pb1= pb2= ph0= ph1= ph2= NULL; - if (trace) + if (trace(1)) htrc("Cond: Ftype=%d name=%s\n", cond_item->functype(), cond_item->func_name()); @@ -2879,7 +2908,7 @@ PCFIL ha_connect::CheckCond(PGLOBAL g, PCFIL filp, const Item *cond) filp->Bd = filp->Hv = false; - if (trace) + if (trace(1)) htrc("Func type=%d argnum=%d\n", condf->functype(), condf->argument_count()); @@ -2916,11 +2945,11 @@ PCFIL ha_connect::CheckCond(PGLOBAL g, PCFIL filp, const Item *cond) return NULL; for (i= 0; i < condf->argument_count(); i++) { - if (trace) + if (trace(1)) htrc("Argtype(%d)=%d\n", i, args[i]->type()); if (i >= 2 && !ismul) { - if (trace) + if (trace(1)) htrc("Unexpected arg for vop=%d\n", vop); continue; @@ -2963,7 +2992,7 @@ PCFIL ha_connect::CheckCond(PGLOBAL g, PCFIL filp, const Item *cond) } // endif's - if (trace) { + if (trace(1)) { htrc("Field index=%d\n", pField->field->field_index); htrc("Field name=%s\n", pField->field->field_name); htrc("Field type=%d\n", pField->field->type()); @@ -3001,7 +3030,7 @@ PCFIL ha_connect::CheckCond(PGLOBAL g, PCFIL filp, const Item *cond) if ((res= pval->val_str(&tmp)) == NULL) return NULL; // To be clarified - if (trace) + if (trace(1)) htrc("Value=%.*s\n", res->length(), res->ptr()); // IN and BETWEEN clauses should be col VOP list @@ -3142,7 +3171,7 @@ PCFIL ha_connect::CheckCond(PGLOBAL g, PCFIL filp, const Item *cond) filp->Bd = true; } else { - if (trace) + if (trace(1)) htrc("Unsupported condition\n"); return NULL; @@ -3175,7 +3204,7 @@ const COND *ha_connect::cond_push(const COND *cond) { DBUG_ENTER("ha_connect::cond_push"); - if (tdbp) { + if (tdbp && CondPushEnabled()) { PGLOBAL& g= xp->g; AMT tty= tdbp->GetAmType(); bool x= (tty == TYPE_AM_MYX || tty == TYPE_AM_XDBC); @@ -3209,7 +3238,7 @@ const COND *ha_connect::cond_push(const COND *cond) if (filp->Having && strlen(filp->Having) > 255) goto fin; // Memory collapse - if (trace) + if (trace(1)) htrc("cond_push: %s\n", filp->Body); tdbp->SetCond(cond); @@ -3235,7 +3264,7 @@ const COND *ha_connect::cond_push(const COND *cond) } // endif tty } catch (int n) { - if (trace) + if (trace(1)) htrc("Exception %d: %s\n", n, g->Message); } catch (const char *msg) { strcpy(g->Message, msg); @@ -3288,7 +3317,7 @@ bool ha_connect::get_error_message(int error, String* buf) &my_charset_latin1, &dummy_errors); - if (trace) + if (trace(1)) htrc("GEM(%d): len=%u %s\n", error, len, g->Message); msg[len]= '\0'; @@ -3340,7 +3369,7 @@ int ha_connect::open(const char *name, int mode, uint test_if_locked) int rc= 0; DBUG_ENTER("ha_connect::open"); - if (trace) + if (trace(1)) htrc("open: name=%s mode=%d test=%u\n", name, mode, test_if_locked); if (!(share= get_share())) @@ -3415,7 +3444,7 @@ int ha_connect::optimize(THD* thd, HA_CHECK_OPT*) rc = HA_ERR_INTERNAL_ERROR; } catch (int n) { - if (trace) + if (trace(1)) htrc("Exception %d: %s\n", n, g->Message); rc = HA_ERR_INTERNAL_ERROR; } catch (const char *msg) { @@ -3563,7 +3592,7 @@ int ha_connect::update_row(const uchar *old_data, uchar *new_data) PGLOBAL& g= xp->g; DBUG_ENTER("ha_connect::update_row"); - if (trace > 1) + if (trace(2)) htrc("update_row: old=%s new=%s\n", old_data, new_data); // Check values for possible change in indexed column @@ -3624,7 +3653,7 @@ int ha_connect::index_init(uint idx, bool sorted) PGLOBAL& g= xp->g; DBUG_ENTER("index_init"); - if (trace) + if (trace(1)) htrc("index_init: this=%p idx=%u sorted=%d\n", this, idx, sorted); if (GetIndexType(GetRealType()) == 2) { @@ -3677,7 +3706,7 @@ int ha_connect::index_init(uint idx, bool sorted) rc= 0; } // endif indexing - if (trace) + if (trace(1)) htrc("index_init: rc=%d indexing=%d active_index=%d\n", rc, indexing, active_index); @@ -3724,7 +3753,7 @@ int ha_connect::ReadIndexed(uchar *buf, OPVAL op, const key_range *kr) break; } // endswitch RC - if (trace > 1) + if (trace(2)) htrc("ReadIndexed: op=%d rc=%d\n", op, rc); table->status= (rc == RC_OK) ? 0 : STATUS_NOT_FOUND; @@ -3767,7 +3796,7 @@ int ha_connect::index_read(uchar * buf, const uchar * key, uint key_len, default: DBUG_RETURN(-1); break; } // endswitch find_flag - if (trace > 1) + if (trace(2)) htrc("%p index_read: op=%d\n", this, op); if (indexing > 0) { @@ -3931,7 +3960,7 @@ int ha_connect::rnd_init(bool scan) alter= 1; } // endif xmod - if (trace) + if (trace(1)) htrc("rnd_init: this=%p scan=%d xmod=%d alter=%d\n", this, scan, xmod, alter); @@ -4037,7 +4066,7 @@ int ha_connect::rnd_next(uchar *buf) break; } // endswitch RC - if (trace > 1 && (rc || !(xp->nrd++ % 16384))) { + if (trace(2) && (rc || !(xp->nrd++ % 16384))) { ulonglong tb2= my_interval_timer(); double elapsed= (double) (tb2 - xp->tb1) / 1000000000ULL; DBUG_PRINT("rnd_next", ("rc=%d nrd=%u fnd=%u nfd=%u sec=%.3lf\n", @@ -4081,7 +4110,7 @@ void ha_connect::position(const uchar *) DBUG_ENTER("ha_connect::position"); my_store_ptr(ref, ref_length, (my_off_t)tdbp->GetRecpos()); - if (trace > 1) + if (trace(2)) htrc("position: pos=%d\n", tdbp->GetRecpos()); DBUG_VOID_RETURN; @@ -4111,7 +4140,7 @@ int ha_connect::rnd_pos(uchar *buf, uchar *pos) DBUG_ENTER("ha_connect::rnd_pos"); if (!tdbp->SetRecpos(xp->g, (int)my_get_ptr(pos, ref_length))) { - if (trace) + if (trace(1)) htrc("rnd_pos: %d\n", tdbp->GetRecpos()); tdbp->SetFilter(NULL); @@ -4177,7 +4206,7 @@ int ha_connect::info(uint flag) DBUG_RETURN(HA_ERR_INTERNAL_ERROR); } // endif g - if (trace) + if (trace(1)) htrc("%p In info: flag=%u valid_info=%d\n", this, flag, valid_info); // tdbp must be available to get updated info @@ -4370,54 +4399,59 @@ bool ha_connect::check_privileges(THD *thd, PTOS options, char *dbn, bool quick) my_error(ER_OPTION_PREVENTS_STATEMENT, MYF(0), "--secure-file-priv"); return true; } // endif path - } + + } // endif !quick + } else return false; - // check FILE_ACL - // fall through - case TAB_ODBC: - case TAB_JDBC: + // Fall through case TAB_MYSQL: - case TAB_MONGO: case TAB_DIR: - case TAB_MAC: - case TAB_WMI: case TAB_ZIP: case TAB_OEM: #ifdef NO_EMBEDDED_ACCESS_CHECKS - return false; -#endif - /* - If table or table->mdl_ticket is NULL - it's a DLL, e.g. CREATE TABLE. - if the table has an MDL_EXCLUSIVE lock - it's a DDL too, e.g. the - insert step of CREATE ... SELECT. - - Otherwise it's a DML, the table was normally opened, locked, - privilege were already checked, and table->grant.privilege is set. - With SQL SECURITY DEFINER, table->grant.privilege has definer's privileges. - - Unless we're in prelocking mode, in this case table->grant.privilege - is only checked in start_stmt(), not in external_lock(). - */ - if (!table || !table->mdl_ticket || table->mdl_ticket->get_type() == MDL_EXCLUSIVE) - return check_access(thd, FILE_ACL, db, NULL, NULL, 0, 0); - if ((!quick && thd->lex->requires_prelocking()) || table->grant.privilege & FILE_ACL) - return false; - status_var_increment(thd->status_var.access_denied_errors); - my_error(access_denied_error_code(thd->password), MYF(0), - thd->security_ctx->priv_user, thd->security_ctx->priv_host, - (thd->password ? ER(ER_YES) : ER(ER_NO))); - return true; - - // This is temporary until a solution is found + return false; + #endif + + /* + Check FILE_ACL + If table or table->mdl_ticket is NULL - it's a DLL, e.g. CREATE TABLE. + if the table has an MDL_EXCLUSIVE lock - it's a DDL too, e.g. the + insert step of CREATE ... SELECT. + + Otherwise it's a DML, the table was normally opened, locked, + privilege were already checked, and table->grant.privilege is set. + With SQL SECURITY DEFINER, table->grant.privilege has definer's privileges. + + Unless we're in prelocking mode, in this case table->grant.privilege + is only checked in start_stmt(), not in external_lock(). + */ + if (!table || !table->mdl_ticket || table->mdl_ticket->get_type() == MDL_EXCLUSIVE) + return check_access(thd, FILE_ACL, db, NULL, NULL, 0, 0); + + if ((!quick && thd->lex->requires_prelocking()) || table->grant.privilege & FILE_ACL) + return false; + + status_var_increment(thd->status_var.access_denied_errors); + my_error(access_denied_error_code(thd->password), MYF(0), + thd->security_ctx->priv_user, thd->security_ctx->priv_host, + (thd->password ? ER(ER_YES) : ER(ER_NO))); + return true; + case TAB_ODBC: + case TAB_JDBC: + case TAB_MONGO: + case TAB_MAC: + case TAB_WMI: + return false; case TAB_TBL: case TAB_XCL: case TAB_PRX: case TAB_OCCUR: case TAB_PIVOT: case TAB_VIR: - return false; + // This is temporary until a solution is found + return false; } // endswitch type my_printf_error(ER_UNKNOWN_ERROR, "check_privileges failed", MYF(0)); @@ -4455,7 +4489,7 @@ MODE ha_connect::CheckMode(PGLOBAL g, THD *thd, #if defined(DEVELOPMENT) if (true) { #else - if (trace) { + if (trace(65)) { #endif LEX_STRING *query_string= thd_query_string(thd); htrc("%p check_mode: cmdtype=%d\n", this, thd_sql_command(thd)); @@ -4576,7 +4610,7 @@ MODE ha_connect::CheckMode(PGLOBAL g, THD *thd, } // endif's newmode - if (trace) + if (trace(1)) htrc("New mode=%d\n", newmode); return newmode; @@ -4654,7 +4688,7 @@ int ha_connect::external_lock(THD *thd, int lock_type) DBUG_ASSERT(thd == current_thd); - if (trace) + if (trace(1)) htrc("external_lock: this=%p thd=%p xp=%p g=%p lock_type=%d\n", this, thd, xp, g, lock_type); @@ -4847,7 +4881,7 @@ int ha_connect::external_lock(THD *thd, int lock_type) if (cras) g->Createas= 1; // To tell created table to ignore FLAG - if (trace) { + if (trace(1)) { #if 0 htrc("xcheck=%d cras=%d\n", xcheck, cras); @@ -4880,7 +4914,7 @@ int ha_connect::external_lock(THD *thd, int lock_type) // Delay open until used fields are known } // endif tdbp - if (trace) + if (trace(1)) htrc("external_lock: rc=%d\n", rc); DBUG_RETURN(rc); @@ -5016,7 +5050,7 @@ int ha_connect::delete_or_rename_table(const char *name, const char *to) THD *thd= current_thd; int sqlcom= thd_sql_command(thd); - if (trace) { + if (trace(1)) { if (to) htrc("rename_table: this=%p thd=%p sqlcom=%d from=%s to=%s\n", this, thd, sqlcom, name, to); @@ -5127,7 +5161,7 @@ ha_rows ha_connect::records_in_range(uint inx, key_range *min_key, if (index_init(inx, false)) DBUG_RETURN(HA_POS_ERROR); - if (trace) + if (trace(1)) htrc("records_in_range: inx=%d indexing=%d\n", inx, indexing); if (indexing > 0) { @@ -5156,7 +5190,7 @@ ha_rows ha_connect::records_in_range(uint inx, key_range *min_key, else rows= HA_POS_ERROR; - if (trace) + if (trace(1)) htrc("records_in_range: rows=%llu\n", rows); DBUG_RETURN(rows); @@ -5378,7 +5412,7 @@ static int init_table_share(THD* thd, } // endif charset - if (trace) + if (trace(1)) htrc("s_init: %.*s\n", sql->length(), sql->ptr()); return table_s->init_from_sql_statement_string(thd, true, @@ -5411,7 +5445,7 @@ static int connect_assisted_discovery(handlerton *, THD* thd, #endif // __WIN__ //int hdr, mxe; int port = 0, mxr = 0, rc = 0, mul = 0, lrecl = 0; - PCSZ tabtyp = NULL; +//PCSZ tabtyp = NULL; #if defined(ODBC_SUPPORT) POPARM sop= NULL; PCSZ ucnc= NULL; @@ -5475,7 +5509,7 @@ static int connect_assisted_discovery(handlerton *, THD* thd, #endif // __WIN__ port= atoi(GetListOption(g, "port", topt->oplist, "0")); #if defined(ODBC_SUPPORT) - tabtyp = GetListOption(g, "Tabtype", topt->oplist, NULL); +// tabtyp = GetListOption(g, "Tabtype", topt->oplist, NULL); mxr= atoi(GetListOption(g,"maxres", topt->oplist, "0")); cto= atoi(GetListOption(g,"ConnectTimeout", topt->oplist, "-1")); qto= atoi(GetListOption(g,"QueryTimeout", topt->oplist, "-1")); @@ -5609,7 +5643,7 @@ static int connect_assisted_discovery(handlerton *, THD* thd, #endif // JAVA_SUPPORT case TAB_DBF: dbf = true; - // Passthru + // fall through case TAB_CSV: if (!fn && fnc != FNC_NO) sprintf(g->Message, "Missing %s file name", topt->type); @@ -5788,7 +5822,8 @@ static int connect_assisted_discovery(handlerton *, THD* thd, break; case FNC_TABLE: - qrp = JDBCTables(g, shm, tab, tabtyp, mxr, true, sjp); +// qrp = JDBCTables(g, shm, tab, tabtyp, mxr, true, sjp); + qrp = JDBCTables(g, shm, tab, NULL, mxr, true, sjp); break; #if 0 case FNC_DSN: @@ -5843,12 +5878,12 @@ static int connect_assisted_discovery(handlerton *, THD* thd, case TAB_JSON: qrp = JSONColumns(g, db, dsn, topt, fnc == FNC_COL); break; -#if defined(MONGO_SUPPORT) +#if defined(JAVA_SUPPORT) case TAB_MONGO: url = strz(g, create_info->connect_string); qrp = MGOColumns(g, db, url, topt, fnc == FNC_COL); break; -#endif // MONGO_SUPPORT +#endif // JAVA_SUPPORT #if defined(LIBXML2_SUPPORT) || defined(DOMDOC_SUPPORT) case TAB_XML: qrp = XMLColumns(g, (char*)db, tab, topt, fnc == FNC_COL); @@ -6091,7 +6126,7 @@ static int connect_assisted_discovery(handlerton *, THD* thd, } // endif ok } catch (int n) { - if (trace) + if (trace(1)) htrc("Exception %d: %s\n", n, g->Message); rc = HA_ERR_INTERNAL_ERROR; } catch (const char *msg) { @@ -6165,8 +6200,10 @@ int ha_connect::create(const char *name, TABLE *table_arg, TABLE *st= table; // Probably unuseful THD *thd= ha_thd(); LEX_STRING cnc = table_arg->s->connect_string; -#if defined(WITH_PARTITION_STORAGE_ENGINE) +#ifdef WITH_PARTITION_STORAGE_ENGINE partition_info *part_info= table_arg->part_info; +#else +#define part_info 0 #endif // WITH_PARTITION_STORAGE_ENGINE xp= GetUser(thd, xp); PGLOBAL g= xp->g; @@ -6185,7 +6222,7 @@ int ha_connect::create(const char *name, TABLE *table_arg, table= table_arg; // Used by called functions - if (trace) + if (trace(1)) htrc("create: this=%p thd=%p xp=%p g=%p sqlcom=%d name=%s\n", this, thd, xp, g, sqlcom, GetTableName()); @@ -6268,9 +6305,7 @@ int ha_connect::create(const char *name, TABLE *table_arg, // fall through case TAB_MYSQL: -#if defined(WITH_PARTITION_STORAGE_ENGINE) if (!part_info) -#endif // WITH_PARTITION_STORAGE_ENGINE {const char *src= options->srcdef; PCSZ host, db, tab= options->tabname; int port; @@ -6534,7 +6569,6 @@ int ha_connect::create(const char *name, TABLE *table_arg, } else lwt[i]= tolower(options->type[i]); -#if defined(WITH_PARTITION_STORAGE_ENGINE) if (part_info) { char *p; @@ -6544,7 +6578,6 @@ int ha_connect::create(const char *name, TABLE *table_arg, strcat(strcat(strcpy(buf, p), "."), lwt); *p= 0; } else { -#endif // WITH_PARTITION_STORAGE_ENGINE strcat(strcat(strcpy(buf, GetTableName()), "."), lwt); sprintf(g->Message, "No file name. Table will use %s", buf); @@ -6552,9 +6585,7 @@ int ha_connect::create(const char *name, TABLE *table_arg, push_warning(thd, Sql_condition::WARN_LEVEL_WARN, 0, g->Message); strcat(strcat(strcpy(dbpath, "./"), table->s->db.str), "/"); -#if defined(WITH_PARTITION_STORAGE_ENGINE) } // endif part_info -#endif // WITH_PARTITION_STORAGE_ENGINE PlugSetPath(fn, buf, dbpath); @@ -6574,7 +6605,7 @@ int ha_connect::create(const char *name, TABLE *table_arg, } // endif sqlcom - if (trace) + if (trace(1)) htrc("xchk=%p createas=%d\n", g->Xchk, g->Createas); if (options->zipped) { @@ -6619,11 +6650,9 @@ int ha_connect::create(const char *name, TABLE *table_arg, push_warning(thd, Sql_condition::WARN_LEVEL_WARN, 0, "Unexpected command in create, please contact CONNECT team"); -#if defined(WITH_PARTITION_STORAGE_ENGINE) if (part_info && !inward) strncpy(partname, decode(g, strrchr(name, '#') + 1), sizeof(partname) - 1); // strcpy(partname, part_info->curr_part_elem->partition_name); -#endif // WITH_PARTITION_STORAGE_ENGINE if (g->Alchecked == 0 && (!IsFileType(type) || FileExists(options->filename, false))) { @@ -6659,12 +6688,10 @@ int ha_connect::create(const char *name, TABLE *table_arg, my_message(ER_UNKNOWN_ERROR, g->Message, MYF(0)); rc = HA_ERR_INTERNAL_ERROR; } else if (cat) { -#if defined(WITH_PARTITION_STORAGE_ENGINE) if (part_info) strncpy(partname, decode(g, strrchr(name, (inward ? slash : '#')) + 1), sizeof(partname) - 1); -#endif // WITH_PARTITION_STORAGE_ENGINE if ((rc= optimize(table->in_use, NULL))) { htrc("Create rc=%d %s\n", rc, g->Message); @@ -6949,7 +6976,7 @@ ha_connect::check_if_supported_inplace_alter(TABLE *altered_table, xcp->newsep= xcp->SetName(g, GetStringOption("optname")); tshp= NULL; - if (trace && g->Xchk) + if (trace(1) && g->Xchk) htrc( "oldsep=%d newsep=%d oldopn=%s newopn=%s oldpix=%p newpix=%p\n", xcp->oldsep, xcp->newsep, @@ -7213,10 +7240,11 @@ static struct st_mysql_sys_var* connect_system_variables[]= { MYSQL_SYSVAR(class_path), MYSQL_SYSVAR(java_wrapper), #endif // JAVA_SUPPORT -#if defined(JAVA_SUPPORT) -//MYSQL_SYSVAR(enable_mongo), -#endif // JAVA_SUPPORT -NULL +#if defined(JAVA_SUPPORT) || defined(CMGO_SUPPORT) + MYSQL_SYSVAR(enable_mongo), +#endif // JAVA_SUPPORT || CMGO_SUPPORT + MYSQL_SYSVAR(cond_push), + NULL }; maria_declare_plugin(connect) @@ -7229,10 +7257,10 @@ maria_declare_plugin(connect) PLUGIN_LICENSE_GPL, connect_init_func, /* Plugin Init */ connect_done_func, /* Plugin Deinit */ - 0x0106, /* version number (1.05) */ + 0x0107, /* version number (1.05) */ NULL, /* status variables */ connect_system_variables, /* system variables */ - "1.06.0005", /* string version */ + "1.06.0007", /* string version */ MariaDB_PLUGIN_MATURITY_STABLE /* maturity */ } maria_declare_plugin_end; diff --git a/storage/connect/inihandl.cpp b/storage/connect/inihandl.cpp index 96ae0a67a..c039a980b 100644 --- a/storage/connect/inihandl.cpp +++ b/storage/connect/inihandl.cpp @@ -293,7 +293,7 @@ static PROFILESECTION *PROFILE_Load( FILE *file ) next_key = §ion->key; prev_key = NULL; - if (trace > 1) + if (trace(2)) htrc("New section: '%s'\n",section->name); continue; @@ -336,7 +336,7 @@ static PROFILESECTION *PROFILE_Load( FILE *file ) next_key = &key->next; prev_key = key; - if (trace > 1) + if (trace(2)) htrc("New key: name='%s', value='%s'\n", key->name,key->value?key->value:"(none)"); @@ -359,7 +359,7 @@ static BOOL PROFILE_FlushFile(void) FILE *file = NULL; struct stat buf; - if (trace > 1) + if (trace(2)) htrc("PROFILE_FlushFile: CurProfile=%p\n", CurProfile); if (!CurProfile) { @@ -398,7 +398,7 @@ static BOOL PROFILE_FlushFile(void) return FALSE; } // endif !file - if (trace > 1) + if (trace(2)) htrc("Saving '%s'\n", CurProfile->filename); PROFILE_Save(file, CurProfile->section); @@ -447,7 +447,7 @@ static BOOL PROFILE_Open(LPCSTR filename) struct stat buf; PROFILE *tempProfile; - if (trace > 1) + if (trace(2)) htrc("PROFILE_Open: CurProfile=%p N=%d\n", CurProfile, N_CACHED_PROFILES); /* First time around */ @@ -468,7 +468,7 @@ static BOOL PROFILE_Open(LPCSTR filename) /* Check for a match */ for (i = 0; i < N_CACHED_PROFILES; i++) { - if (trace > 1) + if (trace(2)) htrc("MRU=%s i=%d\n", SVP(MRUProfile[i]->filename), i); if (MRUProfile[i]->filename && !strcmp(filename, MRUProfile[i]->filename)) { @@ -483,11 +483,11 @@ static BOOL PROFILE_Open(LPCSTR filename) } // endif i if (!stat(CurProfile->filename, &buf) && CurProfile->mtime == buf.st_mtime) { - if (trace > 1) + if (trace(2)) htrc("(%s): already opened (mru=%d)\n", filename, i); } else { - if (trace > 1) + if (trace(2)) htrc("(%s): already opened, needs refreshing (mru=%d)\n", filename, i); } // endif stat @@ -535,11 +535,11 @@ static BOOL PROFILE_Open(LPCSTR filename) // strcpy(p, filename); // _strlwr(p); - if (trace > 1) + if (trace(2)) htrc("Opening %s\n", filename); if ((file = fopen(filename, "r"))) { - if (trace > 1) + if (trace(2)) htrc("(%s): found it\n", filename); // CurProfile->unix_name = malloc(strlen(buffer)+1); @@ -574,12 +574,12 @@ void PROFILE_Close(LPCSTR filename) struct stat buf; PROFILE *tempProfile; - if (trace > 1) + if (trace(2)) htrc("PROFILE_Close: CurProfile=%p N=%d\n", CurProfile, N_CACHED_PROFILES); /* Check for a match */ for (i = 0; i < N_CACHED_PROFILES; i++) { - if (trace > 1) + if (trace(2)) htrc("MRU=%s i=%d\n", SVP(MRUProfile[i]->filename), i); if (MRUProfile[i]->filename && !strcmp(filename, MRUProfile[i]->filename)) { @@ -591,7 +591,7 @@ void PROFILE_Close(LPCSTR filename) CurProfile=tempProfile; } // endif i - if (trace > 1) { + if (trace(2)) { if (!stat(CurProfile->filename, &buf) && CurProfile->mtime == buf.st_mtime) htrc("(%s): already opened (mru=%d)\n", filename, i); else @@ -620,7 +620,7 @@ void PROFILE_End(void) { int i; - if (trace) + if (trace(3)) htrc("PROFILE_End: CurProfile=%p N=%d\n", CurProfile, N_CACHED_PROFILES); if (!CurProfile) // Sergey Vojtovich @@ -628,7 +628,7 @@ void PROFILE_End(void) /* Close all opened files and free the cache structure */ for (i = 0; i < N_CACHED_PROFILES; i++) { - if (trace) + if (trace(3)) htrc("MRU=%s i=%d\n", SVP(MRUProfile[i]->filename), i); // CurProfile = MRUProfile[i]; Sergey Vojtovich @@ -894,7 +894,7 @@ static int PROFILE_GetSectionNames(LPSTR buffer, uint len) uint f,l; PROFILESECTION *section; - if (trace > 1) + if (trace(2)) htrc("GetSectionNames: buffer=%p len=%u\n", buffer, len); if (!buffer || !len) @@ -909,17 +909,17 @@ static int PROFILE_GetSectionNames(LPSTR buffer, uint len) buf = buffer; section = CurProfile->section; - if (trace > 1) + if (trace(2)) htrc("GetSectionNames: section=%p\n", section); while (section != NULL) { - if (trace > 1) + if (trace(2)) htrc("section=%s\n", section->name); if (section->name[0]) { l = strlen(section->name) + 1; - if (trace > 1) + if (trace(2)) htrc("l=%u f=%u\n", l, f); if (l > f) { @@ -982,7 +982,7 @@ static int PROFILE_GetString(LPCSTR section, LPCSTR key_name, key = PROFILE_Find(&CurProfile->section, section, key_name, FALSE, FALSE); PROFILE_CopyEntry(buffer, (key && key->value) ? key->value : def_val, len, FALSE); - if (trace > 1) + if (trace(2)) htrc("('%s','%s','%s'): returning '%s'\n", section, key_name, def_val, buffer ); @@ -1010,7 +1010,7 @@ static BOOL PROFILE_SetString(LPCSTR section_name, LPCSTR key_name, LPCSTR value, BOOL create_always) { if (!key_name) { /* Delete a whole section */ - if (trace > 1) + if (trace(2)) htrc("Deleting('%s')\n", section_name); CurProfile->changed |= PROFILE_DeleteSection(&CurProfile->section, @@ -1018,7 +1018,7 @@ static BOOL PROFILE_SetString(LPCSTR section_name, LPCSTR key_name, return TRUE; /* Even if PROFILE_DeleteSection() has failed, this is not an error on application's level.*/ } else if (!value) { /* Delete a key */ - if (trace > 1) + if (trace(2)) htrc("Deleting('%s','%s')\n", section_name, key_name); CurProfile->changed |= PROFILE_DeleteKey(&CurProfile->section, @@ -1027,7 +1027,7 @@ static BOOL PROFILE_SetString(LPCSTR section_name, LPCSTR key_name, } else { /* Set the key value */ PROFILEKEY *key = PROFILE_Find(&CurProfile->section, section_name, key_name, TRUE, create_always); - if (trace > 1) + if (trace(2)) htrc("Setting('%s','%s','%s')\n", section_name, key_name, value); if (!key) @@ -1040,17 +1040,17 @@ static BOOL PROFILE_SetString(LPCSTR section_name, LPCSTR key_name, value++; if (!strcmp(key->value, value)) { - if (trace > 1) + if (trace(2)) htrc(" no change needed\n" ); return TRUE; /* No change needed */ } // endif value - if (trace > 1) + if (trace(2)) htrc(" replacing '%s'\n", key->value); free(key->value); - } else if (trace > 1) + } else if (trace(2)) htrc(" creating key\n" ); key->value = (char*)malloc(strlen(value) + 1); @@ -1345,7 +1345,7 @@ GetPrivateProfileSectionNames(LPSTR buffer, DWORD size, LPCSTR filename) { DWORD ret = 0; - if (trace > 1) + if (trace(2)) htrc("GPPSN: filename=%s\n", filename); EnterCriticalSection(&PROFILE_CritSect); diff --git a/storage/connect/javaconn.cpp b/storage/connect/javaconn.cpp index 90f834ef9..d1be0ca18 100644 --- a/storage/connect/javaconn.cpp +++ b/storage/connect/javaconn.cpp @@ -363,7 +363,7 @@ bool JAVAConn::GetJVM(PGLOBAL g) bool JAVAConn::Open(PGLOBAL g) { bool brc = true, err = false; - jboolean jt = (trace > 0); + jboolean jt = (trace(1)); // Link or check whether jvm library was linked if (GetJVM(g)) @@ -430,7 +430,7 @@ bool JAVAConn::Open(PGLOBAL g) jpop->Append(cp); } // endif cp - if (trace) { + if (trace(1)) { htrc("ClassPath=%s\n", ClassPath); htrc("CLASSPATH=%s\n", cp); htrc("%s\n", jpop->GetStr()); @@ -486,7 +486,7 @@ bool JAVAConn::Open(PGLOBAL g) break; } // endswitch rc - if (trace) + if (trace(1)) htrc("%s\n", g->Message); if (brc) diff --git a/storage/connect/jdbconn.cpp b/storage/connect/jdbconn.cpp index 4c21c2c96..ddbc3115f 100644 --- a/storage/connect/jdbconn.cpp +++ b/storage/connect/jdbconn.cpp @@ -1,7 +1,7 @@ /************ Jdbconn C++ Functions Source Code File (.CPP) ************/ -/* Name: JDBCONN.CPP Version 1.1 */ +/* Name: JDBCONN.CPP Version 1.2 */ /* */ -/* (C) Copyright to the author Olivier BERTRAND 2016-2017 */ +/* (C) Copyright to the author Olivier BERTRAND 2016-2018 */ /* */ /* This file contains the JDBC connection classes functions. */ /***********************************************************************/ @@ -116,10 +116,26 @@ int TranslateJDBCType(int stp, char *tn, int prec, int& len, char& v) return TYPE_ERROR; else len = MY_MIN(abs(len), GetConvSize()); + // Pass through case 12: // VARCHAR + if (tn && !stricmp(tn, "TEXT")) + // Postgresql returns 12 for TEXT + if (GetTypeConv() == TPC_NO) + return TYPE_ERROR; + + // Postgresql can return this + if (len == 0x7FFFFFFF) + len = GetConvSize(); + + // Pass through case -9: // NVARCHAR (unicode) + // Postgresql can return this when size is unknown + if (len == 0x7FFFFFFF) + len = GetConvSize(); + v = 'V'; + // Pass through case 1: // CHAR case -15: // NCHAR (unicode) case -8: // ROWID @@ -154,13 +170,13 @@ int TranslateJDBCType(int stp, char *tn, int prec, int& len, char& v) case 91: // DATE, YEAR type = TYPE_DATE; - if (!tn || toupper(tn[0]) != 'Y') { - len = 10; - v = 'D'; - } else { - len = 4; - v = 'Y'; - } // endif len + if (!tn || toupper(tn[0]) != 'Y') { + len = 10; + v = 'D'; + } else { + len = 4; + v = 'Y'; + } // endif len break; case 92: // TIME @@ -192,6 +208,104 @@ int TranslateJDBCType(int stp, char *tn, int prec, int& len, char& v) return type; } // end of TranslateJDBCType + /***********************************************************************/ + /* A helper class to split an optionally qualified table name into */ + /* components. */ + /* These formats are understood: */ + /* "CatalogName.SchemaName.TableName" */ + /* "SchemaName.TableName" */ + /* "TableName" */ + /***********************************************************************/ +class SQLQualifiedName { + static const uint max_parts = 3; // Catalog.Schema.Table + MYSQL_LEX_STRING m_part[max_parts]; + char m_buf[512]; + + void lex_string_set(MYSQL_LEX_STRING *S, char *str, size_t length) + { + S->str = str; + S->length = length; + } // end of lex_string_set + + void lex_string_shorten_down(MYSQL_LEX_STRING *S, size_t offs) + { + DBUG_ASSERT(offs <= S->length); + S->str += offs; + S->length -= offs; + } // end of lex_string_shorten_down + + /*********************************************************************/ + /* Find the rightmost '.' delimiter and return the length */ + /* of the qualifier, including the rightmost '.' delimier. */ + /* For example, for the string {"a.b.c",5} it will return 4, */ + /* which is the length of the qualifier "a.b." */ + /*********************************************************************/ + size_t lex_string_find_qualifier(MYSQL_LEX_STRING *S) + { + size_t i; + for (i = S->length; i > 0; i--) + { + if (S->str[i - 1] == '.') + { + S->str[i - 1] = '\0'; + return i; + } + } + return 0; + } // end of lex_string_find_qualifier + +public: + /*********************************************************************/ + /* Initialize to the given optionally qualified name. */ + /* NULL pointer in "name" is supported. */ + /* name qualifier has precedence over schema. */ + /*********************************************************************/ + SQLQualifiedName(JCATPARM *cap) + { + const char *name = (const char *)cap->Tab; + char *db = (char *)cap->DB; + size_t len, i; + + // Initialize the parts + for (i = 0; i < max_parts; i++) + lex_string_set(&m_part[i], NULL, 0); + + if (name) { + // Initialize the first (rightmost) part + lex_string_set(&m_part[0], m_buf, + strmake(m_buf, name, sizeof(m_buf) - 1) - m_buf); + + // Initialize the other parts, if exist. + for (i = 1; i < max_parts; i++) { + if (!(len = lex_string_find_qualifier(&m_part[i - 1]))) + break; + + lex_string_set(&m_part[i], m_part[i - 1].str, len - 1); + lex_string_shorten_down(&m_part[i - 1], len); + } // endfor i + + } // endif name + + // If it was not specified, set schema as the passed db name + if (db && !m_part[1].length) + lex_string_set(&m_part[1], db, strlen(db)); + + } // end of SQLQualifiedName + + char *ptr(uint i) + { + DBUG_ASSERT(i < max_parts); + return (char *)(m_part[i].length ? m_part[i].str : NULL); + } // end of ptr + + size_t length(uint i) + { + DBUG_ASSERT(i < max_parts); + return m_part[i].length; + } // end of length + +}; // end of class SQLQualifiedName + /***********************************************************************/ /* Allocate the structure used to refer to the result set. */ /***********************************************************************/ @@ -270,7 +384,7 @@ PQRYRES JDBCColumns(PGLOBAL g, PCSZ db, PCSZ table, PCSZ colpat, length[11] = 255; } // endif jcp - if (trace) + if (trace(1)) htrc("JDBCColumns: max=%d len=%d,%d,%d,%d\n", maxres, length[0], length[1], length[2], length[3]); @@ -287,7 +401,7 @@ PQRYRES JDBCColumns(PGLOBAL g, PCSZ db, PCSZ table, PCSZ colpat, if (info || !qrp) // Info table return qrp; - if (trace) + if (trace(1)) htrc("Getting col results ncol=%d\n", qrp->Nbcol); if (!(cap = AllocCatInfo(g, JCAT_COL, db, table, qrp))) @@ -303,7 +417,7 @@ PQRYRES JDBCColumns(PGLOBAL g, PCSZ db, PCSZ table, PCSZ colpat, qrp->Nblin = n; // ResetNullValues(cap); - if (trace) + if (trace(1)) htrc("Columns: NBCOL=%d NBLIN=%d\n", qrp->Nbcol, qrp->Nblin); } else @@ -394,7 +508,7 @@ PQRYRES JDBCTables(PGLOBAL g, PCSZ db, PCSZ tabpat, PCSZ tabtyp, length[4] = 255; } // endif info - if (trace) + if (trace(1)) htrc("JDBCTables: max=%d len=%d,%d\n", maxres, length[0], length[1]); /************************************************************************/ @@ -417,7 +531,7 @@ PQRYRES JDBCTables(PGLOBAL g, PCSZ db, PCSZ tabpat, PCSZ tabtyp, cap->Pat = tabtyp; - if (trace) + if (trace(1)) htrc("Getting table results ncol=%d\n", cap->Qrp->Nbcol); /************************************************************************/ @@ -427,7 +541,7 @@ PQRYRES JDBCTables(PGLOBAL g, PCSZ db, PCSZ tabpat, PCSZ tabtyp, qrp->Nblin = n; // ResetNullValues(cap); - if (trace) + if (trace(1)) htrc("Tables: NBCOL=%d NBLIN=%d\n", qrp->Nbcol, qrp->Nblin); } else @@ -475,7 +589,7 @@ PQRYRES JDBCDrivers(PGLOBAL g, int maxres, bool info) } else maxres = 0; - if (trace) + if (trace(1)) htrc("JDBCDrivers: max=%d len=%d\n", maxres, length[0]); /************************************************************************/ @@ -519,7 +633,7 @@ JDBConn::JDBConn(PGLOBAL g, PCSZ wrapper) : JAVAConn(g, wrapper) xqid = xuid = xid = grs = readid = fetchid = typid = errid = nullptr; prepid = xpid = pcid = nullptr; chrfldid = intfldid = dblfldid = fltfldid = bigfldid = nullptr; - objfldid = datfldid = timfldid = tspfldid = nullptr; + objfldid = datfldid = timfldid = tspfldid = uidfldid = nullptr; DiscFunc = "JdbcDisconnect"; m_Ncol = 0; m_Aff = 0; @@ -535,12 +649,84 @@ JDBConn::JDBConn(PGLOBAL g, PCSZ wrapper) : JAVAConn(g, wrapper) m_IDQuoteChar[1] = 0; } // end of JDBConn -//JDBConn::~JDBConn() -// { -//if (Connected()) -// EndCom(); +/***********************************************************************/ +/* Search for UUID columns. */ +/***********************************************************************/ +bool JDBConn::SetUUID(PGLOBAL g, PTDBJDBC tjp) +{ + int ncol, ctyp; + bool brc = true; + PCSZ fnc = "GetColumns"; + PCOL colp; + JCATPARM *cap; + //jint jtyp; + jboolean rc = false; + jobjectArray parms; + jmethodID catid = nullptr; + + if (gmID(g, catid, fnc, "([Ljava/lang/String;)I")) + return true; + else if (gmID(g, intfldid, "IntField", "(ILjava/lang/String;)I")) + return true; + else if (gmID(g, readid, "ReadNext", "()I")) + return true; + + cap = AllocCatInfo(g, JCAT_COL, tjp->Schema, tjp->TableName, NULL); + SQLQualifiedName name(cap); + + // Build the java string array + parms = env->NewObjectArray(4, env->FindClass("java/lang/String"), NULL); + env->SetObjectArrayElement(parms, 0, env->NewStringUTF(name.ptr(2))); + env->SetObjectArrayElement(parms, 1, env->NewStringUTF(name.ptr(1))); + env->SetObjectArrayElement(parms, 2, env->NewStringUTF(name.ptr(0))); + + for (colp = tjp->GetColumns(); colp; colp = colp->GetNext()) { + env->SetObjectArrayElement(parms, 3, env->NewStringUTF(colp->GetName())); + ncol = env->CallIntMethod(job, catid, parms); + + if (Check(ncol)) { + sprintf(g->Message, "%s: %s", fnc, Msg); + goto err; + } // endif Check + + rc = env->CallBooleanMethod(job, readid); + + if (Check(rc)) { + sprintf(g->Message, "ReadNext: %s", Msg); + goto err; + } else if (rc == 0) { + sprintf(g->Message, "table %s does not exist", tjp->TableName); + goto err; + } // endif rc -// } // end of ~JDBConn + // Returns 666 is case of error + //jtyp = env->CallIntMethod(job, typid, 5, nullptr); + + //if (Check((jtyp == 666) ? -1 : 1)) { + // sprintf(g->Message, "Getting jtyp: %s", Msg); + // goto err; + //} // endif ctyp + + ctyp = (int)env->CallIntMethod(job, intfldid, 5, nullptr); + + if (Check(ctyp)) { + sprintf(g->Message, "Getting ctyp: %s", Msg); + goto err; + } // endif ctyp + + if (ctyp == 1111) + ((PJDBCCOL)colp)->uuid = true; + + } // endfor colp + + // All is Ok + brc = false; + + err: + // Not used anymore + env->DeleteLocalRef(parms); + return brc; +} // end of SetUUID /***********************************************************************/ /* Utility routine. */ @@ -586,7 +772,7 @@ bool JDBConn::Connect(PJPARM sop) int irc = RC_FX; bool err = false; jint rc; - jboolean jt = (trace > 0); + jboolean jt = (trace(1)); PGLOBAL& g = m_G; /*******************************************************************/ @@ -770,6 +956,7 @@ int JDBConn::Rewind(PCSZ sql) /***********************************************************************/ void JDBConn::SetColumnValue(int rank, PSZ name, PVAL val) { + const char *field; PGLOBAL& g = m_G; jint ctyp; jstring cn, jn = nullptr; @@ -793,6 +980,11 @@ void JDBConn::SetColumnValue(int rank, PSZ name, PVAL val) if (!gmID(g, objfldid, "ObjectField", "(ILjava/lang/String;)Ljava/lang/Object;")) { jb = env->CallObjectMethod(job, objfldid, (jint)rank, jn); + if (Check(0)) { + sprintf(g->Message, "Getting jp: %s", Msg); + throw (int)TYPE_AM_JDBC; + } // endif Check + if (jb == nullptr) { val->Reset(); val->SetNull(true); @@ -818,7 +1010,7 @@ void JDBConn::SetColumnValue(int rank, PSZ name, PVAL val) cn = nullptr; if (cn) { - const char *field = env->GetStringUTFChars(cn, (jboolean)false); + field = env->GetStringUTFChars(cn, (jboolean)false); val->SetValue_psz((PSZ)field); } else val->Reset(); @@ -885,6 +1077,19 @@ void JDBConn::SetColumnValue(int rank, PSZ name, PVAL val) break; case java.sql.Types.BOOLEAN: System.out.print(jdi.BooleanField(i)); */ + case 1111: // UUID + if (!gmID(g, uidfldid, "UuidField", "(ILjava/lang/String;)Ljava/lang/String;")) + cn = (jstring)env->CallObjectMethod(job, uidfldid, (jint)rank, jn); + else + cn = nullptr; + + if (cn) { + const char *field = env->GetStringUTFChars(cn, (jboolean)false); + val->SetValue_psz((PSZ)field); + } else + val->Reset(); + + break; case 0: // NULL val->SetNull(true); // passthru @@ -1055,7 +1260,14 @@ bool JDBConn::SetParam(JDBCCOL *colp) if (gmID(g, setid, "SetNullParm", "(II)I")) return true; - jrc = env->CallIntMethod(job, setid, i, (jint)GetJDBCType(val->GetType())); + jrc = env->CallIntMethod(job, setid, i, + (colp->uuid ? 1111 : (jint)GetJDBCType(val->GetType()))); + } else if (colp->uuid) { + if (gmID(g, setid, "SetUuidParm", "(ILjava/lang/String;)V")) + return true; + + jst = env->NewStringUTF(val->GetCharValue()); + env->CallVoidMethod(job, setid, i, jst); } else switch (val->GetType()) { case TYPE_STRING: if (gmID(g, setid, "SetStringParm", "(ILjava/lang/String;)V")) @@ -1274,105 +1486,6 @@ bool JDBConn::SetParam(JDBCCOL *colp) return qrp; } // end of GetMetaData - /***********************************************************************/ - /* A helper class to split an optionally qualified table name into */ - /* components. */ - /* These formats are understood: */ - /* "CatalogName.SchemaName.TableName" */ - /* "SchemaName.TableName" */ - /* "TableName" */ - /***********************************************************************/ - class SQLQualifiedName - { - static const uint max_parts= 3; // Catalog.Schema.Table - MYSQL_LEX_STRING m_part[max_parts]; - char m_buf[512]; - - void lex_string_set(MYSQL_LEX_STRING *S, char *str, size_t length) - { - S->str= str; - S->length= length; - } // end of lex_string_set - - void lex_string_shorten_down(MYSQL_LEX_STRING *S, size_t offs) - { - DBUG_ASSERT(offs <= S->length); - S->str+= offs; - S->length-= offs; - } // end of lex_string_shorten_down - - /*********************************************************************/ - /* Find the rightmost '.' delimiter and return the length */ - /* of the qualifier, including the rightmost '.' delimier. */ - /* For example, for the string {"a.b.c",5} it will return 4, */ - /* which is the length of the qualifier "a.b." */ - /*********************************************************************/ - size_t lex_string_find_qualifier(MYSQL_LEX_STRING *S) - { - size_t i; - for (i= S->length; i > 0; i--) - { - if (S->str[i - 1] == '.') - { - S->str[i - 1]= '\0'; - return i; - } - } - return 0; - } // end of lex_string_find_qualifier - - public: - /*********************************************************************/ - /* Initialize to the given optionally qualified name. */ - /* NULL pointer in "name" is supported. */ - /* name qualifier has precedence over schema. */ - /*********************************************************************/ - SQLQualifiedName(JCATPARM *cap) - { - const char *name = (const char *)cap->Tab; - char *db = (char *)cap->DB; - size_t len, i; - - // Initialize the parts - for (i = 0; i < max_parts; i++) - lex_string_set(&m_part[i], NULL, 0); - - if (name) { - // Initialize the first (rightmost) part - lex_string_set(&m_part[0], m_buf, - strmake(m_buf, name, sizeof(m_buf) - 1) - m_buf); - - // Initialize the other parts, if exist. - for (i= 1; i < max_parts; i++) { - if (!(len= lex_string_find_qualifier(&m_part[i - 1]))) - break; - - lex_string_set(&m_part[i], m_part[i - 1].str, len - 1); - lex_string_shorten_down(&m_part[i - 1], len); - } // endfor i - - } // endif name - - // If it was not specified, set schema as the passed db name - if (db && !m_part[1].length) - lex_string_set(&m_part[1], db, strlen(db)); - - } // end of SQLQualifiedName - - char *ptr(uint i) - { - DBUG_ASSERT(i < max_parts); - return (char *)(m_part[i].length ? m_part[i].str : NULL); - } // end of ptr - - size_t length(uint i) - { - DBUG_ASSERT(i < max_parts); - return m_part[i].length; - } // end of length - - }; // end of class SQLQualifiedName - /***********************************************************************/ /* Allocate recset and call SQLTables, SQLColumns or SQLPrimaryKeys. */ /***********************************************************************/ @@ -1443,7 +1556,7 @@ bool JDBConn::SetParam(JDBCCOL *colp) // Not used anymore env->DeleteLocalRef(parms); - if (trace) + if (trace(1)) htrc("Method %s returned %d columns\n", fnc, ncol); // n because we no more ignore the first column @@ -1488,7 +1601,7 @@ bool JDBConn::SetParam(JDBCCOL *colp) sprintf(g->Message, "Fetch: %s", Msg); return -1; } if (rc == 0) { - if (trace) + if (trace(1)) htrc("End of fetches i=%d\n", i); break; diff --git a/storage/connect/jdbconn.h b/storage/connect/jdbconn.h index 56f318d23..0c36cccad 100644 --- a/storage/connect/jdbconn.h +++ b/storage/connect/jdbconn.h @@ -29,6 +29,7 @@ class JDBConn : public JAVAConn { // Attributes public: char *GetQuoteChar(void) { return m_IDQuoteChar; } + bool SetUUID(PGLOBAL g, PTDBJDBC tjp); virtual int GetMaxValue(int infotype); public: @@ -58,13 +59,6 @@ class JDBConn : public JAVAConn { protected: // Members -#if 0 - JavaVM *jvm; // Pointer to the JVM (Java Virtual Machine) - JNIEnv *env; // Pointer to native interface - jclass jdi; // Pointer to the java wrapper class - jobject job; // The java wrapper class object - jmethodID errid; // The GetErrmsg method ID -#endif // 0 jmethodID xqid; // The ExecuteQuery method ID jmethodID xuid; // The ExecuteUpdate method ID jmethodID xid; // The Execute method ID @@ -84,8 +78,7 @@ class JDBConn : public JAVAConn { jmethodID timfldid; // The TimeField method ID jmethodID tspfldid; // The TimestampField method ID jmethodID bigfldid; // The BigintField method ID -// PCSZ Msg; -// PCSZ m_Wrap; + jmethodID uidfldid; // The UuidField method ID char m_IDQuoteChar[2]; PCSZ m_Pwd; int m_Ncol; diff --git a/storage/connect/jmgfam.cpp b/storage/connect/jmgfam.cpp index c7115cdd7..30f627914 100644 --- a/storage/connect/jmgfam.cpp +++ b/storage/connect/jmgfam.cpp @@ -298,7 +298,7 @@ int JMGFAM::ReadBuffer(PGLOBAL g) PSZ str = Jcp->GetDocument(); if (str) { - if (trace == 1) + if (trace(1)) htrc("%s\n", str); strncpy(Tdbp->GetLine(), str, Lrecl); diff --git a/storage/connect/jmgoconn.cpp b/storage/connect/jmgoconn.cpp index 4736641ef..1731ccbeb 100644 --- a/storage/connect/jmgoconn.cpp +++ b/storage/connect/jmgoconn.cpp @@ -254,7 +254,7 @@ bool JMgoConn::MakeCursor(PGLOBAL g, PTDB tdbp, PCSZ options, all = true; if (pipe && Options) { - if (trace) + if (trace(1)) htrc("Pipeline: %s\n", Options); p = strrchr(Options, ']'); @@ -312,13 +312,13 @@ bool JMgoConn::MakeCursor(PGLOBAL g, PTDB tdbp, PCSZ options, *(char*)p = ']'; // Restore Colist for discovery p = s->GetStr(); - if (trace) + if (trace(33)) htrc("New Pipeline: %s\n", p); return AggregateCollection(p); } else { if (filter || filp) { - if (trace) { + if (trace(1)) { if (filter) htrc("Filter: %s\n", filter); @@ -346,7 +346,7 @@ bool JMgoConn::MakeCursor(PGLOBAL g, PTDB tdbp, PCSZ options, tdbp->SetFilter(NULL); // Not needed anymore } // endif To_Filter - if (trace) + if (trace(33)) htrc("selector: %s\n", s->GetStr()); s->Resize(s->GetLength() + 1); @@ -355,7 +355,7 @@ bool JMgoConn::MakeCursor(PGLOBAL g, PTDB tdbp, PCSZ options, if (!all) { if (Options && *Options) { - if (trace) + if (trace(1)) htrc("options=%s\n", Options); op = Options; @@ -751,7 +751,7 @@ int JMgoConn::DocUpdate(PGLOBAL g, PTDB tdbp) jlong ar = env->CallLongMethod(job, updateid, upd); - if (trace) + if (trace(1)) htrc("DocUpdate: ar = %ld\n", ar); if (Check((int)ar)) { @@ -770,7 +770,7 @@ int JMgoConn::DocDelete(PGLOBAL g, bool all) int rc = RC_OK; jlong ar = env->CallLongMethod(job, deleteid, all); - if (trace) + if (trace(1)) htrc("DocDelete: ar = %ld\n", ar); if (Check((int)ar)) { diff --git a/storage/connect/json.cpp b/storage/connect/json.cpp index b86d2da21..98a4659ce 100644 --- a/storage/connect/json.cpp +++ b/storage/connect/json.cpp @@ -97,7 +97,7 @@ PJSON ParseJson(PGLOBAL g, char *s, int len, int *ptyp, bool *comma) PJSON jsp = NULL; STRG src; - if (trace) + if (trace(1)) htrc("ParseJson: s=%.10s len=%d\n", s, len); if (!s || !len) { @@ -165,7 +165,7 @@ PJSON ParseJson(PGLOBAL g, char *s, int len, int *ptyp, bool *comma) }; // endswitch s[i] if (!jsp) - sprintf(g->Message, "Invalid Json string '%.*s'", 50, s); + sprintf(g->Message, "Invalid Json string '%.*s'", MY_MIN(len, 50), s); else if (ptyp && pretty == 3) { *ptyp = 3; // Not recognized pretty @@ -178,7 +178,7 @@ PJSON ParseJson(PGLOBAL g, char *s, int len, int *ptyp, bool *comma) } // endif ptyp } catch (int n) { - if (trace) + if (trace(1)) htrc("Exception %d: %s\n", n, g->Message); jsp = NULL; } catch (const char *msg) { @@ -652,7 +652,7 @@ PSZ Serialize(PGLOBAL g, PJSON jsp, char *fn, int pretty) } // endif's } catch (int n) { - if (trace) + if (trace(1)) htrc("Exception %d: %s\n", n, g->Message); str = NULL; } catch (const char *msg) { @@ -1015,6 +1015,20 @@ PJAR JOBJECT::GetKeyList(PGLOBAL g) return jarp; } // end of GetKeyList +/***********************************************************************/ +/* Return all values as an array. */ +/***********************************************************************/ +PJAR JOBJECT::GetValList(PGLOBAL g) +{ + PJAR jarp = new(g) JARRAY(); + + for (PJPR jpp = First; jpp; jpp = jpp->Next) + jarp->AddValue(g, jpp->GetVal()); + + jarp->InitArray(g); + return jarp; +} // end of GetValList + /***********************************************************************/ /* Get the value corresponding to the given key. */ /***********************************************************************/ @@ -1224,6 +1238,7 @@ PJVAL JARRAY::AddValue(PGLOBAL g, PJVAL jvp, int *x) Last->Next = jvp; Last = jvp; + Last->Next = NULL; } // endif x return jvp; @@ -1318,6 +1333,24 @@ bool JARRAY::IsNull(void) /* -------------------------- Class JVALUE- -------------------------- */ +/***********************************************************************/ +/* Constructor for a JSON. */ +/***********************************************************************/ +JVALUE::JVALUE(PJSON jsp) : JSON() +{ + if (jsp->GetType() == TYPE_JVAL) { + Jsp = jsp->GetJsp(); + Value = jsp->GetValue(); + } else { + Jsp = jsp; + Value = NULL; + } // endif Type + + Next = NULL; + Del = false; + Size = 1; +} // end of JVALUE constructor + /***********************************************************************/ /* Constructor for a Value with a given string or numeric value. */ /***********************************************************************/ diff --git a/storage/connect/json.h b/storage/connect/json.h index 375532212..dcc972874 100644 --- a/storage/connect/json.h +++ b/storage/connect/json.h @@ -20,7 +20,8 @@ enum JTYP {TYPE_NULL = TYPE_VOID, TYPE_BINT = TYPE_BIGINT, TYPE_DTM = TYPE_DATE, TYPE_INTG = TYPE_INT, - TYPE_JSON = 12, + TYPE_VAL = 12, + TYPE_JSON, TYPE_JAR, TYPE_JOB, TYPE_JVAL}; @@ -157,6 +158,7 @@ class JSON : public BLOCK { //virtual PJVAL AddValue(PGLOBAL g, PJVAL jvp = NULL, int *x = NULL) {X return NULL;} virtual PJPR AddPair(PGLOBAL g, PCSZ key) {X return NULL;} virtual PJAR GetKeyList(PGLOBAL g) {X return NULL;} + virtual PJAR GetValList(PGLOBAL g) {X return NULL;} virtual PJVAL GetValue(const char *key) {X return NULL;} virtual PJOB GetObject(void) {return NULL;} virtual PJAR GetArray(void) {return NULL;} @@ -205,6 +207,7 @@ class JOBJECT : public JSON { virtual PJOB GetObject(void) {return this;} virtual PJVAL GetValue(const char* key); virtual PJAR GetKeyList(PGLOBAL g); + virtual PJAR GetValList(PGLOBAL g); virtual PSZ GetText(PGLOBAL g, PSZ text); virtual bool Merge(PGLOBAL g, PJSON jsp); virtual void SetValue(PGLOBAL g, PJVAL jvp, PCSZ key); @@ -258,8 +261,7 @@ class JVALUE : public JSON { friend bool SerializeValue(JOUT *, PJVAL); public: JVALUE(void) : JSON() {Clear();} - JVALUE(PJSON jsp) : JSON() - {Jsp = jsp; Value = NULL; Next = NULL; Del = false; Size = 1;} + JVALUE(PJSON jsp); JVALUE(PGLOBAL g, PVAL valp); JVALUE(PGLOBAL g, PCSZ strp); diff --git a/storage/connect/jsonudf.cpp b/storage/connect/jsonudf.cpp index 33af95a2b..794a84f22 100644 --- a/storage/connect/jsonudf.cpp +++ b/storage/connect/jsonudf.cpp @@ -1,6 +1,6 @@ /****************** jsonudf C++ Program Source Code File (.CPP) ******************/ -/* PROGRAM NAME: jsonudf Version 1.6 */ -/* (C) Copyright to the author Olivier BERTRAND 2015-2017 */ +/* PROGRAM NAME: jsonudf Version 1.7 */ +/* (C) Copyright to the author Olivier BERTRAND 2015-2018 */ /* This program are the JSON User Defined Functions . */ /*********************************************************************************/ @@ -31,16 +31,39 @@ bool IsNum(PSZ s); char *NextChr(PSZ s, char sep); char *GetJsonNull(void); uint GetJsonGrpSize(void); -static int IsJson(UDF_ARGS *args, uint i); +static int IsJson(UDF_ARGS *args, uint i, bool b = false); static PSZ MakePSZ(PGLOBAL g, UDF_ARGS *args, int i); static char *handle_item(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *res_length, char *is_null, char *error); static char *bin_handle_item(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *res_length, char *is_null, char *error); +static PJSON JsonNew(PGLOBAL g, JTYP type); +static PJVAL JvalNew(PGLOBAL g, JTYP type, void *vp = NULL); +static PJSNX JsnxNew(PGLOBAL g, PJSON jsp, int type, int len = 64); static uint JsonGrpSize = 10; -/* ----------------------------------- JSNX ------------------------------------ */ +/*********************************************************************************/ +/* SubAlloc a new JSNX class with protection against memory exhaustion. */ +/*********************************************************************************/ +static PJSNX JsnxNew(PGLOBAL g, PJSON jsp, int type, int len) +{ + PJSNX jsx; + + try { + jsx = new(g) JSNX(g, jsp, type, len); + } catch (...) { + if (trace(1023)) + htrc("%s\n", g->Message); + + PUSH_WARNING(g->Message); + jsx = NULL; + } // end try/catch + + return jsx; +} /* end of JsnxNew */ + + /* ----------------------------------- JSNX ------------------------------------ */ /*********************************************************************************/ /* JSNX public constructor. */ @@ -81,21 +104,7 @@ my_bool JSNX::SetJpath(PGLOBAL g, char *path, my_bool jb) return true; Value->SetNullable(true); - -#if 0 - if (jb) { - // Path must return a Json item - size_t n = strlen(path); - - if (!n || path[n - 1] != '*') { - Jpath = (char*)PlugSubAlloc(g, NULL, n + 3); - strcat(strcpy(Jpath, path), (n) ? ":*" : "*"); - } else - Jpath = path; - - } else -#endif // 0 - Jpath = path; + Jpath = path; // Parse the json path Parsed = false; @@ -182,7 +191,7 @@ my_bool JSNX::SetArrayOptions(PGLOBAL g, char *p, int i, PSZ nm) // Set concat intermediate string p[n - 1] = 0; - if (trace) + if (trace(1)) htrc("Concat string=%s\n", p + 1); jnp->CncVal = AllocateValue(g, p + 1, TYPE_STRING); @@ -246,7 +255,7 @@ my_bool JSNX::ParseJpath(PGLOBAL g) // Jpath = Name; return true; - if (trace) + if (trace(1)) htrc("ParseJpath %s\n", SVP(Jpath)); if (!(pbuf = PlgDBDup(g, Jpath))) @@ -309,7 +318,7 @@ my_bool JSNX::ParseJpath(PGLOBAL g) Nod = i; MulVal = AllocateValue(g, Value); - if (trace) + if (trace(1)) for (i = 0; i < Nod; i++) htrc("Node(%d) Key=%s Op=%d Rank=%d\n", i, SVP(Nodes[i].Key), Nodes[i].Op, Nodes[i].Rank); @@ -506,13 +515,13 @@ PVAL JSNX::CalculateArray(PGLOBAL g, PJAR arp, int n) vp->Reset(); - if (trace) + if (trace(1)) htrc("CalculateArray size=%d op=%d\n", ars, op); - for (i = 0; i < arp->size(); i++) { + for (i = 0; i < ars; i++) { jvrp = arp->GetValue(i); - if (trace) + if (trace(1)) htrc("i=%d nv=%d\n", i, nv); if (!jvrp->IsNull() || (op == OP_CNC && GetJsonNull())) { @@ -525,7 +534,7 @@ PVAL JSNX::CalculateArray(PGLOBAL g, PJAR arp, int n) } else jvp = jvrp; - if (trace) + if (trace(1)) htrc("jvp=%s null=%d\n", jvp->GetString(g), jvp->IsNull() ? 1 : 0); @@ -561,7 +570,7 @@ PVAL JSNX::CalculateArray(PGLOBAL g, PJAR arp, int n) if (err) vp->Reset(); - if (trace) { + if (trace(1)) { char buf(32); htrc("vp='%s' err=%d\n", @@ -753,6 +762,7 @@ my_bool JSNX::WriteValue(PGLOBAL g, PJVAL jvalp) /*********************************************************************************/ PSZ JSNX::Locate(PGLOBAL g, PJSON jsp, PJVAL jvp, int k) { + PSZ str = NULL; my_bool b = false, err = true; g->Message[0] = 0; @@ -762,37 +772,47 @@ PSZ JSNX::Locate(PGLOBAL g, PJSON jsp, PJVAL jvp, int k) return NULL; } // endif jsp - // Write to the path string - Jp = new(g) JOUTSTR(g); - Jp->WriteChr('$'); - Jvalp = jvp; - K = k; + try { + // Write to the path string + Jp = new(g) JOUTSTR(g); + Jp->WriteChr('$'); + Jvalp = jvp; + K = k; - switch (jsp->GetType()) { - case TYPE_JAR: - err = LocateArray((PJAR)jsp); - break; - case TYPE_JOB: - err = LocateObject((PJOB)jsp); - break; - case TYPE_JVAL: - err = LocateValue((PJVAL)jsp); - break; - default: - err = true; + switch (jsp->GetType()) { + case TYPE_JAR: + err = LocateArray((PJAR)jsp); + break; + case TYPE_JOB: + err = LocateObject((PJOB)jsp); + break; + case TYPE_JVAL: + err = LocateValue((PJVAL)jsp); + break; + default: + err = true; } // endswitch Type - if (err) { - if (!g->Message[0]) - strcpy(g->Message, "Invalid json tree"); + if (err) { + if (!g->Message[0]) + strcpy(g->Message, "Invalid json tree"); - } else if (Found) { - Jp->WriteChr('\0'); - PlugSubAlloc(g, NULL, Jp->N); - return Jp->Strp; - } // endif's + } else if (Found) { + Jp->WriteChr('\0'); + PlugSubAlloc(g, NULL, Jp->N); + str = Jp->Strp; + } // endif's - return NULL; + } catch (int n) { + if (trace(1)) + htrc("Exception %d: %s\n", n, g->Message); + + PUSH_WARNING(g->Message); + } catch (const char *msg) { + strcpy(g->Message, msg); + } // end catch + + return str; } // end of Locate /*********************************************************************************/ @@ -864,53 +884,62 @@ my_bool JSNX::LocateValue(PJVAL jvp) /*********************************************************************************/ PSZ JSNX::LocateAll(PGLOBAL g, PJSON jsp, PJVAL jvp, int mx) { + PSZ str = NULL; my_bool b = false, err = true; - PJPN jnp = (PJPN)PlugSubAlloc(g, NULL, sizeof(JPN) * mx); - - memset(jnp, 0, sizeof(JPN) * mx); - g->Message[0] = 0; - + PJPN jnp; + if (!jsp) { strcpy(g->Message, "Null json tree"); return NULL; } // endif jsp - // Write to the path string - Jp = new(g)JOUTSTR(g); - Jvalp = jvp; - Imax = mx - 1; - Jpnp = jnp; - Jp->WriteChr('['); + try { + jnp = (PJPN)PlugSubAlloc(g, NULL, sizeof(JPN) * mx); + memset(jnp, 0, sizeof(JPN) * mx); + g->Message[0] = 0; + + // Write to the path string + Jp = new(g)JOUTSTR(g); + Jvalp = jvp; + Imax = mx - 1; + Jpnp = jnp; + Jp->WriteChr('['); + + switch (jsp->GetType()) { + case TYPE_JAR: + err = LocateArrayAll((PJAR)jsp); + break; + case TYPE_JOB: + err = LocateObjectAll((PJOB)jsp); + break; + case TYPE_JVAL: + err = LocateValueAll((PJVAL)jsp); + break; + default: + err = true; + } // endswitch Type - switch (jsp->GetType()) { - case TYPE_JAR: - err = LocateArrayAll((PJAR)jsp); - break; - case TYPE_JOB: - err = LocateObjectAll((PJOB)jsp); - break; - case TYPE_JVAL: - err = LocateValueAll((PJVAL)jsp); - break; - default: - err = true; - } // endswitch Type + if (!err) { + if (Jp->N > 1) + Jp->N--; - if (err) { - if (!g->Message[0]) + Jp->WriteChr(']'); + Jp->WriteChr('\0'); + PlugSubAlloc(g, NULL, Jp->N); + str = Jp->Strp; + } else if (!g->Message[0]) strcpy(g->Message, "Invalid json tree"); - return NULL; - } else { - if (Jp->N > 1) - Jp->N--; + } catch (int n) { + if (trace(1)) + htrc("Exception %d: %s\n", n, g->Message); - Jp->WriteChr(']'); - Jp->WriteChr('\0'); - PlugSubAlloc(g, NULL, Jp->N); - return Jp->Strp; - } // endif's + PUSH_WARNING(g->Message); + } catch (const char *msg) { + strcpy(g->Message, msg); + } // end catch + return str; } // end of LocateAll /*********************************************************************************/ @@ -1137,6 +1166,72 @@ inline void JsonFreeMem(PGLOBAL g) PlugExit(g); } /* end of JsonFreeMem */ +/*********************************************************************************/ +/* SubAlloc a new JSON item with protection against memory exhaustion. */ +/*********************************************************************************/ +static PJSON JsonNew(PGLOBAL g, JTYP type) +{ + PJSON jsp = NULL; + + try { + switch (type) { + case TYPE_JAR: + jsp = new(g) JARRAY; + break; + case TYPE_JOB: + jsp = new(g) JOBJECT; + break; + default: + break; + } // endswitch type + + } catch (...) { + if (trace(1023)) + htrc("%s\n", g->Message); + + PUSH_WARNING(g->Message); + } // end try/catch + + return jsp; +} /* end of JsonNew */ + +/*********************************************************************************/ +/* SubAlloc a new JValue with protection against memory exhaustion. */ +/*********************************************************************************/ +static PJVAL JvalNew(PGLOBAL g, JTYP type, void *vp) +{ + PJVAL jvp = NULL; + + try { + if (!vp) + jvp = new (g) JVALUE; + else switch (type) { + case TYPE_JSON: + case TYPE_JVAL: + case TYPE_JAR: + case TYPE_JOB: + jvp = new(g) JVALUE((PJSON)vp); + break; + case TYPE_VAL: + jvp = new(g) JVALUE(g, (PVAL)vp); + break; + case TYPE_STRG: + jvp = new(g) JVALUE(g, (PCSZ)vp); + break; + default: + break; + } // endswitch type + + } catch (...) { + if (trace(1023)) + htrc("%s\n", g->Message); + + PUSH_WARNING(g->Message); + } // end try/catch + + return jvp; +} /* end of JsonNew */ + /*********************************************************************************/ /* Allocate and initialise the memory area. */ /*********************************************************************************/ @@ -1289,8 +1384,11 @@ static int *GetIntArgPtr(PGLOBAL g, UDF_ARGS *args, uint& n) for (uint i = n; i < args->arg_count; i++) if (args->arg_type[i] == INT_RESULT) { if (args->args[i]) { - x = (int*)PlugSubAlloc(g, NULL, sizeof(int)); - *x = (int)*(longlong*)args->args[i]; + if ((x = (int*)PlgDBSubAlloc(g, NULL, sizeof(int)))) + *x = (int)*(longlong*)args->args[i]; + else + PUSH_WARNING(g->Message); + } // endif args n = i + 1; @@ -1303,7 +1401,7 @@ static int *GetIntArgPtr(PGLOBAL g, UDF_ARGS *args, uint& n) /*********************************************************************************/ /* Returns not 0 if the argument is a JSON item or file name. */ /*********************************************************************************/ -static int IsJson(UDF_ARGS *args, uint i) +static int IsJson(UDF_ARGS *args, uint i, bool b) { int n = 0; @@ -1320,8 +1418,20 @@ static int IsJson(UDF_ARGS *args, uint i) else n = 2; // A file name may have been returned - } else if (!strnicmp(args->attributes[i], "Jfile_", 6)) + } else if (!strnicmp(args->attributes[i], "Jfile_", 6)) { n = 2; // arg is a json file name + } else if (b) { + char *sap; + PGLOBAL g = PlugInit(NULL, args->lengths[i] * M + 1024); + + JsonSubSet(g); + sap = MakePSZ(g, args, i); + + if (ParseJson(g, sap, strlen(sap))) + n = 4; + + JsonFreeMem(g); + } // endif's return n; } // end of IsJson @@ -1534,10 +1644,14 @@ static PSZ MakePSZ(PGLOBAL g, UDF_ARGS *args, int i) { if (args->arg_count > (unsigned)i && args->args[i]) { int n = args->lengths[i]; - PSZ s = (PSZ)PlugSubAlloc(g, NULL, n + 1); + PSZ s = (PSZ)PlgDBSubAlloc(g, NULL, n + 1); + + if (s) { + memcpy(s, args->args[i], n); + s[n] = 0; + } else + PUSH_WARNING(g->Message); - memcpy(s, args->args[i], n); - s[n] = 0; return s; } else return NULL; @@ -1574,9 +1688,12 @@ static PCSZ MakeKey(PGLOBAL g, UDF_ARGS *args, int i) return "Key"; if (!b) { - p = (PSZ)PlugSubAlloc(g, NULL, n + 1); - memcpy(p, s, n); - p[n] = 0; + if ((p = (PSZ)PlgDBSubAlloc(g, NULL, n + 1))) { + memcpy(p, s, n); + p[n] = 0; + } else + PUSH_WARNING(g->Message); + s = p; } // endif b @@ -1665,15 +1782,16 @@ static char *GetJsonFile(PGLOBAL g, char *fn) return NULL; } // endif len - str = (char*)PlugSubAlloc(g, NULL, len + 1); - - if ((n = read(h, str, len)) < 0) { - sprintf(g->Message, "Error %d reading %d bytes from %s", errno, len, fn); - return NULL; - } // endif n + if ((str = (char*)PlgDBSubAlloc(g, NULL, len + 1))) { + if ((n = read(h, str, len)) < 0) { + sprintf(g->Message, "Error %d reading %d bytes from %s", errno, len, fn); + return NULL; + } // endif n - str[n] = 0; - close(h); + str[n] = 0; + close(h); + } // endif str + return str; } // end of GetJsonFile @@ -1759,6 +1877,41 @@ static PJVAL MakeValue(PGLOBAL g, UDF_ARGS *args, uint i, PJSON *top = NULL) return jvp; } // end of MakeValue +/*********************************************************************************/ +/* Try making a JSON value of the passed type from the passed argument. */ +/*********************************************************************************/ +static PJVAL MakeTypedValue(PGLOBAL g, UDF_ARGS *args, uint i, + JTYP type, PJSON *top = NULL) +{ + char *sap; + PJSON jsp; + PJVAL jvp = MakeValue(g, args, i, top); + + //if (type == TYPE_JSON) { + // if (jvp->GetValType() >= TYPE_JSON) + // return jvp; + + //} else if (jvp->GetValType() == type) + // return jvp; + + if (jvp->GetValType() == TYPE_STRG) { + sap = jvp->GetString(g); + + if ((jsp = ParseJson(g, sap, strlen(sap)))) { + if ((type == TYPE_JSON && jsp->GetType() != TYPE_JVAL) || jsp->GetType() == type) { + if (top) + *top = jsp; + + jvp->SetValue(jsp); + } // endif Type + + } // endif jsp + + } // endif Type + + return jvp; +} // end of MakeTypedValue + /*********************************************************************************/ /* Make a Json value containing the parameter. */ /*********************************************************************************/ @@ -1861,9 +2014,9 @@ my_bool json_array_add_values_init(UDF_INIT *initid, UDF_ARGS *args, char *messa if (args->arg_count < 2) { strcpy(message, "This function must have at least 2 arguments"); return true; - } else if (!IsJson(args, 0) && args->arg_type[0] != STRING_RESULT) { - strcpy(message, "First argument must be a json string or item"); - return true; + //} else if (!IsJson(args, 0, true)) { + // strcpy(message, "First argument must be a valid json string or item"); + // return true; } else CalcLen(args, false, reslen, memlen); @@ -1891,23 +2044,14 @@ char *json_array_add_values(UDF_INIT *initid, UDF_ARGS *args, char *result, if (!g->Xchk) { if (!CheckMemory(g, initid, args, args->arg_count, true)) { - char *p; PJSON top; PJAR arp; - PJVAL jvp = MakeValue(g, args, 0, &top); + PJVAL jvp = MakeTypedValue(g, args, 0, TYPE_JAR, &top); - if ((p = jvp->GetString(g))) { - if (!(top = ParseJson(g, p, strlen(p)))) { - PUSH_WARNING(g->Message); - return NULL; - } // endif jsp - - jvp->SetValue(top); - } // endif p - if (jvp->GetValType() != TYPE_JAR) { arp = new(g)JARRAY; arp->AddValue(g, jvp); + top = arp; } else arp = jvp->GetArray(); @@ -1915,7 +2059,6 @@ char *json_array_add_values(UDF_INIT *initid, UDF_ARGS *args, char *result, arp->AddValue(g, MakeValue(g, args, i)); arp->InitArray(g); -// str = Serialize(g, arp, NULL, 0); str = MakeResult(g, args, top, args->arg_count); } // endif CheckMemory @@ -1952,10 +2095,10 @@ my_bool json_array_add_init(UDF_INIT *initid, UDF_ARGS *args, char *message) if (args->arg_count < 2) { strcpy(message, "This function must have at least 2 arguments"); - return true; - } else if (!IsJson(args, 0)) { - strcpy(message, "First argument must be a json item"); - return true; + return true; + //} else if (!IsJson(args, 0, true)) { + // strcpy(message, "First argument is not a valid Json item"); + // return true; } else CalcLen(args, false, reslen, memlen, true); @@ -1994,22 +2137,38 @@ char *json_array_add(UDF_INIT *initid, UDF_ARGS *args, char *result, PJVAL jvp; PJAR arp; - jvp = MakeValue(g, args, 0, &top); + jvp = MakeTypedValue(g, args, 0, TYPE_JSON, &top); jsp = jvp->GetJson(); x = GetIntArgPtr(g, args, n); if (CheckPath(g, args, jsp, jvp, 2)) PUSH_WARNING(g->Message); - else if (jvp && jvp->GetValType() == TYPE_JAR) { + else if (jvp) { PGLOBAL gb = GetMemPtr(g, args, 0); - arp = jvp->GetArray(); - arp->AddValue(gb, MakeValue(gb, args, 1), x); - arp->InitArray(gb); - str = MakeResult(g, args, top, n); + if (jvp->GetValType() != TYPE_JAR) { + if ((arp = (PJAR)JsonNew(gb, TYPE_JAR))) { + arp->AddValue(gb, JvalNew(gb, TYPE_JVAL, jvp)); + jvp->SetValue(arp); + + if (!top) + top = arp; + + } // endif arp + + } else + arp = jvp->GetArray(); + + if (arp) { + arp->AddValue(gb, MakeValue(gb, args, 1), x); + arp->InitArray(gb); + str = MakeResult(g, args, top, n); + } else + PUSH_WARNING(gb->Message); + } else { - PUSH_WARNING("First argument target is not an array"); -// if (g->Mrr) *error = 1; (only if no path) + PUSH_WARNING("Target is not an array"); + // if (g->Mrr) *error = 1; (only if no path) } // endif jvp } // endif CheckMemory @@ -2048,9 +2207,6 @@ my_bool json_array_delete_init(UDF_INIT *initid, UDF_ARGS *args, char *message) if (args->arg_count < 2) { strcpy(message, "This function must have at least 2 arguments"); return true; - } else if (!IsJson(args, 0)) { - strcpy(message, "First argument must be a json item"); - return true; } else CalcLen(args, false, reslen, memlen, true); @@ -2087,7 +2243,7 @@ char *json_array_delete(UDF_INIT *initid, UDF_ARGS *args, char *result, uint n = 1; PJSON top; PJAR arp; - PJVAL jvp = MakeValue(g, args, 0, &top); + PJVAL jvp = MakeTypedValue(g, args, 0, TYPE_JSON, &top); if (!(x = GetIntArgPtr(g, args, n))) PUSH_WARNING("Missing or null array index"); @@ -2186,9 +2342,14 @@ long long jsonsum_int(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *err if (g->N) { // Keep result of constant function - long long *np = (long long*)PlugSubAlloc(g, NULL, sizeof(long long)); - *np = n; - g->Activityp = (PACTIVITY)np; + long long *np; + + if ((np = (long long*)PlgDBSubAlloc(g, NULL, sizeof(long long)))) { + *np = n; + g->Activityp = (PACTIVITY)np; + } else + PUSH_WARNING(g->Message); + } // endif const_item return n; @@ -2252,13 +2413,21 @@ double jsonsum_real(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error } else { *error = 1; n = -1.0; - } // end of CheckMemory + } // endif CheckMemory if (g->N) { // Keep result of constant function - double *np = (double*)PlugSubAlloc(g, NULL, sizeof(double)); - *np = n; - g->Activityp = (PACTIVITY)np; + double *np; + + if ((np = (double*)PlgDBSubAlloc(g, NULL, sizeof(double)))) { + *np = n; + g->Activityp = (PACTIVITY)np; + } else { + PUSH_WARNING(g->Message); + *error = 1; + n = -1.0; + } // endif np + } // endif const_item return n; @@ -2312,13 +2481,20 @@ double jsonavg_real(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error } else { *error = 1; n = -1.0; - } // end of CheckMemory + } // endif CheckMemory if (g->N) { // Keep result of constant function - double *np = (double*)PlugSubAlloc(g, NULL, sizeof(double)); - *np = n; - g->Activityp = (PACTIVITY)np; + double *np; + + if ((np = (double*)PlgDBSubAlloc(g, NULL, sizeof(double)))) { + *np = n; + g->Activityp = (PACTIVITY)np; + } else { + *error = 1; + n = -1.0; + } // endif np + } // endif const_item return n; @@ -2348,12 +2524,15 @@ char *json_make_object(UDF_INIT *initid, UDF_ARGS *args, char *result, if (!g->Xchk) { if (!CheckMemory(g, initid, args, args->arg_count, false, false, true)) { - PJOB objp = new(g)JOBJECT; + PJOB objp; + + if ((objp = (PJOB)JsonNew(g, TYPE_JOB))) { + for (uint i = 0; i < args->arg_count; i++) + objp->SetValue(g, MakeValue(g, args, i), MakeKey(g, args, i)); - for (uint i = 0; i < args->arg_count; i++) - objp->SetValue(g, MakeValue(g, args, i), MakeKey(g, args, i)); + str = Serialize(g, objp, NULL, 0); + } // endif objp - str = Serialize(g, objp, NULL, 0); } // endif CheckMemory if (!str) @@ -2394,13 +2573,16 @@ char *json_object_nonull(UDF_INIT *initid, UDF_ARGS *args, char *result, if (!g->Xchk) { if (!CheckMemory(g, initid, args, args->arg_count, false, true)) { PJVAL jvp; - PJOB objp = new(g)JOBJECT; + PJOB objp; + + if ((objp = (PJOB)JsonNew(g, TYPE_JOB))) { + for (uint i = 0; i < args->arg_count; i++) + if (!(jvp = MakeValue(g, args, i))->IsNull()) + objp->SetValue(g, jvp, MakeKey(g, args, i)); - for (uint i = 0; i < args->arg_count; i++) - if (!(jvp = MakeValue(g, args, i))->IsNull()) - objp->SetValue(g, jvp, MakeKey(g, args, i)); + str = Serialize(g, objp, NULL, 0); + } // endif objp - str = Serialize(g, objp, NULL, 0); } // endif CheckMemory if (!str) @@ -2444,12 +2626,15 @@ char *json_object_key(UDF_INIT *initid, UDF_ARGS *args, char *result, if (!g->Xchk) { if (!CheckMemory(g, initid, args, args->arg_count, false, true)) { - PJOB objp = new(g)JOBJECT; + PJOB objp; + + if ((objp = (PJOB)JsonNew(g, TYPE_JOB))) { + for (uint i = 0; i < args->arg_count; i += 2) + objp->SetValue(g, MakeValue(g, args, i + 1), MakePSZ(g, args, i)); - for (uint i = 0; i < args->arg_count; i += 2) - objp->SetValue(g, MakeValue(g, args, i+1), MakePSZ(g, args, i)); + str = Serialize(g, objp, NULL, 0); + } // endif objp - str = Serialize(g, objp, NULL, 0); } // endif CheckMemory if (!str) @@ -2731,6 +2916,82 @@ void json_object_list_deinit(UDF_INIT* initid) JsonFreeMem((PGLOBAL)initid->ptr); } // end of json_object_list_deinit +/*********************************************************************************/ +/* Returns an array of the Json object values. */ +/*********************************************************************************/ +my_bool json_object_values_init(UDF_INIT *initid, UDF_ARGS *args, char *message) +{ + unsigned long reslen, memlen; + + if (args->arg_count != 1) { + strcpy(message, "This function must have 1 argument"); + return true; + } else if (!IsJson(args, 0) && args->arg_type[0] != STRING_RESULT) { + strcpy(message, "Argument must be a json object"); + return true; + } else + CalcLen(args, false, reslen, memlen); + + return JsonInit(initid, args, message, true, reslen, memlen); +} // end of json_object_list_init + +char *json_object_values(UDF_INIT *initid, UDF_ARGS *args, char *result, + unsigned long *res_length, char *is_null, char *error) +{ + char *str = NULL; + PGLOBAL g = (PGLOBAL)initid->ptr; + + if (!g->N) { + if (!CheckMemory(g, initid, args, 1, true, true)) { + char *p; + PJSON jsp; + PJVAL jvp = MakeValue(g, args, 0); + + if ((p = jvp->GetString(g))) { + if (!(jsp = ParseJson(g, p, strlen(p)))) { + PUSH_WARNING(g->Message); + return NULL; + } // endif jsp + + } else + jsp = jvp->GetJson(); + + if (jsp->GetType() == TYPE_JOB) { + PJAR jarp = ((PJOB)jsp)->GetValList(g); + + if (!(str = Serialize(g, jarp, NULL, 0))) + PUSH_WARNING(g->Message); + + } else { + PUSH_WARNING("First argument is not an object"); + if (g->Mrr) *error = 1; + } // endif jvp + + } // endif CheckMemory + + if (initid->const_item) { + // Keep result of constant function + g->Xchk = str; + g->N = 1; // str can be NULL + } // endif const_item + + } else + str = (char*)g->Xchk; + + if (!str) { + *is_null = 1; + *res_length = 0; + } else + *res_length = strlen(str); + + return str; +} // end of json_object_values + +void json_object_values_deinit(UDF_INIT* initid) +{ + JsonFreeMem((PGLOBAL)initid->ptr); +} // end of json_object_values_deinit + /*********************************************************************************/ /* Set the value of JsonGrpSize. */ /*********************************************************************************/ @@ -2795,7 +3056,7 @@ my_bool json_array_grp_init(UDF_INIT *initid, UDF_ARGS *args, char *message) PGLOBAL g = (PGLOBAL)initid->ptr; PlugSubSet(g, g->Sarea, g->Sarea_Size); - g->Activityp = (PACTIVITY)new(g) JARRAY; + g->Activityp = (PACTIVITY)JsonNew(g, TYPE_JAR); g->N = (int)n; return false; } // end of json_array_grp_init @@ -2805,7 +3066,7 @@ void json_array_grp_add(UDF_INIT *initid, UDF_ARGS *args, char*, char*) PGLOBAL g = (PGLOBAL)initid->ptr; PJAR arp = (PJAR)g->Activityp; - if (g->N-- > 0) + if (arp && g->N-- > 0) arp->AddValue(g, MakeValue(g, args, 0)); } // end of json_array_grp_add @@ -2820,12 +3081,16 @@ char *json_array_grp(UDF_INIT *initid, UDF_ARGS *, char *result, if (g->N < 0) PUSH_WARNING("Result truncated to json_grp_size values"); - arp->InitArray(g); + if (arp) { + arp->InitArray(g); + str = Serialize(g, arp, NULL, 0); + } else + str = NULL; - if (!(str = Serialize(g, arp, NULL, 0))) - str = strcpy(result, g->Message); + if (!str) + str = strcpy(result, g->Message); - *res_length = strlen(str); + *res_length = strlen(str); return str; } // end of json_array_grp @@ -2834,8 +3099,8 @@ void json_array_grp_clear(UDF_INIT *initid, char*, char*) PGLOBAL g = (PGLOBAL)initid->ptr; PlugSubSet(g, g->Sarea, g->Sarea_Size); - g->Activityp = (PACTIVITY)new(g) JARRAY; - g->N = GetJsonGroupSize(); + g->Activityp = (PACTIVITY)JsonNew(g, TYPE_JAR); + g->N = GetJsonGroupSize(); } // end of json_array_grp_clear void json_array_grp_deinit(UDF_INIT* initid) @@ -2868,7 +3133,7 @@ my_bool json_object_grp_init(UDF_INIT *initid, UDF_ARGS *args, char *message) PGLOBAL g = (PGLOBAL)initid->ptr; PlugSubSet(g, g->Sarea, g->Sarea_Size); - g->Activityp = (PACTIVITY)new(g) JOBJECT; + g->Activityp = (PACTIVITY)JsonNew(g, TYPE_JOB); g->N = (int)n; return false; } // end of json_object_grp_init @@ -2893,7 +3158,7 @@ char *json_object_grp(UDF_INIT *initid, UDF_ARGS *, char *result, if (g->N < 0) PUSH_WARNING("Result truncated to json_grp_size values"); - if (!(str = Serialize(g, objp, NULL, 0))) + if (!objp || !(str = Serialize(g, objp, NULL, 0))) str = strcpy(result, g->Message); *res_length = strlen(str); @@ -2905,8 +3170,8 @@ void json_object_grp_clear(UDF_INIT *initid, char*, char*) PGLOBAL g = (PGLOBAL)initid->ptr; PlugSubSet(g, g->Sarea, g->Sarea_Size); - g->Activityp = (PACTIVITY)new(g) JOBJECT; - g->N = GetJsonGroupSize(); + g->Activityp = (PACTIVITY)JsonNew(g, TYPE_JOB); + g->N = GetJsonGroupSize(); } // end of json_object_grp_clear void json_object_grp_deinit(UDF_INIT* initid) @@ -3051,7 +3316,7 @@ my_bool json_get_item_init(UDF_INIT *initid, UDF_ARGS *args, char *message) char *json_get_item(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *res_length, char *is_null, char *) { - char *p, *path, *str = NULL; + char *path, *str = NULL; PJSON jsp; PJVAL jvp; PJSNX jsx; @@ -3067,17 +3332,10 @@ char *json_get_item(UDF_INIT *initid, UDF_ARGS *args, char *result, if (CheckMemory(g, initid, args, 1, true, true)) { PUSH_WARNING("CheckMemory error"); goto fin; - } else - jvp = MakeValue(g, args, 0); - - if ((p = jvp->GetString(g))) { - if (!(jsp = ParseJson(g, p, strlen(p)))) { - PUSH_WARNING(g->Message); - return NULL; - } // endif jsp + } // endif CheckMemory - } else - jsp = jvp->GetJson(); + jvp = MakeTypedValue(g, args, 0, TYPE_JSON); + jsp = jvp->GetJson(); if (g->Mrr) { // First argument is a constant g->Xchk = jsp; @@ -3088,9 +3346,9 @@ char *json_get_item(UDF_INIT *initid, UDF_ARGS *args, char *result, jsp = (PJSON)g->Xchk; path = MakePSZ(g, args, 1); - jsx = new(g) JSNX(g, jsp, TYPE_STRING, initid->max_length); + jsx = JsnxNew(g, jsp, TYPE_STRING, initid->max_length); - if (jsx->SetJpath(g, path, true)) { + if (!jsx || jsx->SetJpath(g, path, true)) { PUSH_WARNING(g->Message); *is_null = 1; return NULL; @@ -3203,9 +3461,9 @@ char *jsonget_string(UDF_INIT *initid, UDF_ARGS *args, char *result, jsp = (PJSON)g->Xchk; path = MakePSZ(g, args, 1); - jsx = new(g) JSNX(g, jsp, TYPE_STRING, initid->max_length); + jsx = JsnxNew(g, jsp, TYPE_STRING, initid->max_length); - if (jsx->SetJpath(g, path)) { + if (!jsx || jsx->SetJpath(g, path)) { PUSH_WARNING(g->Message); goto err; } // endif SetJpath @@ -3220,7 +3478,7 @@ char *jsonget_string(UDF_INIT *initid, UDF_ARGS *args, char *result, g->Activityp = (PACTIVITY)str; } catch (int n) { - if (trace) + if (trace(1)) htrc("Exception %d: %s\n", n, g->Message); PUSH_WARNING(g->Message); @@ -3320,9 +3578,9 @@ long long jsonget_int(UDF_INIT *initid, UDF_ARGS *args, jsp = (PJSON)g->Xchk; path = MakePSZ(g, args, 1); - jsx = new(g) JSNX(g, jsp, TYPE_BIGINT); + jsx = JsnxNew(g, jsp, TYPE_BIGINT); - if (jsx->SetJpath(g, path)) { + if (!jsx || jsx->SetJpath(g, path)) { PUSH_WARNING(g->Message); *is_null = 1; return 0; @@ -3339,9 +3597,14 @@ long long jsonget_int(UDF_INIT *initid, UDF_ARGS *args, if (initid->const_item) { // Keep result of constant function - long long *np = (long long*)PlugSubAlloc(g, NULL, sizeof(long long)); - *np = n; - g->Activityp = (PACTIVITY)np; + long long *np = (long long*)PlgDBSubAlloc(g, NULL, sizeof(long long)); + + if (np) { + *np = n; + g->Activityp = (PACTIVITY)np; + } else + PUSH_WARNING(g->Message); + } // endif const_item return n; @@ -3434,9 +3697,9 @@ double jsonget_real(UDF_INIT *initid, UDF_ARGS *args, jsp = (PJSON)g->Xchk; path = MakePSZ(g, args, 1); - jsx = new(g) JSNX(g, jsp, TYPE_DOUBLE); + jsx = JsnxNew(g, jsp, TYPE_DOUBLE); - if (jsx->SetJpath(g, path)) { + if (!jsx || jsx->SetJpath(g, path)) { PUSH_WARNING(g->Message); *is_null = 1; return 0.0; @@ -3453,9 +3716,17 @@ double jsonget_real(UDF_INIT *initid, UDF_ARGS *args, if (initid->const_item) { // Keep result of constant function - double *dp = (double*)PlugSubAlloc(g, NULL, sizeof(double)); - *dp = d; - g->Activityp = (PACTIVITY)dp; + double *dp; + + if ((dp = (double*)PlgDBSubAlloc(g, NULL, sizeof(double)))) { + *dp = d; + g->Activityp = (PACTIVITY)dp; + } else { + PUSH_WARNING(g->Message); + *is_null = 1; + return 0.0; + } // endif dp + } // endif const_item return d; @@ -3501,7 +3772,7 @@ my_bool jsonlocate_init(UDF_INIT *initid, UDF_ARGS *args, char *message) char *jsonlocate(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *res_length, char *is_null, char *error) { - char *p, *path = NULL; + char *path = NULL; int k; PJVAL jvp, jvp2; PJSON jsp; @@ -3529,16 +3800,20 @@ char *jsonlocate(UDF_INIT *initid, UDF_ARGS *args, char *result, *error = 1; goto err; } else - jvp = MakeValue(g, args, 0); - - if ((p = jvp->GetString(g))) { - if (!(jsp = ParseJson(g, p, strlen(p)))) { - PUSH_WARNING(g->Message); - goto err; - } // endif jsp - - } else - jsp = jvp->GetJson(); + jvp = MakeTypedValue(g, args, 0, TYPE_JSON); + + //if ((p = jvp->GetString(g))) { + // if (!(jsp = ParseJson(g, p, strlen(p)))) { + // PUSH_WARNING(g->Message); + // goto err; + // } // endif jsp + //} else + // jsp = jvp->GetJson(); + + if (!(jsp = jvp->GetJson())) { + PUSH_WARNING("First argument is not a valid JSON item"); + goto err; + } // endif jsp if (g->Mrr) { // First argument is a constant g->Xchk = jsp; @@ -3561,7 +3836,7 @@ char *jsonlocate(UDF_INIT *initid, UDF_ARGS *args, char *result, g->Activityp = (PACTIVITY)path; } catch (int n) { - if (trace) + if (trace(1)) htrc("Exception %d: %s\n", n, g->Message); PUSH_WARNING(g->Message); @@ -3686,7 +3961,7 @@ char *json_locate_all(UDF_INIT *initid, UDF_ARGS *args, char *result, g->Activityp = (PACTIVITY)path; } catch (int n) { - if (trace) + if (trace(1)) htrc("Exception %d: %s\n", n, g->Message); PUSH_WARNING(g->Message); @@ -3845,9 +4120,9 @@ long long jsoncontains_path(UDF_INIT *initid, UDF_ARGS *args, char *result, jsp = (PJSON)g->Xchk; path = MakePSZ(g, args, 1); - jsx = new(g)JSNX(g, jsp, TYPE_BIGINT); + jsx = JsnxNew(g, jsp, TYPE_BIGINT); - if (jsx->SetJpath(g, path)) { + if (!jsx || jsx->SetJpath(g, path)) { PUSH_WARNING(g->Message); goto err; } // endif SetJpath @@ -3856,9 +4131,14 @@ long long jsoncontains_path(UDF_INIT *initid, UDF_ARGS *args, char *result, if (initid->const_item) { // Keep result of constant function - long long *np = (long long*)PlugSubAlloc(g, NULL, sizeof(long long)); - *np = n; - g->Activityp = (PACTIVITY)np; + long long *np = (long long*)PlgDBSubAlloc(g, NULL, sizeof(long long)); + + if (np) { + *np = n; + g->Activityp = (PACTIVITY)np; + } else + PUSH_WARNING(g->Message); + } // endif const_item return n; @@ -3961,7 +4241,7 @@ char *handle_item(UDF_INIT *initid, UDF_ARGS *args, char *result, g->Activityp = (PACTIVITY)str; } catch (int n) { - if (trace) + if (trace(1)) htrc("Exception %d: %s\n", n, g->Message); PUSH_WARNING(g->Message); @@ -4335,18 +4615,23 @@ char *jbin_array(UDF_INIT *initid, UDF_ARGS *args, char *result, if (!bsp || bsp->Changed) { if (!CheckMemory(g, initid, args, args->arg_count, false)) { - PJAR arp = new(g) JARRAY; + PJAR arp; - bsp = JbinAlloc(g, args, initid->max_length, arp); - strcat(bsp->Msg, " array"); + if ((arp = (PJAR)JsonNew(g, TYPE_JAR)) && + (bsp = JbinAlloc(g, args, initid->max_length, arp))) { + strcat(bsp->Msg, " array"); - for (uint i = 0; i < args->arg_count; i++) - arp->AddValue(g, MakeValue(g, args, i)); + for (uint i = 0; i < args->arg_count; i++) + arp->AddValue(g, MakeValue(g, args, i)); + + arp->InitArray(g); + } // endif arp && bsp - arp->InitArray(g); } else - if ((bsp = JbinAlloc(g, args, initid->max_length, NULL))) - strncpy(bsp->Msg, g->Message, 139); + bsp = NULL; + + if (!bsp && (bsp = JbinAlloc(g, args, initid->max_length, NULL))) + strncpy(bsp->Msg, g->Message, 139); // Keep result of constant function g->Xchk = (initid->const_item) ? bsp : NULL; @@ -4377,9 +4662,6 @@ my_bool jbin_array_add_values_init(UDF_INIT *initid, UDF_ARGS *args, char *messa if (args->arg_count < 2) { strcpy(message, "This function must have at least 2 arguments"); return true; - } else if (!IsJson(args, 0) && args->arg_type[0] != STRING_RESULT) { - strcpy(message, "First argument must be a json string or item"); - return true; } else CalcLen(args, false, reslen, memlen); @@ -4394,24 +4676,17 @@ char *jbin_array_add_values(UDF_INIT *initid, UDF_ARGS *args, char *result, if (!bsp || bsp->Changed) { if (!CheckMemory(g, initid, args, args->arg_count, true)) { - char *p; PJSON top; PJAR arp; - PJVAL jvp = MakeValue(g, args, 0, &top); + PJVAL jvp = MakeTypedValue(g, args, 0, TYPE_JAR, &top); PGLOBAL gb = GetMemPtr(g, args, 0); - if ((p = jvp->GetString(g))) { - if (!(top = ParseJson(g, p, strlen(p)))) { - PUSH_WARNING(g->Message); - return NULL; - } // endif jsp - - jvp->SetValue(top); - } // endif p - if (jvp->GetValType() != TYPE_JAR) { - arp = new(gb)JARRAY; - arp->AddValue(gb, jvp); + if ((arp = (PJAR)JsonNew(gb, TYPE_JAR))) { + arp->AddValue(gb, jvp); + top = arp; + } // endif arp + } else arp = jvp->GetArray(); @@ -4458,9 +4733,9 @@ my_bool jbin_array_add_init(UDF_INIT *initid, UDF_ARGS *args, char *message) if (args->arg_count < 2) { strcpy(message, "This function must have at least 2 arguments"); return true; - } else if (!IsJson(args, 0)) { - strcpy(message, "First argument must be a json item"); - return true; + //} else if (!IsJson(args, 0)) { + // strcpy(message, "First argument must be a json item"); + // return true; } else CalcLen(args, false, reslen, memlen, true); @@ -4488,20 +4763,32 @@ char *jbin_array_add(UDF_INIT *initid, UDF_ARGS *args, char *result, PJVAL jvp; PJAR arp; - jvp = MakeValue(g, args, 0, &top); -// jsp = jvp->GetJson(); + jvp = MakeTypedValue(g, args, 0, TYPE_JSON, &top); + // jsp = jvp->GetJson(); x = GetIntArgPtr(g, args, n); if (CheckPath(g, args, top, jvp, n)) PUSH_WARNING(g->Message); - else if (jvp && jvp->GetValType() == TYPE_JAR) { + else if (jvp) { PGLOBAL gb = GetMemPtr(g, args, 0); - arp = jvp->GetArray(); + if (jvp->GetValType() != TYPE_JAR) { + if ((arp = (PJAR)JsonNew(gb, TYPE_JAR))) { + arp->AddValue(gb, (PJVAL)JvalNew(gb, TYPE_JVAL, jvp)); + jvp->SetValue(arp); + + if (!top) + top = arp; + + } // endif arp + + } else + arp = jvp->GetArray(); + arp->AddValue(gb, MakeValue(gb, args, 1), x); arp->InitArray(gb); } else { - PUSH_WARNING("First argument is not an array"); + PUSH_WARNING("First argument target is not an array"); // if (g->Mrr) *error = 1; (only if no path) } // endif jvp @@ -4539,9 +4826,6 @@ my_bool jbin_array_delete_init(UDF_INIT *initid, UDF_ARGS *args, char *message) if (args->arg_count < 2) { strcpy(message, "This function must have at least 2 arguments"); return true; - } else if (!IsJson(args, 0)) { - strcpy(message, "First argument must be a json item"); - return true; } else CalcLen(args, false, reslen, memlen, true); @@ -4565,7 +4849,7 @@ char *jbin_array_delete(UDF_INIT *initid, UDF_ARGS *args, char *result, int *x; uint n = 1; PJAR arp; - PJVAL jvp = MakeValue(g, args, 0, &top); + PJVAL jvp = MakeTypedValue(g, args, 0, TYPE_JSON, &top); if (CheckPath(g, args, top, jvp, 1)) PUSH_WARNING(g->Message); @@ -4578,8 +4862,8 @@ char *jbin_array_delete(UDF_INIT *initid, UDF_ARGS *args, char *result, PUSH_WARNING("Missing or null array index"); } else { - PUSH_WARNING("First argument is not an array"); - if (g->Mrr) *error = 1; + PUSH_WARNING("First argument target is not an array"); +// if (g->Mrr) *error = 1; } // endif jvp } // endif CheckMemory @@ -4625,13 +4909,18 @@ char *jbin_object(UDF_INIT *initid, UDF_ARGS *args, char *result, if (!bsp || bsp->Changed) { if (!CheckMemory(g, initid, args, args->arg_count, true)) { - PJOB objp = new(g)JOBJECT; + PJOB objp; - for (uint i = 0; i < args->arg_count; i++) - objp->SetValue(g, MakeValue(g, args, i), MakeKey(g, args, i)); + if ((objp = (PJOB)JsonNew(g, TYPE_JOB))) { + for (uint i = 0; i < args->arg_count; i++) + objp->SetValue(g, MakeValue(g, args, i), MakeKey(g, args, i)); + + + if ((bsp = JbinAlloc(g, args, initid->max_length, objp))) + strcat(bsp->Msg, " object"); - if ((bsp = JbinAlloc(g, args, initid->max_length, objp))) - strcat(bsp->Msg, " object"); + } else + bsp = NULL; } else if ((bsp = JbinAlloc(g, args, initid->max_length, NULL))) @@ -4676,14 +4965,18 @@ char *jbin_object_nonull(UDF_INIT *initid, UDF_ARGS *args, char *result, if (!bsp || bsp->Changed) { if (!CheckMemory(g, initid, args, args->arg_count, false, true)) { PJVAL jvp; - PJOB objp = new(g)JOBJECT; + PJOB objp; - for (uint i = 0; i < args->arg_count; i++) - if (!(jvp = MakeValue(g, args, i))->IsNull()) - objp->SetValue(g, jvp, MakeKey(g, args, i)); + if ((objp = (PJOB)JsonNew(g, TYPE_JOB))) { + for (uint i = 0; i < args->arg_count; i++) + if (!(jvp = MakeValue(g, args, i))->IsNull()) + objp->SetValue(g, jvp, MakeKey(g, args, i)); - if ((bsp = JbinAlloc(g, args, initid->max_length, objp))) - strcat(bsp->Msg, " object"); + if ((bsp = JbinAlloc(g, args, initid->max_length, objp))) + strcat(bsp->Msg, " object"); + + } else + bsp = NULL; } else if ((bsp = JbinAlloc(g, args, initid->max_length, NULL))) @@ -4732,13 +5025,17 @@ char *jbin_object_key(UDF_INIT *initid, UDF_ARGS *args, char *result, if (!bsp || bsp->Changed) { if (!CheckMemory(g, initid, args, args->arg_count, false, true)) { - PJOB objp = new(g)JOBJECT; + PJOB objp; + + if ((objp = (PJOB)JsonNew(g, TYPE_JOB))) { + for (uint i = 0; i < args->arg_count; i += 2) + objp->SetValue(g, MakeValue(g, args, i + 1), MakePSZ(g, args, i)); - for (uint i = 0; i < args->arg_count; i += 2) - objp->SetValue(g, MakeValue(g, args, i+1), MakePSZ(g, args, i)); + if ((bsp = JbinAlloc(g, args, initid->max_length, objp))) + strcat(bsp->Msg, " object"); - if ((bsp = JbinAlloc(g, args, initid->max_length, objp))) - strcat(bsp->Msg, " object"); + } else + bsp = NULL; } else if ((bsp = JbinAlloc(g, args, initid->max_length, NULL))) @@ -4989,7 +5286,7 @@ my_bool jbin_get_item_init(UDF_INIT *initid, UDF_ARGS *args, char *message) char *jbin_get_item(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *res_length, char *is_null, char *error) { - char *p, *path; + char *path; PJSON jsp; PJSNX jsx; PJVAL jvp; @@ -5006,17 +5303,10 @@ char *jbin_get_item(UDF_INIT *initid, UDF_ARGS *args, char *result, if (CheckMemory(g, initid, args, 1, true, true)) { PUSH_WARNING("CheckMemory error"); goto fin; - } else - jvp = MakeValue(g, args, 0); - - if ((p = jvp->GetString(g))) { - if (!(jsp = ParseJson(g, p, strlen(p)))) { - PUSH_WARNING(g->Message); - goto fin; - } // endif jsp + } // endif CheckMemory - } else - jsp = jvp->GetJson(); + jvp = MakeTypedValue(g, args, 0, TYPE_JSON); + jsp = jvp->GetJson(); if (g->Mrr) { // First argument is a constant g->Xchk = jsp; @@ -5027,16 +5317,16 @@ char *jbin_get_item(UDF_INIT *initid, UDF_ARGS *args, char *result, jsp = (PJSON)g->Xchk; path = MakePSZ(g, args, 1); - jsx = new(g) JSNX(g, jsp, TYPE_STRING, initid->max_length); + jsx = JsnxNew(g, jsp, TYPE_STRING, initid->max_length); - if (jsx->SetJpath(g, path, false)) { + if (!jsx || jsx->SetJpath(g, path, false)) { PUSH_WARNING(g->Message); goto fin; } // endif SetJpath // Get the json tree if ((jvp = jsx->GetRowValue(g, jsp, 0, false))) { - jsp = (jvp->GetJsp()) ? jvp->GetJsp() : new(g) JVALUE(g, jvp->GetValue()); + jsp = (jvp->GetJsp()) ? jvp->GetJsp() : JvalNew(g, TYPE_VAL, jvp->GetValue()); if ((bsp = JbinAlloc(g, args, initid->max_length, jsp))) strcat(bsp->Msg, " item"); diff --git a/storage/connect/jsonudf.h b/storage/connect/jsonudf.h index cd3b9768f..23e8c0e1a 100644 --- a/storage/connect/jsonudf.h +++ b/storage/connect/jsonudf.h @@ -89,6 +89,10 @@ extern "C" { DllExport char *json_object_list(UDF_EXEC_ARGS); DllExport void json_object_list_deinit(UDF_INIT*); + DllExport my_bool json_object_values_init(UDF_INIT*, UDF_ARGS*, char*); + DllExport char *json_object_values(UDF_EXEC_ARGS); + DllExport void json_object_values_deinit(UDF_INIT*); + DllExport my_bool jsonset_grp_size_init(UDF_INIT*, UDF_ARGS*, char*); DllExport long long jsonset_grp_size(UDF_INIT*, UDF_ARGS*, char*, char*); diff --git a/storage/connect/libdoc.cpp b/storage/connect/libdoc.cpp index 700d247da..9b30b3154 100644 --- a/storage/connect/libdoc.cpp +++ b/storage/connect/libdoc.cpp @@ -194,7 +194,7 @@ void xtrc(char const *fmt, ...) { va_list ap; va_start (ap, fmt); - + ; //vfprintf(stderr, fmt, ap); vsprintf(s, fmt, ap); if (s[strlen(s)-1] == '\n') @@ -210,7 +210,7 @@ static xmlStrdupFunc Strdup; void xmlMyFree(void *mem) { - if (trace) { + if (trace(1)) { htrc("%.4d Freeing at %p %s\n", ++m, mem, s); *s = 0; } // endif trace @@ -220,7 +220,7 @@ void xmlMyFree(void *mem) void *xmlMyMalloc(size_t size) { void *p = Malloc(size); - if (trace) { + if (trace(1)) { htrc("%.4d Allocating %.5d at %p %s\n", ++m, size, p, s); *s = 0; } // endif trace @@ -230,7 +230,7 @@ void *xmlMyMalloc(size_t size) void *xmlMyMallocAtomic(size_t size) { void *p = MallocA(size); - if (trace) { + if (trace(1)) { htrc("%.4d Atom alloc %.5d at %p %s\n", ++m, size, p, s); *s = 0; } // endif trace @@ -240,7 +240,7 @@ void *xmlMyMallocAtomic(size_t size) void *xmlMyRealloc(void *mem, size_t size) { void *p = Realloc(mem, size); - if (trace) { + if (trace(1)) { htrc("%.4d ReAlloc %.5d to %p from %p %s\n", ++m, size, p, mem, s); *s = 0; } // endif trace @@ -250,7 +250,7 @@ void *xmlMyRealloc(void *mem, size_t size) char *xmlMyStrdup(const char *str) { char *p = Strdup(str); - if (trace) { + if (trace(1)) { htrc("%.4d Duplicating to %p from %p %s %s\n", ++m, p, str, str, s); *s = 0; } // endif trace @@ -339,7 +339,7 @@ void CloseXML2File(PGLOBAL g, PFBLOCK fp, bool all) { PX2BLOCK xp = (PX2BLOCK)fp; - if (trace) + if (trace(1)) htrc("CloseXML2File: xp=%p count=%d\n", xp, (xp) ? xp->Count : 0); if (xp && xp->Count > 1 && !all) { @@ -387,7 +387,7 @@ bool LIBXMLDOC::Initialize(PGLOBAL g, PCSZ entry, bool zipped) /******************************************************************/ bool LIBXMLDOC::ParseFile(PGLOBAL g, char *fn) { - if (trace) + if (trace(1)) htrc("ParseFile\n"); if (zip) { @@ -436,7 +436,7 @@ PFBLOCK LIBXMLDOC::LinkXblock(PGLOBAL g, MODE m, int rc, char *fn) /******************************************************************/ bool LIBXMLDOC::NewDoc(PGLOBAL g, PCSZ ver) { - if (trace) + if (trace(1)) htrc("NewDoc\n"); return ((Docp = xmlNewDoc(BAD_CAST ver)) == NULL); @@ -447,7 +447,7 @@ bool LIBXMLDOC::NewDoc(PGLOBAL g, PCSZ ver) /******************************************************************/ void LIBXMLDOC::AddComment(PGLOBAL g, char *txtp) { - if (trace) + if (trace(1)) htrc("AddComment: %s\n", txtp); xmlNodePtr cp = xmlNewDocComment(Docp, BAD_CAST txtp); @@ -459,7 +459,7 @@ void LIBXMLDOC::AddComment(PGLOBAL g, char *txtp) /******************************************************************/ PXNODE LIBXMLDOC::GetRoot(PGLOBAL g) { - if (trace) + if (trace(1)) htrc("GetRoot\n"); xmlNodePtr root = xmlDocGetRootElement(Docp); @@ -475,7 +475,7 @@ PXNODE LIBXMLDOC::GetRoot(PGLOBAL g) /******************************************************************/ PXNODE LIBXMLDOC::NewRoot(PGLOBAL g, char *name) { - if (trace) + if (trace(1)) htrc("NewRoot: %s\n", name); xmlNodePtr root = xmlNewDocNode(Docp, NULL, BAD_CAST name, NULL); @@ -493,7 +493,7 @@ PXNODE LIBXMLDOC::NewRoot(PGLOBAL g, char *name) /******************************************************************/ PXNODE LIBXMLDOC::NewPnode(PGLOBAL g, char *name) { - if (trace) + if (trace(1)) htrc("NewNode: %s\n", name); xmlNodePtr nop; @@ -534,7 +534,7 @@ int LIBXMLDOC::DumpDoc(PGLOBAL g, char *ofn) int rc = 0; FILE *of; - if (trace) + if (trace(1)) htrc("DumpDoc: %s\n", ofn); if (!(of= global_fopen(g, MSGID_CANNOT_OPEN, ofn, "w"))) @@ -576,7 +576,7 @@ int LIBXMLDOC::DumpDoc(PGLOBAL g, char *ofn) /******************************************************************/ void LIBXMLDOC::CloseDoc(PGLOBAL g, PFBLOCK xp) { - if (trace) + if (trace(1)) htrc("CloseDoc: xp=%p count=%d\n", xp, (xp) ? xp->Count : 0); //if (xp && xp->Count == 1) { @@ -630,24 +630,24 @@ xmlNodeSetPtr LIBXMLDOC::GetNodeList(PGLOBAL g, xmlNodePtr np, char *xp) { xmlNodeSetPtr nl; - if (trace) + if (trace(1)) htrc("GetNodeList: %s np=%p\n", xp, np); if (!Ctxp) { // Init Xpath - if (trace) + if (trace(1)) htrc("Calling xmlPathInit\n"); xmlXPathInit(); - if (trace) + if (trace(1)) htrc("Calling xmlXPathNewContext Docp=%p\n", Docp); // Create xpath evaluation context if (!(Ctxp = xmlXPathNewContext(Docp))) { strcpy(g->Message, MSG(XPATH_CNTX_ERR)); - if (trace) + if (trace(1)) htrc("Context error: %s\n", g->Message); return NULL; @@ -655,7 +655,7 @@ xmlNodeSetPtr LIBXMLDOC::GetNodeList(PGLOBAL g, xmlNodePtr np, char *xp) // Register namespaces from list (if any) for (PNS nsp = Namespaces; nsp; nsp = nsp->Next) { - if (trace) + if (trace(1)) htrc("Calling xmlXPathRegisterNs Prefix=%s Uri=%s\n", nsp->Prefix, nsp->Uri); @@ -663,7 +663,7 @@ xmlNodeSetPtr LIBXMLDOC::GetNodeList(PGLOBAL g, xmlNodePtr np, char *xp) BAD_CAST nsp->Uri)) { sprintf(g->Message, MSG(REGISTER_ERR), nsp->Prefix, nsp->Uri); - if (trace) + if (trace(1)) htrc("Ns error: %s\n", g->Message); return NULL; @@ -674,7 +674,7 @@ xmlNodeSetPtr LIBXMLDOC::GetNodeList(PGLOBAL g, xmlNodePtr np, char *xp) } // endif Ctxp if (Xop) { - if (trace) + if (trace(1)) htrc("Calling xmlXPathFreeNodeSetList Xop=%p NOFREE=%d\n", Xop, Nofreelist); @@ -698,21 +698,21 @@ xmlNodeSetPtr LIBXMLDOC::GetNodeList(PGLOBAL g, xmlNodePtr np, char *xp) // Set the context to the calling node Ctxp->node = np; - if (trace) + if (trace(1)) htrc("Calling xmlXPathEval %s Ctxp=%p\n", xp, Ctxp); // Evaluate table xpath if (!(Xop = xmlXPathEval(BAD_CAST xp, Ctxp))) { sprintf(g->Message, MSG(XPATH_EVAL_ERR), xp); - if (trace) + if (trace(1)) htrc("Path error: %s\n", g->Message); return NULL; } else nl = Xop->nodesetval; - if (trace) + if (trace(1)) htrc("GetNodeList nl=%p n=%p\n", nl, (nl) ? nl->nodeNr : 0); return nl; @@ -811,7 +811,7 @@ XML2NODE::XML2NODE(PXDOC dp, xmlNodePtr np) : XMLNODE(dp) int XML2NODE::GetType(void) { - if (trace) + if (trace(1)) htrc("GetType type=%d\n", Nodep->type); return Nodep->type; @@ -822,7 +822,7 @@ int XML2NODE::GetType(void) /******************************************************************/ PXNODE XML2NODE::GetNext(PGLOBAL g) { - if (trace) + if (trace(1)) htrc("GetNext\n"); if (!Nodep->next) @@ -838,7 +838,7 @@ PXNODE XML2NODE::GetNext(PGLOBAL g) /******************************************************************/ PXNODE XML2NODE::GetChild(PGLOBAL g) { - if (trace) + if (trace(1)) htrc("GetChild\n"); if (!Nodep->children) @@ -856,7 +856,7 @@ RCODE XML2NODE::GetContent(PGLOBAL g, char *buf, int len) { RCODE rc = RC_OK; - if (trace) + if (trace(1)) htrc("GetContent\n"); if (Content) @@ -888,7 +888,7 @@ RCODE XML2NODE::GetContent(PGLOBAL g, char *buf, int len) *p2 = 0; - if (trace) + if (trace(1)) htrc("GetText buf='%s' len=%d\n", buf, len); xmlFree(Content); @@ -896,7 +896,7 @@ RCODE XML2NODE::GetContent(PGLOBAL g, char *buf, int len) } else *buf = '\0'; - if (trace) + if (trace(1)) htrc("GetContent: %s\n", buf); return rc; @@ -907,12 +907,12 @@ RCODE XML2NODE::GetContent(PGLOBAL g, char *buf, int len) /******************************************************************/ bool XML2NODE::SetContent(PGLOBAL g, char *txtp, int len) { - if (trace) + if (trace(1)) htrc("SetContent: %s\n", txtp); xmlChar *buf = xmlEncodeEntitiesReentrant(Docp, BAD_CAST txtp); - if (trace) + if (trace(1)) htrc("SetContent: %s -> %s\n", txtp, buf); xmlNodeSetContent(Nodep, buf); @@ -925,7 +925,7 @@ bool XML2NODE::SetContent(PGLOBAL g, char *txtp, int len) /******************************************************************/ PXNODE XML2NODE::Clone(PGLOBAL g, PXNODE np) { - if (trace) + if (trace(1)) htrc("Clone: np=%p\n", np); if (np) { @@ -941,7 +941,7 @@ PXNODE XML2NODE::Clone(PGLOBAL g, PXNODE np) /******************************************************************/ PXLIST XML2NODE::GetChildElements(PGLOBAL g, char *xp, PXLIST lp) { - if (trace) + if (trace(1)) htrc("GetChildElements: %s\n", xp); return SelectNodes(g, (xp) ? xp : (char*)"*", lp); @@ -952,7 +952,7 @@ PXLIST XML2NODE::GetChildElements(PGLOBAL g, char *xp, PXLIST lp) /******************************************************************/ PXLIST XML2NODE::SelectNodes(PGLOBAL g, char *xp, PXLIST lp) { - if (trace) + if (trace(1)) htrc("SelectNodes: %s\n", xp); xmlNodeSetPtr nl = ((PXDOC2)Doc)->GetNodeList(g, Nodep, xp); @@ -970,7 +970,7 @@ PXLIST XML2NODE::SelectNodes(PGLOBAL g, char *xp, PXLIST lp) /******************************************************************/ PXNODE XML2NODE::SelectSingleNode(PGLOBAL g, char *xp, PXNODE np) { - if (trace) + if (trace(1)) htrc("SelectSingleNode: %s\n", xp); xmlNodeSetPtr nl = ((PXDOC2)Doc)->GetNodeList(g, Nodep, xp); @@ -994,7 +994,7 @@ PXATTR XML2NODE::GetAttribute(PGLOBAL g, char *name, PXATTR ap) { xmlAttrPtr atp; - if (trace) + if (trace(1)) htrc("GetAttribute: %s\n", SVP(name)); if (name) @@ -1023,7 +1023,7 @@ PXNODE XML2NODE::AddChildNode(PGLOBAL g, PCSZ name, PXNODE np) { char *p, *pn, *pf = NULL, *nmp = PlugDup(g, name); - if (trace) + if (trace(1)) htrc("AddChildNode: %s\n", name); // Is a prefix specified @@ -1074,7 +1074,7 @@ PXNODE XML2NODE::AddChildNode(PGLOBAL g, PCSZ name, PXNODE np) /******************************************************************/ PXATTR XML2NODE::AddProperty(PGLOBAL g, char *name, PXATTR ap) { - if (trace) + if (trace(1)) htrc("AddProperty: %s\n", name); xmlAttrPtr atp = xmlNewProp(Nodep, BAD_CAST name, NULL); @@ -1097,7 +1097,7 @@ PXATTR XML2NODE::AddProperty(PGLOBAL g, char *name, PXATTR ap) /******************************************************************/ void XML2NODE::AddText(PGLOBAL g, PCSZ txtp) { - if (trace) + if (trace(1)) htrc("AddText: %s\n", txtp); // This is to avoid a blank line when inserting a new line @@ -1119,7 +1119,7 @@ void XML2NODE::DeleteChild(PGLOBAL g, PXNODE dnp) { xmlErrorPtr xerr; - if (trace) + if (trace(1)) htrc("DeleteChild: node=%p\n", dnp); xmlNodePtr np = ((PNODE2)dnp)->Nodep; @@ -1157,7 +1157,7 @@ void XML2NODE::DeleteChild(PGLOBAL g, PXNODE dnp) return; err: - if (trace) + if (trace(1)) htrc("DeleteChild: errmsg=%s\n", xerr->message); xmlResetError(xerr); @@ -1187,7 +1187,7 @@ int XML2NODELIST::GetLength(void) /******************************************************************/ PXNODE XML2NODELIST::GetItem(PGLOBAL g, int n, PXNODE np) { - if (trace) + if (trace(1)) htrc("GetItem: %d\n", n); if (!Listp || Listp->nodeNr <= n) @@ -1206,7 +1206,7 @@ PXNODE XML2NODELIST::GetItem(PGLOBAL g, int n, PXNODE np) /******************************************************************/ bool XML2NODELIST::DropItem(PGLOBAL g, int n) { - if (trace) + if (trace(1)) htrc("DropItem: n=%d\n", n); // We should do something here @@ -1234,7 +1234,7 @@ XML2ATTR::XML2ATTR(PXDOC dp, xmlAttrPtr ap, xmlNodePtr np) /******************************************************************/ PXATTR XML2ATTR::GetNext(PGLOBAL g) { - if (trace) + if (trace(1)) htrc("Attr GetNext\n"); if (!Atrp->next) @@ -1252,7 +1252,7 @@ RCODE XML2ATTR::GetText(PGLOBAL g, char *buf, int len) RCODE rc = RC_OK; xmlChar *txt; - if (trace) + if (trace(1)) htrc("GetText\n"); if ((txt = xmlGetProp(Atrp->parent, Atrp->name))) { @@ -1269,7 +1269,7 @@ RCODE XML2ATTR::GetText(PGLOBAL g, char *buf, int len) } else *buf = '\0'; - if (trace) + if (trace(1)) htrc("GetText: %s\n", buf); return rc; @@ -1280,7 +1280,7 @@ RCODE XML2ATTR::GetText(PGLOBAL g, char *buf, int len) /******************************************************************/ bool XML2ATTR::SetText(PGLOBAL g, char *txtp, int len) { - if (trace) + if (trace(1)) htrc("SetText: %s %d\n", txtp, len); xmlSetProp(Parent, Atrp->name, BAD_CAST txtp); diff --git a/storage/connect/macutil.cpp b/storage/connect/macutil.cpp index b9600bdac..f95f3adcc 100644 --- a/storage/connect/macutil.cpp +++ b/storage/connect/macutil.cpp @@ -230,13 +230,13 @@ bool MACINFO::GetOneInfo(PGLOBAL g, int flag, void *v, int lv) case 11: // Description if ((p = strstr(Curp->Description, " - Packet Scheduler Miniport"))) { strncpy(buf, Curp->Description, p - Curp->Description); - i = p - Curp->Description; + i = (int)(p - Curp->Description); strncpy(buf, Curp->Description, i); buf[i] = 0; p = buf; } else if ((p = strstr(Curp->Description, " - Miniport d'ordonnancement de paquets"))) { - i = p - Curp->Description; + i = (int)(p - Curp->Description); strncpy(buf, Curp->Description, i); buf[i] = 0; p = buf; diff --git a/storage/connect/mongo.cpp b/storage/connect/mongo.cpp index 088dc2d29..53e2bf377 100644 --- a/storage/connect/mongo.cpp +++ b/storage/connect/mongo.cpp @@ -172,7 +172,7 @@ PQRYRES MGOColumns(PGLOBAL g, PCSZ db, PCSZ uri, PTOS topt, bool info) goto err; skipit: - if (trace) + if (trace(1)) htrc("MGOColumns: n=%d len=%d\n", n, length[0]); /*********************************************************************/ @@ -276,7 +276,7 @@ int MGODISC::GetColumns(PGLOBAL g, PCSZ db, PCSZ uri, PTOS topt) tdp->Wrapname = (PSZ)GetStringTableOption(g, topt, "Wrapper", (tdp->Version == 2) ? "Mongo2Interface" : "Mongo3Interface"); - if (trace) + if (trace(1)) htrc("Uri %s coll=%s db=%s colist=%s filter=%s lvl=%d\n", tdp->Uri, tdp->Tabname, tdp->Tabschema, tdp->Colist, tdp->Filter, lvl); diff --git a/storage/connect/mycat.cc b/storage/connect/mycat.cc index bb77512be..cc8f75b29 100644 --- a/storage/connect/mycat.cc +++ b/storage/connect/mycat.cc @@ -94,9 +94,9 @@ #if defined(XML_SUPPORT) #include "tabxml.h" #endif // XML_SUPPORT -#if defined(JAVA_SUPPORT) +#if defined(JAVA_SUPPORT) || defined(CMGO_SUPPORT) #include "mongo.h" -#endif // JAVA_SUPPORT +#endif // JAVA_SUPPORT || CMGO_SUPPORT #if defined(ZIP_SUPPORT) #include "tabzip.h" #endif // ZIP_SUPPORT @@ -109,9 +109,10 @@ extern "C" HINSTANCE s_hModule; // Saved module handle #endif // !__WIN__ -#if defined(JAVA_SUPPORT) -//bool MongoEnabled(void); -#endif // JAVA_SUPPORT +#if defined(JAVA_SUPPORT) || defined(CMGO_SUPPORT) +bool MongoEnabled(void); +#endif // JAVA_SUPPORT || CMGO_SUPPORT + PQRYRES OEMColumns(PGLOBAL g, PTOS topt, char *tab, char *db, bool info); /***********************************************************************/ @@ -145,6 +146,9 @@ TABTYPE GetTypeID(const char *type) #if defined(JAVA_SUPPORT) : (!stricmp(type, "JDBC")) ? TAB_JDBC : (!stricmp(type, "MONGO")) ? TAB_MONGO +#endif +#if defined(JAVA_SUPPORT) || defined(CMGO_SUPPORT) + : (!stricmp(type, "MONGO") && MongoEnabled()) ? TAB_MONGO #endif : (!stricmp(type, "MYSQL")) ? TAB_MYSQL : (!stricmp(type, "MYPRX")) ? TAB_MYSQL @@ -488,7 +492,7 @@ void MYCAT::Reset(void) PRELDEF MYCAT::GetTableDesc(PGLOBAL g, PTABLE tablep, LPCSTR type, PRELDEF *) { - if (trace) + if (trace(1)) printf("GetTableDesc: name=%s am=%s\n", tablep->GetName(), SVP(type)); // If not specified get the type of this table @@ -509,7 +513,7 @@ PRELDEF MYCAT::MakeTableDesc(PGLOBAL g, PTABLE tablep, LPCSTR am) LPCSTR schema = (PSZ)PlugDup(g, tablep->GetSchema()); PRELDEF tdp= NULL; - if (trace) + if (trace(1)) printf("MakeTableDesc: name=%s schema=%s am=%s\n", name, SVP(schema), SVP(am)); @@ -562,8 +566,16 @@ PRELDEF MYCAT::MakeTableDesc(PGLOBAL g, PTABLE tablep, LPCSTR am) break; #endif // MONGO_SUPPORT #if defined(ZIP_SUPPORT) - case TAB_ZIP: tdp= new(g) ZIPDEF; break; + case TAB_ZIP: tdp = new(g) ZIPDEF; break; #endif // ZIP_SUPPORT +#if defined(JAVA_SUPPORT) || defined(CMGO_SUPPORT) + case TAB_MONGO: + if (MongoEnabled()) { + tdp = new(g) MGODEF; + break; + } // endif enabled + // fall through +#endif // JAVA_SUPPORT || CMGO_SUPPORT default: sprintf(g->Message, MSG(BAD_TABLE_TYPE), am, name); } // endswitch @@ -584,14 +596,14 @@ PTDB MYCAT::GetTable(PGLOBAL g, PTABLE tablep, MODE mode, LPCSTR type) PTDB tdbp= NULL; // LPCSTR name= tablep->GetName(); - if (trace) + if (trace(1)) printf("GetTableDB: name=%s\n", tablep->GetName()); // Look for the description of the requested table tdp= GetTableDesc(g, tablep, type); if (tdp) { - if (trace) + if (trace(1)) printf("tdb=%p type=%s\n", tdp, tdp->GetType()); if (tablep->GetSchema()) @@ -601,7 +613,7 @@ PTDB MYCAT::GetTable(PGLOBAL g, PTABLE tablep, MODE mode, LPCSTR type) } // endif tdp if (tdbp) { - if (trace) + if (trace(1)) printf("tdbp=%p name=%s amtype=%d\n", tdbp, tdbp->GetName(), tdbp->GetAmType()); tablep->SetTo_Tdb(tdbp); diff --git a/storage/connect/myconn.cpp b/storage/connect/myconn.cpp index fe00f6a1e..253c42bb0 100644 --- a/storage/connect/myconn.cpp +++ b/storage/connect/myconn.cpp @@ -177,7 +177,7 @@ PQRYRES MyColumns(PGLOBAL g, THD *thd, const char *host, const char *db, return NULL; } // endif b - if (trace) + if (trace(1)) htrc("MyColumns: cmd='%s'\n", cmd.GetStr()); if ((n = myc.GetResultSize(g, cmd.GetStr())) < 0) { @@ -248,7 +248,7 @@ PQRYRES MyColumns(PGLOBAL g, THD *thd, const char *host, const char *db, while (true) { p2 = strchr(p1, '\''); - len = MY_MAX(len, p2 - p1); + len = MY_MAX(len, (int)(p2 - p1)); if (*++p2 != ',') break; p1 = p2 + 2; } // endwhile @@ -482,7 +482,7 @@ int MYSQLC::Open(PGLOBAL g, const char *host, const char *db, return RC_FX; } // endif m_DB - if (trace) + if (trace(1)) htrc("MYSQLC Open: m_DB=%.4X size=%d\n", m_DB, (int)sizeof(*m_DB)); // Removed to do like FEDERATED do @@ -744,7 +744,7 @@ int MYSQLC::ExecSQL(PGLOBAL g, const char *query, int *w) m_Fields = mysql_num_fields(m_Res); m_Rows = (!m_Use) ? (int)mysql_num_rows(m_Res) : 0; - if (trace) + if (trace(1)) htrc("ExecSQL: m_Res=%.4X size=%d m_Fields=%d m_Rows=%d\n", m_Res, sizeof(*m_Res), m_Fields, m_Rows); @@ -1068,7 +1068,7 @@ void MYSQLC::Close(void) { FreeResult(); - if (trace) + if (trace(1)) htrc("MYSQLC Close: m_DB=%.4X\n", m_DB); mysql_close(m_DB); diff --git a/storage/connect/mysql-test/connect/r/jdbc_postgresql.result b/storage/connect/mysql-test/connect/r/jdbc_postgresql.result index 6d77d79d5..7969672dd 100644 --- a/storage/connect/mysql-test/connect/r/jdbc_postgresql.result +++ b/storage/connect/mysql-test/connect/r/jdbc_postgresql.result @@ -1,9 +1,11 @@ +SET GLOBAL connect_class_path='C:/MariaDB-10.2/MariaDB/storage/connect/mysql-test/connect/std_data/JavaWrappers.jar;C:/Jconnectors/postgresql-42.2.1.jar'; CREATE TABLE t2 ( command varchar(128) not null, number int(5) not null flag=1, message varchar(255) flag=2) -ENGINE=CONNECT TABLE_TYPE=JDBC CONNECTION='jdbc:postgresql://localhost/mtr' -OPTION_LIST='User=mtr,Password=mtr,Schema=public,Execsrc=1'; +ENGINE=CONNECT TABLE_TYPE=JDBC +CONNECTION='jdbc:postgresql://localhost/test?user=postgres&password=tinono' +OPTION_LIST='Execsrc=1'; SELECT * FROM t2 WHERE command='drop table employee'; command number message drop table employee 0 Execute: org.postgresql.util.PSQLException: ERREUR: la table « employee » n'existe pas @@ -14,17 +16,18 @@ SELECT * FROM t2 WHERE command = "insert into employee values(4567,'Johnson', 'E command number message insert into employee values(4567,'Johnson', 'Engineer', 12560.50) 1 Affected rows CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JDBC CATFUNC=tables -CONNECTION='jdbc:postgresql://localhost/mtr' -OPTION_LIST='User=mtr,Password=mtr,Schema=public,Tabtype=TABLE,Maxres=10'; +CONNECTION='jdbc:postgresql://localhost/test?user=postgres&password=tinono' +OPTION_LIST='Tabtype=TABLE,Maxres=10'; SELECT * FROM t1; Table_Cat Table_Schema Table_Name Table_Type Remark - public employee TABLE NULL - public t1 TABLE NULL - public t2 TABLE NULL +NULL public employee TABLE NULL +NULL public t1 TABLE NULL +NULL public t2 TABLE NULL +NULL public tchar TABLE NULL +NULL public testuuid TABLE NULL DROP TABLE t1; -CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JDBC CATFUNC=columns -CONNECTION='jdbc:postgresql://localhost/mtr' tabname=employee -OPTION_LIST='User=mtr,Password=mtr,Maxres=10'; +CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JDBC tabname=employee CATFUNC=columns +CONNECTION='jdbc:postgresql://localhost/test?user=postgres&password=tinono'; SELECT * FROM t1; Table_Cat Table_Schema Table_Name Column_Name Data_Type Type_Name Column_Size Buffer_Length Decimal_Digits Radix Nullable Remarks NULL public employee id 4 int4 10 0 0 10 0 NULL @@ -34,13 +37,14 @@ NULL public employee salary 2 numeric 8 0 2 10 1 NULL DROP TABLE t1; CREATE SERVER 'postgresql' FOREIGN DATA WRAPPER 'postgresql' OPTIONS ( HOST 'localhost', -DATABASE 'mtr', -USER 'mtr', -PASSWORD 'mtr', +DATABASE 'test', +USER 'postgres', +PASSWORD 'tinono', PORT 0, SOCKET '', OWNER 'root'); -CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JDBC CONNECTION='postgresql/public.employee'; +CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JDBC +CONNECTION='postgresql/public.employee'; SELECT * FROM t1; id name title salary 4567 Johnson Engineer 12560.50 @@ -60,6 +64,3 @@ SELECT * FROM t2 WHERE command='drop table employee'; command number message drop table employee 0 Affected rows DROP TABLE t2; -SET GLOBAL connect_jvm_path=NULL; -SET GLOBAL connect_class_path=NULL; -SET GLOBAL time_zone = SYSTEM; diff --git a/storage/connect/mysql-test/connect/r/json_java_2.result b/storage/connect/mysql-test/connect/r/json_java_2.result index 783d86e65..1a90132de 100644 --- a/storage/connect/mysql-test/connect/r/json_java_2.result +++ b/storage/connect/mysql-test/connect/r/json_java_2.result @@ -1,4 +1,5 @@ -SET GLOBAL connect_class_path='C:/MariaDB-10.1/MariaDB/storage/connect/mysql-test/connect/std_data/Mongo2.jar'; +SET GLOBAL connect_class_path='C:/MariaDB-10.2/MariaDB/storage/connect/mysql-test/connect/std_data/Mongo2.jar'; +set connect_enable_mongo=1; # # Test the MONGO table type # @@ -381,3 +382,7 @@ planner 167 41.75 postcard 23 5.75 DROP TABLE t1; true +<<<<<<< HEAD +======= +set connect_enable_mongo=0; +>>>>>>> connect/10.0 diff --git a/storage/connect/mysql-test/connect/r/json_java_3.result b/storage/connect/mysql-test/connect/r/json_java_3.result index a301e0273..4c5fc94fc 100644 --- a/storage/connect/mysql-test/connect/r/json_java_3.result +++ b/storage/connect/mysql-test/connect/r/json_java_3.result @@ -1,4 +1,5 @@ -SET GLOBAL connect_class_path='C:/MariaDB-10.1/MariaDB/storage/connect/mysql-test/connect/std_data/Mongo3.jar'; +SET GLOBAL connect_class_path='C:/MariaDB-10.2/MariaDB/storage/connect/mysql-test/connect/std_data/Mongo3.jar'; +set connect_enable_mongo=1; # # Test the MONGO table type # @@ -381,3 +382,4 @@ planner 167 41.75 postcard 23 5.75 DROP TABLE t1; true +set connect_enable_mongo=0; diff --git a/storage/connect/mysql-test/connect/r/json_mongo_c.result b/storage/connect/mysql-test/connect/r/json_mongo_c.result index 8adc006a5..550e94f28 100644 --- a/storage/connect/mysql-test/connect/r/json_mongo_c.result +++ b/storage/connect/mysql-test/connect/r/json_mongo_c.result @@ -1,3 +1,4 @@ +set connect_enable_mongo=1; # # Test the MONGO table type # @@ -380,3 +381,4 @@ planner 167 41.75 postcard 23 5.75 DROP TABLE t1; true +set connect_enable_mongo=0; diff --git a/storage/connect/mysql-test/connect/r/json_udf.result b/storage/connect/mysql-test/connect/r/json_udf.result index 7d81ca5e7..09544bb1e 100644 --- a/storage/connect/mysql-test/connect/r/json_udf.result +++ b/storage/connect/mysql-test/connect/r/json_udf.result @@ -50,17 +50,19 @@ SELECT Json_Array_Add(Json_Make_Array(56, 3.1416, 'foo', NULL), 'One more') Arra Array [56,3.141600,"foo",null,"One more"] SELECT Json_Array_Add(JsonValue('one value'), 'One more'); -ERROR HY000: Can't initialize function 'json_array_add'; First argument must be a json item +Json_Array_Add(JsonValue('one value'), 'One more') +["\"one value\"","One more"] SELECT Json_Array_Add('one value', 'One more'); -ERROR HY000: Can't initialize function 'json_array_add'; First argument must be a json item +Json_Array_Add('one value', 'One more') +["one value","One more"] SELECT Json_Array_Add('one value' json_, 'One more'); Json_Array_Add('one value' json_, 'One more') one value Warnings: Warning 1105 Error 2 opening one value -Warning 1105 First argument target is not an array SELECT Json_Array_Add(5 json_, 'One more'); -ERROR HY000: Can't initialize function 'json_array_add'; First argument must be a json item +Json_Array_Add(5 json_, 'One more') +[5,"One more"] SELECT Json_Array_Add('[5,3,8,7,9]' json_, 4, 0); Json_Array_Add('[5,3,8,7,9]' json_, 4, 0) [4,5,3,8,7,9] diff --git a/storage/connect/mysql-test/connect/r/json_udf_bin.result b/storage/connect/mysql-test/connect/r/json_udf_bin.result index 0c009d612..d0819619c 100644 --- a/storage/connect/mysql-test/connect/r/json_udf_bin.result +++ b/storage/connect/mysql-test/connect/r/json_udf_bin.result @@ -272,10 +272,9 @@ Json_Serialize(Jbin_Array('a','b','c')) ["a","b","c"] SELECT Json_Serialize(Jbin_Array_Add(Jbin_File('not_exist.json'), 'd')); Json_Serialize(Jbin_Array_Add(Jbin_File('not_exist.json'), 'd')) -Null json tree +[null,"d"] Warnings: Warning 1105 Open(map) error 2 on not_exist.json -Warning 1105 First argument is not an array # This does not modify the file SELECT Json_Serialize(Jbin_Array_Add(Jbin_File('bt1.json'), 'd')); Json_Serialize(Jbin_Array_Add(Jbin_File('bt1.json'), 'd')) diff --git a/storage/connect/mysql-test/connect/r/mongo_c.result b/storage/connect/mysql-test/connect/r/mongo_c.result index c7aadcf11..132bb34ce 100644 --- a/storage/connect/mysql-test/connect/r/mongo_c.result +++ b/storage/connect/mysql-test/connect/r/mongo_c.result @@ -1,3 +1,4 @@ +set connect_enable_mongo=1; # # Test the MONGO table type # @@ -376,3 +377,4 @@ planner 167 41.750000 postcard 23 5.750000 DROP TABLE t1; true +set connect_enable_mongo=0; diff --git a/storage/connect/mysql-test/connect/r/mongo_java_2.result b/storage/connect/mysql-test/connect/r/mongo_java_2.result index 708b6f1cc..67c67653e 100644 --- a/storage/connect/mysql-test/connect/r/mongo_java_2.result +++ b/storage/connect/mysql-test/connect/r/mongo_java_2.result @@ -1,4 +1,5 @@ -SET GLOBAL connect_class_path='C:/MariaDB-10.1/MariaDB/storage/connect/mysql-test/connect/std_data/Mongo2.jar'; +SET GLOBAL connect_class_path='C:/MariaDB-10.2/MariaDB/storage/connect/mysql-test/connect/std_data/Mongo2.jar'; +set connect_enable_mongo=1; # # Test the MONGO table type # @@ -377,3 +378,4 @@ planner 167 41.75 postcard 23 5.75 DROP TABLE t1; true +set connect_enable_mongo=0; diff --git a/storage/connect/mysql-test/connect/r/mongo_java_3.result b/storage/connect/mysql-test/connect/r/mongo_java_3.result index 672d9f15b..665178bd3 100644 --- a/storage/connect/mysql-test/connect/r/mongo_java_3.result +++ b/storage/connect/mysql-test/connect/r/mongo_java_3.result @@ -1,4 +1,5 @@ -SET GLOBAL connect_class_path='C:/MariaDB-10.1/MariaDB/storage/connect/mysql-test/connect/std_data/Mongo3.jar'; +SET GLOBAL connect_class_path='C:/MariaDB-10.2/MariaDB/storage/connect/mysql-test/connect/std_data/Mongo3.jar'; +set connect_enable_mongo=1; # # Test the MONGO table type # @@ -377,3 +378,4 @@ planner 167 41.75 postcard 23 5.75 DROP TABLE t1; true +set connect_enable_mongo=0; diff --git a/storage/connect/mysql-test/connect/r/tbl_thread.result b/storage/connect/mysql-test/connect/r/tbl_thread.result index e07fc0988..9633f358c 100644 --- a/storage/connect/mysql-test/connect/r/tbl_thread.result +++ b/storage/connect/mysql-test/connect/r/tbl_thread.result @@ -79,7 +79,7 @@ a b CREATE TABLE total (a int, b char(10)) ENGINE=CONNECT TABLE_TYPE=TBL TABLE_LIST='t1,t2,t3,t4,t5' OPTION_LIST='thread=yes,port=PORT'; -set connect_xtrace=1; +set connect_xtrace=96; SELECT * FROM total order by a desc; a b 19 test19 @@ -118,7 +118,7 @@ SELECT * FROM t2; v 22 CREATE TABLE total (v BIGINT(20) UNSIGNED NOT NULL) ENGINE=CONNECT TABLE_TYPE=TBL TABLE_LIST='t1,t2' OPTION_LIST='thread=yes,port=PORT';; -set connect_xtrace=1; +set connect_xtrace=96; SELECT * FROM total order by v desc; v 22 @@ -137,7 +137,7 @@ SELECT * FROM t2; v 22 CREATE TABLE total (v BIGINT(20) UNSIGNED NOT NULL) ENGINE=CONNECT TABLE_TYPE=TBL TABLE_LIST='t1,t2' OPTION_LIST='thread=yes,port=PORT';; -set connect_xtrace=1; +set connect_xtrace=96; SELECT * FROM total order by v desc; v 22 diff --git a/storage/connect/mysql-test/connect/r/vcol.result b/storage/connect/mysql-test/connect/r/vcol.result new file mode 100644 index 000000000..4c59a3b06 --- /dev/null +++ b/storage/connect/mysql-test/connect/r/vcol.result @@ -0,0 +1,29 @@ +create table t1 ( +#linenum int(6) not null default 0 special=rowid, +name char(12) not null, +city char(11) not null, +birth date not null date_format='DD/MM/YYYY', +hired date not null date_format='DD/MM/YYYY' flag=36, +agehired int(3) as (floor(datediff(hired,birth)/365.25)) +) +engine=CONNECT table_type=FIX file_name='boys.txt' mapped=YES lrecl=47 ending=1; +select * from t1; +name city birth hired agehired +John Boston 1986-01-25 2010-06-02 24 +Henry Boston 1987-06-07 2008-04-01 20 +George San Jose 1981-08-10 2010-06-02 28 +Sam Chicago 1979-11-22 2007-10-10 27 +James Dallas 1992-05-13 2009-12-14 17 +Bill Boston 1986-09-11 2008-02-10 21 +drop table t1; +create table t1 ( +#linenum int(6) not null default 0 special=rowid, +name char(12) not null, +city char(11) not null, +birth date not null date_format='DD/MM/YYYY', +hired date not null date_format='DD/MM/YYYY' flag=36, +agehired int(3) as (floor(datediff(hired,birth)/365.25)), +index (agehired) +) +engine=CONNECT table_type=FIX file_name='boys.txt' mapped=YES lrecl=47 ending=1; +ERROR HY000: Key/Index cannot be defined on a non-stored computed column diff --git a/storage/connect/mysql-test/connect/std_data/JavaWrappers.jar b/storage/connect/mysql-test/connect/std_data/JavaWrappers.jar new file mode 100644 index 0000000000000000000000000000000000000000..33b29e7685b66ee03d1b3f5921f2ba32d48f76b3 GIT binary patch literal 19192 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 N5FTV=U{Le`@c?>fD9iu= literal 0 HcmV?d00001 diff --git a/storage/connect/mysql-test/connect/std_data/Mongo2.jar b/storage/connect/mysql-test/connect/std_data/Mongo2.jar index d019bf6906b7af900f676a919885a9f2e440af88..9be654bd4c8e2a1a3fd159c2a69acb5acc55011c 100644 GIT binary patch delta 13430 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
j~S=ca^L@CkuVUt}MduoJO5 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

@ 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%0A}(_@GNt-gjShQf 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 !P~t9T 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

qhgVKs*I0+iK1&4*sO``7T73V$K;~nu|Af{ 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
  • h1R_`{W(RHrcR5 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 z zPt1)Z&#@e>Xv(dW&lm5?cV118u<2ht^lC_#$V>inC*`9^TS}Hv@doHcZl8yycxlO4 zWdtpVzSBnmcP(t*nM<7?9Q~N6p~DH<;Ji|F7!d~_GtQj&#bLT(8nDfCyMoVc3v#@G zg@e3fpQQ8dALPGtFDgIyZMB7ZHL>+j@twsagzqqhpu9r%vasLi(oXHITJv@7aI2wh zVKyWmtz)KwB4}nto(S;b*nqrzChvuDTU1O@lyLl+OkIsLf2lcbC_YnYrLDRcARI8S(T`kT&{8p4n5e;?0K=R*{c%yCUR zgI(K*rc&Ev)sSpw+1Fed{3DYnV@m!Mw3wC9vx8+>gG`cs@DV^j*v5j%Fc&A!1PUrD z4&sku%TsJ5g}dQPK`YDQWEK(ejiT|#%LF|J_lLUdcXEl?iwwc43$QxJ5n|XdaF`VA z@}C?@5+bML_Yc+&9`wQW#$b(0nuN|Py0ek7@G8WK?Q@^%+O{%gg{$r)`KSlm{!I5$ z4m>k--XJzqCO&}oU1$Nq(Wjha4R@R?w})EwUmivD)kwo9KhsP51c+TbmJQRdp@oOO zCwOrXDwySxBXQa(4`id1P68p>u6eFw0yQ^2haXICc_OQV~_W+3_qFx)7wl zp8OIw3ApCDRn*F??$bMVd)xK@BpD$lMn?~D1E+}{Sfv0MgQ1yOr6U9iOw{ai_X{pU zU&Kz2#`D#9>)blu3tsU3&d}^OJCloU)&I<&8+1B6wrdnWf9>tPoW+5~)E4n_2T3bj z4zeYxEQb}?N;Tnuy6O(IacCQFjHbsy^DZEK$LaCDsS~p4dDyt8M8;@MPpLkL9zTQz)?LP8OGz-o81%?xQ zLZdShBo#Ra+!S8_7jn*vsFKCSGwHV;JDReZhHpuLu$%pF815|oDmCUt`v<<+P_0~- z-Iu?yWIx}lI!{beaog@Tb61A$bI>PsEdE}bt+FhjHV-7xm@YTJTJWP(8GUAiHlz_` zqKup>TreU00V=D~)qpc$%mSHzQ4{KcS@iN+BoiznbOCQ(m?3Ft&zOoAUTR&4-#=Vi zjUgrga+WkBqdAR`%x1(MGcfXDSz7OAu7!?P!czDlM6}Nh$`#r)gJF@<&ihIC&mMP& z;c!1AF3O3PM2#~q(2e$qu~jx9oMl#>-3fTzKhe) zTA}6GRR`xIF8*4RtSBTJuTF-jl|7Dd?5yhm^hoTtaPm_FGrhSJ(16}<`3x+zsPlFx z>5|KX*f}C`Gf!V(E?G;J*7Z0`ZzB$Te#`wt}lV1^d4g% zWbEAAh~P;?Z$v(oup`29@4p32I4*-cb#}vABuorbfkb(EXev}DU_Sf;3&V;Q z51hZuE@xR)wW`g|(~+X)ds>(t<4`bbvpopnlI6XIUj2%{$@`x4xl&5W6J&lif?-2y z$I7- zv)R>IBt|C1PTN{gQQP*=QaJZKc=wh*zfb8rruCWDc*?E4;4@hD>1ufPHM@Qt+d}d+ zV{|L|8vXP1@I9CDiqBxf=OW5y+&HGe^E+bL*d89iPWoG3*C>E>Wdk_ff)CutJ0-$; zu)~3X2yy>E6Qba0f=OWiBOm(zyF*v?ay0v2LoYrq>l~;+%r}^sg|^oa>E~F{?-IO0 zchqOwQ48wMQ&Se4@So)5=oP5(M9XjO+YBK5Vxx%^B~HV+1C+O#beQekn~;)(fKSIc zo~sXkFX=50hN;oRFwSF(;ekq?DZq0q!Ev!mA??%UCBa;TC2`Avk)Yo&x1II?t|T{) zV|G>+-n;oUVo}$8t231I$@LF^Y*=%jxyCa*2?5n##iRBNR(T257_fB+w^lQ?T68^_ z;NpDqHw18+q7?U%&#}G*%fMtQKzX&^V0}H$plgHNNRTI(`85T~^qFGy>(KD}us6!i zdF?8G^D;-nJAfo9nb=1S*eYnST(!>>PZz&9wHdB8u;{@q)1Xtq#ZP_}ARaWj7B;nh zW^*9reA@Wtge^{p6i`6BWP$>xyVQl2h>(C<0pFibq@FNYiFIp(nZV}**xsUu8E>2< zlSpE^fN&kLPK8cpfhQhcyv#YflEI%l?$tnL?l%ACbV53#%V&?P2~EDq`^&h z1_4ZfrHu?wN&B(Or+g~{NGoJn<-*H?CTzERq!DmYf+VE_qxdyyIpM!W-i%vuWozEH zKONquEQ#l8!aD%Rx=Eov&La!evMmV!PrJ(REBt=6uZCk(mc^!Eh~*t|Du!Y#d6fnX59LPzjfvlP_3ZzL$d>X(C(YD z6YGD`6&8W<=#c+4>=0)GSnr70V~k4WOI-l5K$Lo(0JfEvK~J} zwLe7GasWeWVNF|!^5=m& zqXn%3Ied zAoTg(jerTD3W?6bx7}}7TEzNvk1N)`tC<_TkJq1URL~Ir1d@8RUTEBe!$!!2DngB; z2w*1WRSdE2`GfL3O*zl@m>2szFMY^|T#2kaj9OS^)u@0^_yu8vzN20#5T&@LMRrKWT^FiRPEI7T?b$41c8a{_yhKhv!V9MIp2W%7G zf%M0U4EEZk2J+<*R#%$@Q&zDKVC*Oy;4Q(CsiWu|V5WEG zAq$#60yDY#A`S!U@S>cf$&rz6b8SpYhuo6UyJIC_8>D<^aOw@%@R2TL(o&m&g*k|+ zscKbBf|gr1myDE0D5M9^}nNUolY99oh$%WJVYlPwfI9fg5~2Lfer5o zk2ksx(!QPy+m}HWW#s)~%;XF=={+Jso12q8H zHe*-IY$T5AY3K{2sRIHyKuCA>71oh7JmWp9VXtS)14O2w94l2m!9?LNK=DV8@v}jk zLES~N6-203Bmb{>>4Ktk(!;?~b`ko(Zw>QD@-5J@OV4V|XnAgykE=g@SO*fHDxi#z z!dUeQgdZnpl9>wVEo*dPpqN!1BgX45CpR-RGFTwZ4mvDmiqwM}u;=fK?NU(IkWJ%! zy~6_5AO1NPVV8f2i0oXr5W!_FNsIpKfUlMc>5lC_DY|m$I1*2FNV<>|kpIuK4 z2FKX$#Dl>&3lfQ~vbYv1^9pkavW%NqRK9l}P5?a7b7o5p-1yl=&M8a1z*_mAsm!_U zNOP^bYP<#(%4Cb;f1)R4ML>{W#VZWSXHgwiXl6&7WtCN|-+C2o0w}3sT=SYQn382A^lIa-cVcP2!yd;cQSYIY=iYIS<@KDXtA( z4;{5WAzV#?!A_15=)FDPCk*M}*-FT4AT}VZ;aAogS{BHc=y5h6oT9x63vDFAriX)2 zsbL+vV2*h)44cbOowxYdpXuOn)fJK$4K@H}Y}5?(m| z+izDg{0j}K+B+4sW*k#Xyfdz!gq&jBsU(HBv0pQ- zR|rLi6m6CEiWFP4cYu)Wv=dR1YL7AUaBvHwK?x1TlU&6K)~xKQAN&q&q+rKqWWHd} zZuFAQ6=8fP`u&bZ5_44C0UoIp0}DS8EYY{|zz*>fDG~p>cod%xRha_CtsH|pQ{ZMH zOe&lguqkUd2!Q`56M2g5NAc(GUZK;YPfbXq872;SM1Seewxspm;7;ESN!e%wlu^Q5 zLlXG`aD>&manku7Qaw#P%*86ZaF6usxN>Nj#ab<&H^QG6l|JR1@Z`NJ{&aqtbz+Wx zF`k!`?*=EL=!L4&728$4P&@a~dTaIfvH`F2S5`Y(k6e4~(#T1Ht)xLC zLb%?q^pe`)jv^C7JHL^QX}jc=^V|8>_Q0ys>a2Ac_RbJTF z-s6rfCILEbAJzL!n%_rMD_W;GMnTnvS&RpCx8{#)lLHb55K=h&T6knQVv99M>kq!4 z`Xp;MIsu%l7jK{2$U`x8DTyUAq(JlT@`V}Xe_ZQO(LyB|i|a&^@(Ad%`W`@2?}c*9 zwI{6bq$Hd^-n=PqZo*U#({$aDG4&ll$X^I6&M{abZgs)ILUVV7_>X zB74CwHNe24#LKFm81p%}>KS8;9#=**I3!yKhysL_dbM=J@NMnWDZ`fR<3QfF`X9R% zW-ZM@Z-7SzTcA5;X3h8x*8LI1UrR;N9BoJ_FD)Fb)tbXj+1DC9xE4R-SIIi#(rmU~ zWc`D4SYbQWbLAl$Y0Inqs2K+xFn7jO3$5HI4KI30O(;k2Z2eb-PsctX$!zmjc}f|lZl;K!lA;!MJvzgdS}--KyhKYmtd#%AjwN(n3>yUR*5}<1+F2Ka z$lWq~lmXk(PAttQ2l@4KDpg)rK7>nqG+3|69$~{!R9P`^M;$s5t81$a%h@i>!HL>Ctt}9Y z4h!~Us51q&P^S(v>c#g}*0r~UQPv%vNLdgS~8FwefWEWmC(S1e+fUTm!<7RSQmd)W-v^Ao}c9ZpHcq&PZ;~YI0&z zkpXKLZvDS#2#EiMh9J|V4Q{DeMw4)RTcxOfP|~}tx;ki@=lWqVuB7+TvWQRR_QuQ{ zY{1O!$IE=)9Orc;u);}&@0jpIjWeS&l6VsHd|vu4B6oRV|Kw2KhGh+#F`VBh%SPyd zu)j)d7TWD^huG}B_GaM(ziW075t_II;yh)Q-)m7*hPr($5D5ll}fj(2$Z>AMDO}h4cURE%P*H-Aqu z#D^f;9UKv}C)x@I?(|Q`3IaG27ZEtVe6y)-$>O_z94{fuu0*bfvp zNw4B9eGi$w#h--~{$j2U`GsC~7!4wbVR74JRBO&VGFk!-GH^syc?UC5aLic9R-Ay- zeG>#(KWdOr!vsZ|F3<=#oO;U<3d-#)Rs>|CEqvVfcEEs5s4JzMVp$UpuToku(91i; zFzMp%wPmEQ=UVq&t+Vl(4;O^8LP0B(x@ZKnYt&Bsv^>j7MOWNm+Bfg9Vmtip3?Xw~ zCoSedrg+@yj;$>t8!9yziy3*ln?i`|&x|@r(9y~>qX>IKid=WJ`6#g4I68nS0B$I~ zMF8Y31R(N>F}T=j0S*gdAoz3*h0n@69qB@N3*V3G-)&1=vVv1h?=|A?E-rAMQjn+- zKxu#@y^ZZXf99%<^_mt|&hz*DdgupUQolb9W4rPhGXO9NHF|!54BSH#cMU=lmr}@>ebdXHPNA@* z6mgk=CR<$QILG@7{jVNHSwN_(hzJ7WqxwI?Sb^vNuR@cAnS(U2Fr{E@ZD!*7e}%62 zHV%73Pd@&G3n|_a=oh?Ci{y?e6c-F?V6DCDzZR`A5S~C9ZEUTPq+0C0-uW!dqls1^ zz^u@y%Qsio6C;DAJ=B>(%0IimZ3Qw;%tuKI&uc}32@x_KOpP9NUm3LLO4i=B+ zZ~|q4y&&j+u!dERaAtI4UrQ}cPR^srKwyP@ysIhH_@J|)gE&0>6n44Xf#5F?w8+uk znh*XT&?3h`(O14X6Oj%)j+qSDzA~LdP9cKh_r5W&|h-4JdR*4Pyw)Z)@-(Yu||D*Ls;v~f7D2Ic7H@~Of%OZ07P^{CQ*MaUMXV>M0(Jdjm z2V`BJ)Z&H7B>zIwhos^*z^J0lL-QH-OfV)VK0-BzFw?sb#Zw5TAMduYpt5hrTpdFI zkM$>?`8=We;B;Fg4;Z#Z8Lp{JzLvDehvC!7-T9kC&uh&bDj`am#LB4Hd=6An`~yf# zc*s$GNDQcaB@nZ%{XwSpelSOwgEVlZ8~-$VeXYQ-uWfb$62L_Wh#{RBFx)6z&JU=&&GWQV|c&Ylu(v(*}A`6~fWO%!{1sSe6^4x%=p%6jx513|C&x)kVCsCO)v6Sr0NeY_X3I3a-fr5{4~5AXKqoxJrin)=b2Ean-{3TY9}TO9)Kc)C zHzl1GOv)#p;+=c7-S>RhhM2)w6LdVwC(vtCS;T(ZfGg(HE1E47kOeYIT;7D&J`6Ai z2CS~YfRzQcU4f-|Hr^3PYXAk(8g!NY=5iVlH9w89^8m=AG5LhRx6xRv^X07FHpq4m z9vTKVL1O~^e^84-|4@q^`$Kt9i8%1ck{(lWeraCaDh!$VafmZA+mkM5``=2br;x6Y zh&S5q>8MGEiGdL-=8UE&g7*k5kk&v%Ec6M9ZP0y4OJazG zfG42Y!|}%b`Leb)#$o;0BPH1g@$pBxgHfC`VDE>r2#uKJw6zu6V-782KEv-M;FHRP zREJ?URF#X{)ft@0Z1oc*MN3f^kIG&%&Vh)MhGfRyCh6@dO&yd7-ULs2eXo_H!q(aV zv&Q`l>r+m1XeXo#%wgcXO(8%(pgT%p->Z>5$0emaO0NQQtV{p7$ zA%Qd8$krq?F@@h*+oa7&Ocw^)l%2A&60`h|V;&z~@L1+#-M$`zxib9$*q^=mT&#u2 z3pmm%qlQvigD}1j>4Ew{-*I~)?c{1N-FGSqp0P@S(-zLt(K-!u2h4U6^di}Y4M6Up zC;m;CMw-`B0OU3aP9v@ma@z(pdz+~rl(Vy@2P{5;QBY~NCH`!>08RlXczS856-|2S zPb=$mFEThLO0)(qyP;MB08$taaOnw21GA4|RLU~NJ0oKA3!+L)rHTD^CfWh$ z>{c>8zo_TIst%zD)t+4` z_PG;NxE55K4BUM63X;{f-hfaW7&^8i()gIIh4SrVQ4`;=_xisnwz)36LlcuUErZpu z)w}*ik_%C6*f-SA7+n#ej(`zi28&}a=;GzR9!ODhkPO^(0v`QSj`T-$bxqd^vxpEI zgH&M&?$ZxkNrthWiyUxcqdXpX5kxR%lyIdyzD!vCB@qF_r;(M(T|n$iaf#=iWe%4f zeu%mp8|(w5B3^ir8II33vUx9zl?j8FJay%G^70ZK=r9VjnqR^K7D8S!n5p^O3Z$gi7{9-Px622phzSP$<%)4oiqUM2yZ*h0FA27~* zCNnf8zw%y`VOt=BR37sggEjulQwIJdb(ypL?TV}8EN+P+krisyn5vx?Y{8Q)M{nHE z&-BbfqZBW1D%?C(r0&L%0WWfdoi{C2G#`3VV3%}te1D%b&IriBWO36pi`QCHNz|HR ztV2X|CrYDDjZg~!-BtT*_E+T|;0}p;MG#~HFtcRuYJw}a9xcz2No(Ln42-|4aB17!pzO|7OJ68oERdKoZwNk^$M(}S zuJ{mRxB*0Nt`^E&MF+||D@%M=A8}MhIQ;G-UMT|gC3~JIw$*Qmy`lQ_JC4|ADtkfF zW(GWd#eg6J_|^q{H=g%>%9m_GLpm>8bsOmvU$^+u!b zl~ECBN_5tT$mAr$LoHiZ_lR!Dw8w%?YHD8~Kan`j&N48v@Q%VHE&xG2MriI{Yi9Ho zUWUsC5rn*uKBkDuq+nK|LDgyledL_&4{-138J7IbX5Y~NhKCWQnD_%}0m2mwlrF0Y~)G*2VPoQy#}< z($Z>??bGlvS=!3E#xYOx-^c4*Z3h43DIYa? z*#pyfq1;_E*bvKz?WldgbH?Y!@%TMF&S3|`N(jS_Q}59;6qjBd;LG<_Pf(V7c^nZW zxk3NB(?0st8|}HZQ76d>si-k)2F|nU*^hI?tTXWAJrnTW#F6r5$pvrNXIy*2A$ktsD&TjfT;4bqw4;l zv$6O`wpMt1>t=YsK<|AQqJs{Je;wOAM{m&6z`beTNMB5X0YqbfYaP)faYx%|-cI5T z-xROMnvKY-&C!hJRKhXuOOjJ8bvD)^J(9r2Z}D_ST!k|aX)m}gaGeg*juW!Gpt!zc z0aAr762Nx-<&@V`<9%z~h)*DLZ~09oqgwNpoB{4oDC4`0vZBG&yLapL`C(UW+IyG& z|M;N&)>TX1>@%g|Z$+bT|LNWOcz)gT_{)}GmCYim%vQ{WiSJwE!{PSb?}xXgzo7pD zZuIi7-;h9@!Vmrb8F2rVB|MwDcL1Hq7-uYkuc90kJ$5fr;sZ4TG&Vb*>n z^+)bvSL54m4_}=w379!gfyshF_J<-v5*|la37`0wnPm_2K#6{>ITMn^1CHB6&z}hs zeuNAW9<;lVEftBC;wFnO4%$2k5e{B&owRK+)Om>^N+zW%H=N*>y^$ zVUMtMdK{dAU)c-(M{vv~{-*6@12Q=hBt3P& zI0W%MRWTc~zCv{CrEi z<)U?b&z~~pG5&iQ!v%#0xSjeYRi3^KI$<4&)lT9YA^lI1yqkVtj~;AR;Z}MJZjuk; z`_e_K|B(<*JQLAF1?C&s(>)?EzV>pUf{e{0c?<*qD9d{-1CYF1$G;76#X9kINPa;E zUHC`5`m?R}!;K41wwCdOHu>#B6pMc`c@A=|{kp*QRRCP$Nrc^~E!IN6d^*zY3a=#y zhA|qb8xZ=j^+nd(WVbQ2s>8%6w7;)(AWf#}BP&mvS9F12{34a4g7LEstLR!@@c;sU zhJOR5`_QvH~mRY)N}Z|dHP6ok1?x+iWgiU*>5OC0^JC4x%HoVq-&3tb{fb9YeA6zFE<61;3=59=9c`uWu+^A5lW zJnPsH(Qk-tje~b8pX?8I7=oX9km7DT%b1NS@!44H5RIK(@j6pv)wO*3y5iOPa%_62;P+_J(BucJ8LEw>80S7t{_kn3 zd2EhL=)V+x?h_Q2qb&3f@QbWF+4BN$Z1P}TWL?fKsfVbaG_D?dZh7YEsI`Geg^#2OEt6U68DW3( ztLwi(6y***|8xeBqHdY}N;8apY&$rnt9vBvuF-nN_!nxwYH4cyy{vrKv;gol8lgf9 zwRL`QB+{D+7BUFb7$^kKbB24XKz11cJ{4AQF0Fh0j!&I9%26MZ{vYh z5p&n%==-B)M55XN6L^X=CdV|_3cNZnBPPqK3GC2?E18W^Qz@NMWJ1yjLq@^(I+d~J zqbH$@lmK7ON`g7*CXV?@B0j8CaVn4Z@Y^|HH#*D02yLlxW2~co6QSf zBlmEnKP=e^SSDMR0hsVN>9}zfH|eNx6}JI0h@r@55)6dM1vI*WK9IEsjqiCK@=Ux- z{Lo=bY5xaZ?-*U@qi=1;Y0Sn(W81dT*tXGd#kTD>w%OQLW212zJMU`y-}~%$pXcP; zoslu}C0S!#>zZ@^>JP_g1qV}+>08IuKGAf7NzDw(wD{Yyy2FgtS5Oli{Uqyr*YM1r zxhg@*tOg!9FidRl>w!<14DLVySm~-@nN@~4K)-xD88yT3R*RoC$M2lbv;kAO6U8i^ zlgBZ-K(~hrQ^YkY?T7j_qoL?9@a@>f=_tvJR_I)FV_`5)EwE`=)Lbc(xs!$1jG)aW z;I1B=|EgTp#GzQGz78*sf)}H&^yO3b#=rp)DWWNwGWVi#{8qe?X#o@m03N;wII%G9 z-nBiRy^spA9EU3c!CNP?oyolw^q|CEP=V1~E=vdcS!xDPH&bhktLS7cTWj@rj|X*z zdtM@rC2VRR>9NCv+C2=U&SQRH!ov~cnDSH;Ie$##b@daiZyRMtikX&o=PnjD(FP{VFbpONX zNP4TDJ49Jf6igc`*8EvA#*^gJnxAoF7;upqDNatKYX{{xTmVo_PUzkj`rtLfENBuY zlyIe3Lb+fDYnMZn?_ncmz10m?9}npfRoI1#(?&XGk;yZQYnJ1O0liOLq2shGHR zq?Jk%nf;{5z{z<|g#jiar{(v&~8Ehu!pXb~%r^Q%>Z85Gd^b(873 zSYK#Q;Lb)ytO^?;?MPdi=&^LbJ{W|tE$5i2MFyI4MmUELZ>ddmM#;h!L`6aW5LzfB zAVQO3&ETlKTMrd)_mI#ctg2SH@EsFFEhmaC%QZ_1{{BpjUnSs2u{n7IONet zjQNCJBNY1R=_kb98=CgbOqJ-#po*s`rteonS=okvZIgGXFJC9G(dbmsF|cValTt?Z z5ebH9;vVloW{D&0M`ufcwaSr4a?sq~(1@W~=JaInA=WMB=sZbmTsO7jRPZYqt<$E# zGWO4=0YxWN5rD$>CA~RvQ^@PfB~1olwjO2GHg7m4E11m0@zBEbPeCy4Y$~l|3XSq| zBp;N3I+oCGuo}=yPLB^#F;K$}!cvSQ6RMTQSdo;0a*;vYELO7l8c`l4n(cn`_i!zA!c&eOynkdS^RH5k0oHx9O5yTnndg9H*B&^6^}of zVesXSV&XU_lL*w|Pst~6Y(F`Cp*o?X(J~~TG;oG4S?Mp94^ywXEcJIv@gaqb>mjrc zEh=+GzX1%iG<;++(GbW0bc$58v;(Ga|T$5ajP3Pco&up}hf1V=K9 z=`z@7*yUWe7XxE_#N@}d4sNudWvtbJ<+KYrIB+N@zeZtHmz zqk`4oTSPmDJlp$QUptkkf&ytAHQh^4_s2cFucy>1sl}4@0d7Ds;M5zjeC?`wfb`@9Oo!VqUNt@QbON02rGL|d8_K7oY*y?vT-mh z5w!r2WPKcZ@aj(j&*G5HHj1aBUuQ@y@gN*aG?Sai!*Y}%^6HbKKYI}93anIJIw;V~ zJRS2qte|N+r170`10A(hiDAsWp&j;8PYuB+n^VN(26EQq>hxmt> zXLDoawuJ7Y0+^a#R`PvU3f2{ZsB|ZD?#r)D)iwkqll8a7a?ivD%=VKCQLqxnxd~RS zvU$n(OU3L}t@I*vsbSYp$GTF{0gl982qV>cL-f43_{zD6H?2SE_*rU5dTzE$0I<_$ zRYJI!%6dtwQ~ZY6nu@^G7guC$bik92bG}Sia0*E>j(v|}|FUbr&GIJ5&!AtHYP9H% zo(R{p%gUeqh52qZIj{ICOWd!%3d*3kQif;bo5tTHoI1euMxu^qojQ?tfgQCLNXEB! zZ_}oO+f$aO47w6#Ca5*GHF0W4~Mr`cv>^0!w!&bIL&BtH3Ru&u{C23W0T(oJ<{IP6}rIJd`O#(lVcgfv;ymBhuK3Kaia|U~I-FbKD zbvAXsl6%o8uxSnG`tjyn{rafq^$Ydw;-ZnlaP8i^QMY>M(e3&A?9O)6E;soQecwol zS}jTYXm51(Jv#g4;_aB>jR5X9qgCDGRfqz|4qg=ho6!_-|F3NCzZgx#-o^%~MgM(( z4$oR;wdKwW5WJXu6oPF8EldbU#)E7D{4J?PUgpJfN0dzoC9bCxm4dD9FZW(CWCF&A zp!u2WQs2m%ikw}@vhN-LS-yJ(F5g`Mm+t`Ov45uTfXjE^Z&OUOT@+M@ax_fKDYnAP{wANptCE8^$mQ%@J&^vYqxWfcSVJ}(oZ`OYzFby1{Il&!Zj{hqML2{G6V zE_(1=62S?QW#xCy+hih)gLJ3cbWM*QqezawKzN~^RdWUN?E_QhxF6Sb za&c{PwV>jZ3zU$kFyySsnXixpm^U`5tosCCx2!#jgB`F(DXz8B;xYfeK&L2|iys1o z4OOwpC_5+pE(0RVB`Lqo$h{O*BEqv}96uN=TCNrt48W*|b0Do354MQPhIj{Hey0}a`3qgZ`{EMI> zp*Pkq6HA+=wz%FBz@W}W+uKIp#WOezrG=F)z*3V3yH#7Q&tu7;*< zQ5U`G66#_XbQuFH#Ry?4mI2>)?gfNrL+P|fWakpu9}j(n2Y?z!5QkFN&D-F>xFzLZ zc*#+KbOdbewimsoxU8!0UHxp{Ej%ev59cHzYLe+g)|e*LpTz}ibx3aTdd?O4!<@xG z5yK7_XbxZE#tJ0|@eO@q2`0jzwt&9j@Fvns%UcRaLTBIQok1aMy3y0;!DtG$ceITpP2G)9;> z10Z@z`&wv!blU3)p}!fqU^e&5%GDoAyPT~5-oo$dkfj5!RlHOX5DuEp?TWqe8Ga&N z8=8zY-tueXa4p@PRKu{ULB}rwUN}4}O>fqc1-XN>E>>HBi6fla+%eKP%Kh{ZXB@h> zf(oO7umT~$rt8rbDk2H-p32!Z=%XEgT4D=z5mGOk;chiO=#b;&j5sHEf77o2Jb& zaH zV#z}?ABEAY!KCjhdJ+$~j9+@tv>*IS zv*j;|O-XYWbiRB{AkU*_%;>RJiRAJBkln6gt)1g7LE`!07R3bSS1T3?VW#W=5{e*u z3U?zE*3T=QpeI4A~|%Hr3^wmFMQm2{NOzIDk}>6}k< zR)b*+WxYD==hFb3bBqk$Y#*UOd7(LI&E26+Vz`#5u4`Bc^H#wzhm#v*fiq$dqz|m402a2W5eaG`wtfbzz8X1$M8F--hBtiRxlhh9!*0SrKmDTsRqfeNUOVn1AfCo*W>qaVjqrPquXLE|?iD7f$>f zRC}(Q>wE(&9XC}=9qtYc%-mjZt+&8mX;foo^d7BE*HqC(;Yl^vLPe_&xv-h76iA8N z%p3a?7{uie`lZ-mu}v3@yAB~AJIHqZSm3j%pu5P|S72Z{cuZGabjUOy5r_ zZjG%)Q41oKqX;)3)G`XoEUkfXoctu6X;hxrx6a$|Eu13T*ctBpZt*zYIyY6kTJHSW zU@TMxDw%YN?S$n+ob6&OID;+O+}44p!w=D}atv#{B>UF&Wa#Q|NdeI1xyn)Dv8JgA z%Q+E%JQ$BWrJ>IH$-d&}~+5(I9MW$n1 zDCtCHLiFzlrL$?X5K~Ikgo}DU!5F=TWg8tQ6-b zYL1{)UY6+(Nl=r^p{(pZ=exdqfcEk_cQ=?~(|kt4d}v&4GcUG%T$K0cdm)o?m)H%X zN~RMc-3P=A=WiXP-bBLfV%ROt+>qa}Ok!k$S9?^<^$)bD+8XFD9=pa$iplk4%*+5S zWQX=MFF^a|+GoX&1?^Mqsg}2^p2i}{3>oqHMKW4EE3vWps=+O))s4eh3s;7HHKCFm z7b)!v=ISD~gZ($+iT--{3!YEHpX2G7s>(PgM3$OL4ZernyQR*f$1bNLT~_XaC+pp{ zq;p`?0Y8)zwYpfm9**btS%N8*!E**A^(qz9l#{W<)^`|OI>^SJiCt}edG67szac ztnksTYOpdNEGmDMa5|k*PL>-Wc5+f(H$N&zGhI7Rb?S!&KB1u&St9>Q?L+YBFR$Q{ zFBbBcKa&l!2wJ2T7;?)PyqFEh)1P{aAqH9VNMC`}s>iZ4?(oC}x~~JTT#C3XSjKXV z^;H35++g>!ngwP8$j3;&R`i$W(e6yA%kOH_GLJ+w_als`qPvnM(9$yi{mx^`YPwGg z16c!lVz!RoS{KE#g=Mlw39Gt^hNy;xU+celtV@EJh?qh>n{#3ilAl782F-Y9Qm27Z z8Rx)E7edFWXK{y5(q|UU5Ll7%cu=^cLpbC&?8G90pVv&LEhBG;#$Jx_&;#amKed+Y zdwe>{9z}3s$i~*(KaEuY6dYYEQByWIgQ6vN&uM$o*~8ut5oE@V9$!V}9I*C@FI zY;v_OC2b&aZClz!dKcW+nyfzB*@Wd}EhWUbqI3vv3mg2rn2tXRfGd2b#*qAhqmCXy zK|b~wXMlq0ojQUfAUBOrJ-c5Hf4x^`DkTwfe~*ok==#A!{?22u8WPU;mE+aAXKyHA z=*+I!C;ruEd%hads|)$9ck_ z$g0)^9y{qgKW3^o+vu&=9jiAd4RDM7(m;>-IH1nmU3X)xxgTkhIrWD08|QM12C7Vf zIJc<&UpSX&@%VoH6ko=Kbe6q$jn* zL7cFBFN4-DLgwFx$N-KnDy^~^r*9c|*i@NzIX`q2AX`m@1CE1TpyN^ zKN|nAXrXUa#)@Y6>)bH)C`-)iRX4RydHnbdGk;3~#AeDc(4V zbcsk!{5@>84Z0J-Bn+#?2xre(?YN6>V_dX;6fHm87CEBbQpZC<^t)MNft@@Se(D5| ziQF46bl1g6n9x9TOu z=ii`Uxu9JtwOAObz!WSTMs?gTLV5^*6MA^#BnGmDXMpZ~cy6ai$0bSw_T%?Dxc2<* zsh!3B8p)3;->S;D87_Ufra_%0OcmL1uE5v6fmGIJ?o+PZ4(*`IE@P#@Lnkk4!=anG z(K3r?_H2QY#&?l{;~;*xHz~}z)CCzQU#39FT4*^&+kWt)w1RkKRO*{{OTvxyd?L7; z_|6gUuLMBD9Z7=ncw~;eq5yif44nV;Y|ig_sw_h5r-g35X&a^Y2riPR_9ZX2o9P<~ z1^ZZgQvxGdY#5bLY=suyNde9#ZDYn2Qit#Dxu0gey zkBZ0j7|rh3q>*AP^G%8`sku@LUoJU9wEnVk@1{I(Cqo+*(f0zp;6tLHD}eBy^&DNYB2MBmZue;l*CTmST0^g0NvN0$Y3uR5exk`b_( zn+)#Rl=OilmNKQoCQ>n_u)t$umJ#@~J2Z7$r3IG&r%(bc?z!NQKzkC^3IW}?H z{w>%d=q@aM6w8IQi@w&E$YBqsZ?VVfa0`80fn<4tj0l0>NEOsj5v2|uC6wgY zSkwu+KBp{|5WYBts-#?|MQHDVklzS^;RSr#+=unNZS4~uqIqRVqEVzmJG=?6Tz$hG zL!1&XblzLt+!z5OJ$1e2=+itdS@#zn2ncHUTdyEgzt<%@HkDqiVpqJ@Ba#!4U~kS| z2xa{XiOfEK!oi$aQWZ)0POI~tXwqQMV_7&n&B`}*zR{>j9$U86>`aB?>_r5CC7`X% zYV9Ru&I2gIZe8=kGvy!Q%T}C*<3(3>rfoita~p%vWta?y=wkc?g*tiywb;y10;L<# zafd*GAHwteyxupsaz*fTd&B%IJ6DPv+#TjXUG)VI$=@#mI4@3d%JT(7FUz;C6rI?$ z*Ye6(ot+e>!Rwq$oUbnQX_yp1RwJE6#Uz>3yb5+79MmL`@Qj74F2*_QlJeoImK>@j z9aaXp*r>pU5;!luc55t)W-_9>n#p-&J!U$|_r}%Az@Tbd%%4SFg5G1N5i68sU4IAB zQJFt(mTBChi}qNNwLnSv-AP-66zI%BM) zuxmdRGj>y}IJJN+ai7oh+Fl%_5D5ugoTK&zE#M@m3uB01EuRR%*U;QO@C z;;=-40%nI~V@_CzFVC}YlPGGYb+=PVid7;V$4@x7aNDuPS!g5zzh~UTd(jp zc4Z&gA5;T?MRs6709KZ17%cQdb71kLZ;Elz&)MVFlV|$EoD_f)U3&U25hnK2xHU6Xxh1#p`SzMh5&s#b&;sWS&)*z!M}EJbc)cMpvvhol5iA-JUIt zpe1RvojS>ir}qJL!-QLBRWPVijiEZn*0vQifl&FXX@^XKW%YhotN+<%F?T>Y9_Y&D zflwbu@`_?cjPJ->SdZL=n7Bn-a6&#sayL)7Z5R4&5}ak|6fzHyEU4AR*P|*k#!Qry zB1|V9EtnO~>ps$ zdEZcWVu)l5$z8Frx_ zV|!OR7_h9hz3fr!=-7IsYqbMu2zC4riV1liz zEkfBsK}E9@A#IA2Nu$Ir$1>$JO0g8f1WF)$>Q16tr$HEFhPui}Y9iBq7DJaCyz>w= zyqRTF6{?lks6Fxv>Z*hkx+KLH7`<-%MFJ+=fViLG93Dga3hCxjCkN^|BVxtOU)E#} z8362D&$}wRPu@u@BWJeV{hXIKDI3F?VC$hnpZ4l7zfjICq)&u-eCuY>UuiaTA3ZhW zaLAd|Y^GMDY#zH_q?W%tExU!%priK2tV^rfF2`lNN?#nf{Y76btKH`MZL^+Ou5FDJ z8X(fiovAErd#_WQ7hPn)sk<(Q%Yqwi^DIatEPmG z^3wm(aztx={4+(*vuUH9mO=m=ye=#kvncfNRj+F6-hS?Ts*Eqa`z)}vsJ^VfBnSNN z3EVakoW5E?8^L`SYP4}*HLa3HvpwB%SEI@EV#1lWOw)fpz#eVNbu|V-HHTB&yZbtZ z>kZtkldrm`+B~h3*9&JCIM7B6M)cC)>uWx_7F`Wg-eUf3Ee2(3eRl*B-Jsfk5nZa` zEyVwUbaJjXE|&kB>zr34fmzCdiY6;0b!-^i!`dc8IAaROQK(#Euf}BQuTYkLQbGOF zf%uzM@6WDNQ8{77zX;kPld&ub`1s~7?DFRbCs!xV?Kv>_eD0qj*1UP!0c|#@g*KY+ zrR;Pk9bQ%3G2^44M^N){ty^6Zx?^n?*!@_rO#Dq1&(B`hT~<#$-NzeRB1}%Pv_I}e z%(#1*jv3?ul&MmY>zmV{r2EXkUGg1edqtMCP|}bnZqF^AgIYh>gSZXwN9l`_-PIx& zV3LMLU$1k8v`eC`59U!2z~}T3q3X+D)y3_rNsO6I&sBlfp#~R~mIpCIQ@=^^Qf0>K zqrj+;)Q$w~ENZUthm-w7^(R~-ng21FN*H_T#scsqKCfVBXOA_zm zxEu@9ScZAPhm&03Wk!^aw|SG)cbCej#45M;L+ z8;b1Gcfg%wrT8ecSLx9M_8iFM6og$`)TOY!JNXk91=H{l=7@gx7(t2#vZytGR}Jl6 zArB66-rn@T*^W^44#79?JJKJv+rHlo&jQN1NzdCW)7$-D6e6loK84$Dds;%Q{1=2q z*Tk&)p8t|_7ayMdT+jRfKsl%9*H&=U?h6u$HPe{i2KLT>9#IvIMVIPoiPTl^|Bn z(r3?`Q`UbXVZ*EfViX?W1_Bs@P5{7+(uPSIvQ(kjI^s~&PX#J=OQ92UIFhaz^nOGV zixQ;K6D^H`ILrch{s-}V;VxvPCkkIiLCGDo zK{vxs0&2o1oQWd+m=K!aQdusCZU5Rim{IzykeuHkN@%g;bYO^*?;Z6bHIv)qyaoPA ze99ZCxioySf5Hj<>=DfoQrs3y8%p?V@(-}ebo|Ju8AHY|!;(d;BXJ=jy}-j%nBKS` z&Qf<$3X^5Jx8VjI63A=;-f2ILEO1h`f1P4 z-wol8aSgnmvNl1LvJbwXBFf~#w?JtD?ObY1twK~`pw+GG{_PY)^pqDMvUoH*fAfYW z%zisc8L+dQAR;X$In>GOeR;}Ir2tG(as)0?u@@T{36{|7gt(K7I3H}lz{r_sS<*S# zMEao8GJn*t>ws9x4DQ^|=fWsY2DLed1)nxO7HW>9 z%WVNlj4I0inLjt~;@cGfOiR%GlBhc;jAij2Tn+Yq#9i>t@fbvTzBtC&5xQQfxgfDs z;!le5uJI15daEBxnVzfLXSUdG7&fdYkE?1T(p!E`m1 zQ6mpy1>W4#Pg&h!^|t^~R%hvw1W1*2IShu=gXis+>&k;>Gz#?M*JM`FWNJQ$0X(Gj z8}8Z7Pe!up4(}bgY>R*kdD$+YsM16!uto+b2#_Nh6=jnI^x3mfbdu@&K9%rRY!;EK zE*K3|B3x+R2emSUih#Rrao@xlSm`!ZnlZT>@7RHBRpdm(eIwU6;?P+bs+bc>g-Z>5 z(_RERDA-x0O27fnrqjXXu}qc?AS|#4JZGsFN%qVk;GGgTUJdTB+<`W|EZ`5*wK{*8 z05VJBRZMO4NtiNbj`~B< zIoc0{(Hoz4l+9?;A>U2k^t^+Ciri9vgaBTpLX3=QwW(!{G;Q?KPp_06VtDixpG*;y zMN|s`%DEYSEDQ)E668Vxpq$fFLt_YkElat;zxJmpEU`yuZ?*`+uB;h#!vM?P321m2 zZ;@vT?MsrMCw2{p0H}6^*HPLKK&2t{2_Q!-4khM{+0GscI?uE z)2n z$vRCjw=MX-yTs*WVl+~!J^|k1SQMq8)ZE><;AZ%_z%0qI9#Bl`o6TBB4vX*l~}-p{hMm%uY^|BygA@cc(VsK^-B}gkUhq`uG9pTjcBjPQiz-R$VICGE z0{50X{I4)WDZaS1z|vV-Am5cZYKd|}J`vL=*%bR~$P71!gEqsY0=gK{ncKT|Em?O{JZ7c0bnWXjV1*oB=twyDH!O9;u zKkDSq3$~8t$7jU(6V|&V^l&4FzWE$ETtJNJF84Y~OH~98&Kz5G2(ezVoiwqa*3YhaO)uqYK+AfKt!(>sVdaxf zQ*VG>E*V0aWN$_dJZh4yl*}xz^LtFVBF-IUbHbhTE5FOH03C~bFPg`92eHq$Nuu-6 z4*)gh2rUj7hXXlr8H%Dhzxf$k;vN((xg&@vHp$bm%F(j<3PrKmy0!v(@Yank=e|&( z3`Te)puOX6<>G#|(9O~7bNZ?X2-ugFuv!&I-aZjT`+%y;AQi`1@kQ7MIin4}8?T`Q!cFIc=Ty&X~CzH1tE_{{Kno{Hn99t>%s?cuF>4iQ+pIJOB?@7k%A>a*2K6TG;*{Rm~$L4K| z#m0{E&~M^0%D8ZRzm^>pNG90VitrgU%mBl9FYY3yOqi4)|8Z5bR& zzm*$iqFl=g*>*M9C*p4a{~CuWhEZK|5WS^8Hz=mkPF-M=cKV%}3&_`k-o@q&Q<`|a z28FjN0Z5x~{1N1K_CI=SH&42Zvlp$WdSM*cmzJ-oyIDWM? z3te_S2B5@RTa(*yY8{{c2LM3zA%(hW~m{+8&EQBpt|q{r`QFSOx_6m1z5j1^9oSQuxDwiuRUvF8`zTnt-rwARXEV7O_0y9TfD53%vzgmL9fbs?T|~(M{TM5Tm>l(Cv0|CB%KNrxL3#nl4Zn|AhZ zm5#B-{CAbk*@9L624SoAruD|#ybazKT;T%SKla17Jq3?o!VL=YAI(%wG2!J*t%o($ zXTC?~1Sy~}aDIiyBxyCd_mZ9RK=7k-cmYINf;^jpk;;mH$xm%Rp1~SoY6>+U(I*=D zLw<97y!EtuIY9E`?Ef9hln2H#2ROM)PH|rZ0qVEzasa}e`@UMB)uYJQ;|1t>`QG#Z zt==Z5tFBWeBM#wx`I1iXfeZuse7$Db#m75*VM4|Ve8%|WIW$FeR-Ye800UIgHg;9@ ztxaHit`Q}1zmERQP~D}ny@bx7udVcNEEDEWEc3?~XkaYU=3lYQ*-`-*Nu=Qqng%%< zoLHAd-AYR*GodbR#m&02zH)76xU<}^XQwyp$Dc_MK7^gkGD0j~57Bu-<6(}ZOI&!e z0?!dEbBF@_FRXCbzS~SC2^D|abHOkxps)CZl8fY&RYdr~6PyYS{hArTi5g*09wpJW z{%8wuKN^CFG(R=o@L3F)39jW^|Md&bc81WznJ_37w2v7x7AIz6c-`jlQKhet=uU_~ z#T(5Glp%6v@&A4p?oDlI_2RLo;7;$d_%fai@mxqogRvJYS zR4P9fE>pjJ$N3r8y31UGgYbx9r{ecN-1p4}OeQ2y`lON^mW2lcyRgsTGA>?HKYL&wsHm91v|H{fGPZe{&xj zkoywGO#}sTI0f!S4&H=H%>vq%CC*+L+g0r4XNYURJJ^HVEu^pi(R$V2hXejNJ6L4C8(;8okSJUTTpLrWBc+d`FhbyruZhl4|%`*}{LKj~hf zcC*ZhlO7ms|YQ2Dew4SlgAFY?`4QWJZ_E+oCpa0c*UMBKDt!J-qE$|EWAFZeG z^q*QU^uM(p&3|dV#GF4`ul66USN|`qhr{^p{L?Gtrnd_Ckr99d#8TCYrOwcaTGhaB zaNa^TcreLAHX4f7i4!W7zwWZzdl<&=9uDj4Km1qA&c)eKo58Ig{f4`lji{(@oBMz< zJSDu7ETws`Qxu$d^VW8Z+M^VMAqgJW-u6q%Q&#yg*ty9W#%4_2I{PniybN8)FL>^j5EfS6xE1Waebv}ULm1JjuT zXE_N^9cgeZptOu;Oxjk8FCg_llKDAYb6}WiXgk)@TU{NICoAg6jG(G=K| zNs8n-<$O;^&B*-k=y`_#7NU2GgdRZmhUt6N=h(|1EogvPsNA0#p+(S-PG z`;j?R3}JT2WRsu=)F?vR9RpwjXw$8{&?sJOXGHc0-qY4nQ_GsZAr-??i`8f^nj>$o zRIotWTa#Tc{fTMv)0nftj#jTN&JLFG2AULF$%qB z`&RjLnO0)!R{@XHb<-y0ac8*NC#Pf{B9&wDG|Lw0hA7FLIisJi8;BK>$$r%A{w~0k z#e)rR#V&J=)Zqn-ymzUt^9*{*HeIEoj>-*l>f}bLONw_5x1nIeWoQ1-cp7Wt_|et( zoJF+>l`AnVF9&rVG3iGIrMZK=?RGi8JmnmPuB*j&5AfbJou5;#B4=UINx0Tc=6W_3 zUa!eQN)}2k&!H>%MJIkEg;%Z7AFFEC&!jm=rEt`(VI|B`+`ytHHh3(>1Z-IJqacoT zS1hNn&e1cM*{6N@`WQuW(a;V>+=_KoLy5y+RDYZ?y2V5l;eJ^u3VN$`7X{2~R%VqA zlPIs=0U9Q;k7l8>;#zt}o}7~FXlpOAtgWr!j*j^A>H3O6G8n<`X@POg21wXz2Nn5^ zZrY-V^jJnX*s(-o{cW1wOQ75P`2Tl%(0|;Xldnhqf4V&xvoF;D54Q)%dZjb1`s?<* zF#qNDw12xjj^A!i<&WDNb9uG+M=2k(A|mLf6%y0!DwqH>1nk!n0|OHWy+aU|uIU=}lJI6{a;$mmE_|=kv*# z-ZmNV@Aezyw|Nw3s)=QN>TD2%XV!^OSh)>E>9x?4`&{Ce#55H&GvnN%E$<*|o+|g% zLV!6TwWGX6UaLt__}7p-sJn*wxXlOQ0*Z}2{8Ry>9E!?SU|th58!)=%$dLVg=>Qnm zbOq)$ttkGT*90P-3*qm)rru8exSDwr=|MW!l#%6T`Z{)f=6bgnxA|O|M*dpWr1lAC z&vp5twm~B>A~|f-7E%oiYf@-o{upX+W41k6Z1tT=VLh^n#d`t2J@)pMQ{Qju&X+Q* zj+5}00nCfBR^22m8~P4h=?{P%8EvHmoE3d*k+Xh~JFbf;2-~tBk6oRt`xaxj|JD4Y zv)t(ljge^V!9&XP%gn_-tnWMfvsdfhp_BRVv}X2e@cQ`0zUQB`CL1|0t!Ym^!`bvw zhZ^j9-<7cbEbVqdv)oy2^6v-bf1Z|8eaQHMY0YGE&yVfRDW@A+b!W{f<8V$9V6~Kp zG_VyeCZ^ZN5ztft*D*n1|K(=f9Uv4k<^}i1d|7#%SAFi|UFt@k+7uh+l z{8PJICTHpSL<|gUE)kR2&Pfq*On27L9k~S230BsY(j_=GKVID9N%R0mPT<-n4DC7A@~pUGdVA`DPJHFr9jQ zV%t(&7n%PVBW-SOKCoT53G`p+Yyysv5@=LigpRue8PDee$4KcDG1@x|!2h+8vH=_; zMUnuHk^b380sS~m3>+gBw*M{m{%)iIPiPST5qlmAe0A@D1XW+YiY{JnC1Uez`sM1= zPGz*;VsC_|-X6_Yg(c&6>uz-YC=I(`&7Do8=0aH6TlAC|LHLsuVVnJEb^NEE;IZRW zH1$gw;JYk?o!Q}gC|~SSY97$pi+(kmUv1MwfxgrvGqwUie$4`JQ?A5LL-(g( zwP60S-fmVCDrckTrwI`Sux!w6$r6#UV?xA*9v8<|bTi~&eX(3?!@(#u8J%}!d*Rxs zhWg|5M#V+C0$0)V*c|Ke#Jt`_b^N$8yA!taW;3kAN5^Bt27fYQ@tTm$rkP0g5pU<% zB%yV|__dNf7x~w7tNW1PT_B4^6A^xjz*>oM+Er57?CpAN{sdrVJT@XtpCuA_&k}n? zyTSF)jV6pHW5Gs_gPNT3Np1bEQkI@)cc;X&IdML}3dKzhTt-3Y?&Yr6R&Kxxe0dPU zsHnAIDtp4*r38*9 z=MUZR0K)8vMN0*K*^Cf>B`Mg|!;$BEu0K(M9vT_QbB(a2O2a}fV@ciC9huH*bruyy zOIOp1#9KAW6^)dIG{e2nC`e9CAbB^%wNiX|J~Gmq7c6>5C>lXMr+J5<&IH00x{Qn#J&o#*z0q&6;|mcCpf z137-NV@4Mt=NdRui6W-9+l9mAp$FSI3xqs`1_ayWtFlT`2&KScnePe(#^*Z7I!`U9VZb< z__xb`3||AQd$bOz}L5$;|j_OX=DYXx?{1z1>(|Z+rY(R$nR-*hW<>(<{f1W z(eKP`*mFFav8+{xmI>;N;#HymjOjJhk!Aay+1;}$_zb6UJ~8ut;PiHb-^40Ut%?Kz%BA%;nQ8wiDTwtpVzFWWc^hsUr0huzP9!s^HJIyaC^W8tQj&) zYVsPrY4ADX7eg2VFffetcOPNc-tLWDLo$%_9H^6U+?6j`YA=>CShs=YMb+KT@j^2`Q-ArE1XzON_} zt^yeHO#c<~pa};eos`*=jfw#Oq`XzLBLC-U-jOni6s3QKJV#*2gLB*19sPI6W2pp& zJbAS5{4M_udB0?nNd5_VzESOg|Af5M-}(MZ`_uvotx2iW?d|^IvQC+3z{;jab=C?k z<%pw`%u9*SgV3CARQQa^3~obawAYO}pu(Z2Dw49;ok1j;GKzaYPPB9XbQ`w{nPx5d zcAJMMQd*eX5*PXLXreWv z;lin8EWF8hRS3)kRf%X34eXS;vg0~M0gsc{A@d8po@Kij2VKa8lDaYy-;Zp8g-kcH zn<+8ag3?2G04DI7?#$B`nA*6#|CQQ+jZE5ZU?cNyY8(Bhk$LgAk;(kGkqPKP0yZ)k zh%5IxE>xfdV`Vq#j*Rd-?0*>ueSulqEl+?H-3)9ZNo0KSEWs%wsDdF>N1RLnSD5LD zeu$LQ057BvOu+BIu?S#&Gse-NcIhlV)M>0l2$#@SH+7Ak-A2!0t# zf9%KkNP}`Ny13AApE4ZiUnA*s#JXhlX$Vew2oGs*eib&`G%5Adyeh*Y2IbrXPYne(!_%&RSa%p(r?>X5N2zn!k=n!C25ZQ6k-x`*loa8$*}k zNgFtfxzORqQ^jJ&4uL%t}BHDvI99*Zq$^)LC6dMPY1k{i_+4hz0&dONZ^~YJtyI7sykJqtgB>M;=aE6 z<@pHZPD^cxb)Ql*^S6x|uKx20yQW5Lqr;_Upph7(V|@VPQ!to2*I)s%^=})q@&B|j zO`9$1Qn6~o>{L*7;f6JJoz%u5eCE)y29oWW<>!hX-00nP|%1u4= z!TNn(y{qw~vBy)!_tAC!+I1s!ZD(xi*Ln2`{9Y{F4nMGs`3&~Ajd?=^Y-83EuXTr* zeBdNpSxdJ3w-;J_Y^32TFABbBf4i8bq#LR6Ki*AA9}02`Mrq+DBS>iI@U67oO$+ab zs-DdMRmMabaxs?!2DXy_C$RnA`ky8w4I=`N~$vNTJph=(}$jINnCG07G1)cQU>b+Mu|=p<#%NZzB8df7$J)1yvPTUqNm zYS}6B?CQER3K|ln5^$Kjwo>n-vw)K`kv=hzJr-s;nB>M5-Dsz)=q)%2`UE~~O~`#S zZWm8(>lC__={#B$a`KjP1*W!AHR64oQN;(#iJLG#>-3?IeMYO(?K9!6Jof^4;sZ)l zx?LqsdDGbVUCkGfVkON=`W!e+8EFmJ;L0zi#*zu|?cH)ROr#rw~A zvdOJP9|D;C=()r5t+jE1mvx5k&tVh}#B&X5-~8?5jnQWwXZ+O#R5|=c6n~z3E}NjP zb2~ml`U_kujPC5ieO?k!apeG{lro&NqHQ}dKbFsv_1FJVUlvsj|7P-P7qenh-rkb- zJJ<;W!)-(AXCl}S&bX$&oJT4^y*3#91WP~88}t?+-TM>#JuhiXITyqjItL>T=S`>4 zt?B%Fy2b3KVu$ZZN2%xI)eArb!gU2#woff4jz12{y3Vmih4Dg_Y2Gwk-YFf{K?1d%9I zg#VQ6baLJzu68S00CbQ{6$-?})(n&?KY@ZW;p0FM#cY>J*$KgkY&o6Tq`q@Eg_?y+ z5(SnJ2Qs)qP&Z$h|CmREA%P48W;*MaU`{mE@3U!}W_T1?Knl-u<{2D`CSGE571k2m z51wZi6?Do1#Zt&9gXR6wzinszvIZ|IRODR2nbljnt2l!U-~f^<&RlSe#kh%`N3)g@ zAcf*C`y0wBYs(tSdbRhME3JJdO?bn90^8Yy+_*k|M)ncS6k1)RFITjBs1Bx4r6i_s zcjm79>!}}CA#)lb&SpPvssT`NehuN zKPYgc&H^O_!0R;h-k1GE2zj0FZ&>^8u|N#(h>?A2)-~=dw&eq9d8%_k$#0I^`VRPe zJxXOA&)scLY2JP2uq@{Frbk zC-Lp`m&oxXlO4MSv0d83Qx7BL8$2h!@A$OeXz05I01rW$kgW|$zr|*Hn$9NE;-fQp zJTsf4r+c2?h7JmYWuWXFS#d`Z! zUe{J#Cu0`Qi{y|35m5V+5 zae&Ba_O1vLsp-@~!C}!hF|lwOfLcB! zeN=ba>uocx<1+iz`bmtPv&gLuE5j}y!KAx-o+Oh_f(p#Z0^!+Fud?FRa97YqW11|5 zVgsLX2UE*;IiQ>xcQsD%g=inVODvQA5{YFy3>pf5tzf9PB4h5{*R14GqsJ7U8XNlf zZFgYTAvOb{3!7vPHC#QG-X)v?U~>bn+*4JmcgmUa+#Tt8>g2BF-48FJManK^ljV>d zM;5ms55DU_qN_Q^i!}!H%x8Og^zx|p_h{oX{3NP=~!};Y$64sPW@8> zg8m$*&|#%sZa$DrNrmWb?#mT3qd_DlunfhZxUC1z$OjY=5*d$%q63Nngtdh6EXTjM zZP|jqw@5~Xh`NW7&^2%gtGaWaBV6vmR66@K$JyW#RVuYvhI41D)t+|R8^eOLlZA7w z1vsWoz!{F)_%#FEd_5h6*9qwvVrxF7`A~fgu@B>sCkDSPU^EMfd44Ylz^vQEp#3QP z5fT>qW7V|#JTIQUivPhHu#V&ob!xlI zMm2)~s$mu+-`{*qFqR>#&nH175V^q~ixr;yB$Sb&UQRhL1aCDK5MlToA4jK}%JDo@ zv!EOrxP%aDZC4LrVu_(|;-wf1`J2&(hDWI0*2f?=TTBDr}pjTg?n^cBa5gCdJ8AW00Up4tiqj zH=`KvYs4`!Wp_tiSxp#1MfqV+co?#{-F0$k_9!Mks?4z0X{5BWq=FmtZcdGEggsN1 zJsIkkA59sI)yUEE7oOCYn#9MWbRvi11kr6L-$n?zzL^%r0U*{OjpHHaUBpP~Qj5VO zN%v?%u);nJfJ^K?;|?ubP-AW%M@CTMRX;3~jr{R!myG-ezoZr^61N;{hJ|%fTDNfT z-V&KYMR)OD{j{s*@gH4=aC*{QULep4UI;X4*1#8{DrzgRopvkeS3iaboxdJrN+L_* znNx~tC?x|?2E2Z=jJ7^mGThxter`dsN9OlgCp&W>5FGw<|CbwVfVL(O9d;Y3iN-1_`p=EE& zv9DYI^Ni{(h=PINXSiMm`%p}e9MUZ38;>zB%8BhDKnk@Mdd2lNE=iKn!%pf+7Z8qC zEzeD6bnV_|l&q4`a6$|%S(y-+c1d<9h!>`%hD0qx%~Q6UXrRNpy97e1yLroP=W?>z z`#ZE^WEhJ682Lr@81xrxE&M$N+`L9u6S&@01(VFpo1ryCP|nk-6SzawCMD3AIjTg~ z$5c=XIQ&!_uWM+UF1#>bxYJeb?0A+^io#ZfYvnfbG$>>SJ(D~prnTffqSU`Y(L zXC8ZQUdyEr%L)UDG9m}v9A*$tll|+msnmS<4*+t4;MluDGA+?QXptCyO|NCh*>4jM zNh(bb0j^C&ey%ILY=bHn0WMw%Hgg`W90(PFD_@ZOkLF3Q*23Ad=--F7h?`@^c;}?S z>olk#%3SB>tv1469x`2+_d$6SVb|c-zSxG<_*3lVoFk9L**iY8)xVQFAO)J)DPkC< zBUHhc&oAwub871X+_lqSD4Zi@S6PAcqu_=npu2hSj z@maPlv5@*sG(IKaaurfX!L03U)UI+80gWQlN8L%%k2O z8@O=5nUfE5kF%JTif)3VYNM`x6q*jeR)u)^9M{%~O!Lb55YDc^wG|3Lko@T=c9XuO zM>c0AUCc$2mO#&IviSh{h0Hj7i;T$Hq;#BiZvr`1H7$pF7L&&l%}SVkO|$(+W@X%K zOtYO%6`v9LVauMSj)Qrmo%W>i^i7>%d4y|0l6mJC_gZ1X1B`hoMs6_bM8g2U9Isz_ zDA?K|(HLLkd8R1{79Q>TOZ7cu+QrF}S1zgaZjs8Hcq{}D|d z?0A!2I;K&}tW~w?R&M_9FB%NWBfkAS`IS%27CFV=TEV_k;mN#Hk&(=EbmaEkGc~og zJZMUBrw!8prncu*;P0iQ7D!p5EN}*qLGQlik@e90#8<5s3A|xA}@)V`T>5lGb106S2(NJOIo!1 z`szcNd$4K?Ty}IW%>7N!5piv+^m+Di<$|^6H%~Z4Uwi_X^H_5bwsJwYBu8x3l_ICS z+A$c)G& zNf-|*Q_(9EmzN$4fp}suSVF7B#9fi7qWrOBh5wCADM@Y?F|lk;xS7FxYI&^`=Nyp) zxCtbX3dIG`4B^!W>7nq(*{?~!EJ7@J`^p$Gp&mx}b3NddCW55|arKs}14f=N@km{e zLY-?YSyqjiw0_q%$(o!<63)s5Z&GOv*L|L7&KnMgZ4A~j&+hld0Xv-#JV@QOt-l#NNo6vRWG>jO6jmQreZ_#*1OC}@N#itPz*I9b_eVapI7z3tHW!Lk~ISHGhmK?o(JUQ? zTpMYphK5=&`7^1j1FzN$DazIT)(scSfyO=vnP}M;CHOmD-xH=2%j4Z8ht{pnoj2IG z#ZO1^=}%4oH;)b4gzMJlb&K9h8=#6}n>*TOUcrJ^82dg=yvA$3J`6*W>utAVWo2dh zsb(NCext`8oGWI#1N9_;tNXEfdAW~fgB;)0M_wXol^tOh=gXY?Vv}YR4Vbu3|#r{LH6*`wtn_)+G8Nqo2)UQp-}>-$7glxI-xXR&X6Wfe$9vx8WXm!;%s+o5RKDMEl_{4HrLMTu1lbEPwYdQHB(z#b_3LK(^#EmD`d%yi1Sa$H+_&xjT*_!2**n z(|(Pc;j*vzfh)}?Y?P-^G?~=+;8n^6wamoQmxs$r!fEYX(4JB?G@vFR0EvXr%FuAS z6c(HGmv-GCm%RhiE_zELF6#pF*%NU1spupAvGb(J>Gfo8PmH@V8XqJKONm(UxA%NL zfMwRx%9<$~(PF>X{X9(6&e77Nv<r|0UG)*)<8 zb%a82gE1EKW=c&yeS(B1i=6?z$<@})00+H4X>&QJ!7Z|1S%Thgn?+5?O8GNMCkN`x zC5S5409n!e2x4z>a)qOp0z)UEHi(+6^?j+6(?Di$^;EvFp?wxKcbp|`R|N%IKL0fB zMKtJMoA-$za0v99r63U~1}LmCTN#Y6Y_DUI4LV1vNW`C_uem4%QnRD?oZ!YE0Qd_g z6urRh*XF?G@ciL%Dec3j3+6+bv{p8;OS zL?#Ee)xO3O`M*w3mwy={0X{mpj;oi>z?K^&i~RGB9F_+FA6~JG{DQ)FCR;*M=F_~( zlV!?~bh+3Hyb8K{zP|n#{@B^p0_>c>*r_FakH4jOH9Lw~x5x1s7q(K91v;)Kjc=Iu z7e`#Azk&vsl=sVgmkM%XBn{Z2=S*9l?2vgs^_8 z+GqTVkV+{n)g}1-WbnQ|W5^hSHeaK6d)XSk5Z*V=bklpVNbz@N+F}WK@4XlMc*IBB*X@3vO31a%tqN+3cP7FsNmDVpeYeuKby84p!t7orr0 zbFr7{l?90-!Eu5%0rIMka=o^Y_5yDv6Z^Gbv=h~1>ya}Seu8oA#>_PJs||T&30OqS zQyb@=F>GWoRM&4BB*A!ymf@wW)|*g64#+nPLGk*tSZE{8a-xr;jZzV_KXkrpf$W@P zA4j{1K*w+n3Zex64l%5*w8E}tl|-yZ{)FuWeTZ!QvQsF%30MXt8ma#BWtAkRJUvQ- zn={;}(sa>My^RV^GG#ZGNJH%r6&H1P`2cN6B;X*E+W;!kdggS0em=eov4;G+wn@5) zixULJ7Y7%dc>|-}yYzyoJy~Hz>`p@wD3`zyPp8q_1J;_1Yt1tx>5Gp|&_jdZvTFJF zND|5}RnPJ7W`I9jlw*qFA!Nbp1oBRJGW)l^ShyUaC{&k#In9`;8I;5$oGUZjS;#A0Y>~>Mm4KSAV>^Eq$3WwY}il7x%s; zzHVij&|Z09KXgWZXhqZxC&}HY)zlDzEF)Y|``%c=3s6Oo3tH0+jaK#j1BF|Qo*N+%qR!Rr zE0@(xQte&Z`fKIJ(0uRcxNAQVIPzrdir>~ZJq*}!#@zmOtbrTT@!R)B=I!WaK63{& zH6fPfhU2vSsfP1w6h-$@o{|AQ_fK7C_x95`{;q$%-#X6i9Tf~rh=o%0oW@}Z3q0sS ze;ZP8+4`;qtL<_?+;yv{_MFkNBIgCmo4)+-&9>z}W4>A#5RgiS|D*%x{~U(?=T72( z4nxk4rvFL@SK2mCI9y-;TpQ$1s(Iv7vjkoZt|5ld;qrv5AiW|0k3!{1GLtZhwBl9b zerr0PFBi){2MoP9$TyeM*R@%2TwWf^bhhY{3b9JF)o*rE%@0Lx79iVy9RUvae~Qs= zxO}?II&Lj&TR!e5t89GZ6AO&9rU$3ieW|iRwJv%(tiG5&aWePam1J}F(zuq49iq{Y z#AY5@>0a98^8CJ0G32iMmuHOETl`Z9aa%{Hq6lF_8c1~C%rjoD^ES*J z2%^1Q&*=h$Q9>Zwh8Y!n5B4P1xP?(q)EKUN+7p6~%tz*~@7 z*c1I=LWms++1qskTNU8Dn~x}+7SLvG!DcF;Dpe?S*<~eJQanX@mGUa zds;o%QhW%2yoh6zsDho_j=0E?noXdOK32|{PsQf-;L>3rhtG(tW1&2PSP+*+JSJy_ z%5q82%R}*TIc$>FMa5{4<&zoDx7pkO1K}DwR3i3omsE z>AYMz?tf=em>@Y?EH-u^s?bubfx_A_TpAnF`3&qGVGb^Q6ojZC^Xf^sy@^er&lmXBu3U83jR1ufMm_Sdb@2 z+;~b5ec@a|R5+mekty^gr~(ts=q92s;TheS%r&L={YODsX!;yxFFU(eMof)RXVK6P znoKyN|eQ&oIGrF`Kgz+y&kmY@?v9q75cCk*ey z;z=dqP!T19pv`8#dY2Np%eo&1M{1G3lXCOtML_j&PACJAqn1*SjcqdqI>y=qK_k{i z#$~ll+*-@-A%C`}G@|($kwF@R5HbAx@lkW@jYWnNkS=ai)2^de{xYIj(S=KZkYDmz zDWfbtLIU_DbiJoJY$lG;ZnobF01G~4IDP$PnhqMS&z)$=S>fHX%k$bW!N&7aojU0G zcb&ZC`4~{TvYdK8P!NLsjM~%xOq*PWP~vY+Qlt#U?ISZFwyOs(<&$MT8YD!n{4Ho;aq zlOabva^L@~ArvvW87-)hS?jA-EliiT1$Ovh7@xNP05wPe#UQ3}fC}6T5UVcdVD4Zs zUeg>(0Hvn2U{LbXsHTmkzY1(RHT&j(5&h@zV!g?3Tw9B;T>!rT_h7g`8V7!b71LIk zkQGq$RK!Wi?xmZcSIK6pp}V=DuW43@d4ffL1t_ zj}YL$5?KtfUoK^wQe{RvoAfc(Z*%US3X5#8E&WXPP%3?YxM!ljT1LbM<3H#XM=Tqu ztCa!m{WInT{oROc&^=gw>ucCn93DJi{FN6SdfH%mgpMkC2HXO(X4OxK?OD?e)Ws?5 zu!&cO=oux!>#c^ZWrKj>V7 zFe3x^;*S_BGt;Gkop@G1BfaWfzh>Bm^ylh?U#u7zb}45G;a3Y?Ns0mNK(r6=X+T7U zIWTp(@bgdgm#wsKtv3UR9d^|xEvkIRyjtnV9HZRkrW1dn>DSmr*yeqDLJM!!xb|t& zVjf1q_8&f%sP-*icfoAq5G!UJ)-XDJTX+^-l=lv#eg%?v;E>aC9T z6CbC};n9Cm%hGSrt7O6b`DpC}9L`%Evk_08tK(e9-f~1}{+y&gh7Iw0fL*^Th^{6d zY%cwYSl_dHKcC)+Ij()urR)dtSee%>cQ$Cx`#g01xWVX-E zmi7mOzYi8Wh90x`pg};qY5#L{_|M7VRs!;WFqQq^fcp9<5KtegqPhA)wMt5A!vR}0 zT4+-N;RwD}sivkD$k*F6T=E>3)Hwy{Ihl;gP16wWaK>1K@**&wp7h8y_I{kOyeN8D zS;F?%X#Yv1aTCihtq`WvQuV2>Knu8Na;o5do*YLygZPi1jN2M#@GA@xcU{%ShR#Ea z)w|Hnxvma4lk>~}_LI%T_)?`xC2r}@@&Ct9R%`IrPX_hZPxfy>{W{3IOX*hdUjtL5Kv$95u)xPR5ic@TxyJJb&9ys@GvZaiI7tYJ&s>qr0pz5q3xheq8&|} z3?dj+c4iQ-au74|lRo=F5u-J~WUm})geC6wn?BLxdIcnfbg#TjgvqbLz9Is>WScB* zQU~YW7o*A|PYne44L~m$rZPOS)zP@T#|vbDYx_$u#AG#gep(wX9wRvbfdqsjI^pkT z5JZ&*%Rieze*$is-EZ%X~gd(B^F{=nSob=rwX~v78VR9PJHG%ogUo@OL4LmAJFrsGzie(J z9O_io*k5D*Y%lGo{q6#)r|&+l6~R!NXv}+7cWSQ*y%|M^R@rfCWau$W4i28_*>8j& z+Ogoy*Jzhs;69%7kXM(G(j=eGAj@dvy;qP8QUBuU03e?}{FhHJJZeC?GWr*vzPro) zFFt)A?jJr~1prO4qn`B-pH9I=S%3z>i=)r`I~&ws&)6#^C!zE&>ojl|@F@dm0t8y8 zAKLyh4E|6c|5&GA{#vI&OCm*q48uRxX)4?TaxGRKmS2GWgL3J%9OJ}vFq8?jCh%9> z?bJ;f;Cmnlm+6pg5xKyb&PNagCSL&4UXQy6g+}jAX#|mRM8IBIunG&gLyU@+1|J@C;feM6<5~WT=u;3*6yBpNE^3QJ2<6+gjS}x464usOT z(a>=6kd}c>ch#jn4kWZGWofF#Vr=Ra0>nzdI-_59Rd*F9 z_6K~6t(fiHcA9?Y57DhoN!8jRwTE60UHJ!P)21{fBkYLyVV^=8-n2-!FK6KmigQ`csjK@GUv0P1OzFpW zrPm_GN6n8pcBEW6_7d9SA8Y#@1CV@Xgaf!J{s9s6JInxlP=gIxUSK2Ks@kl~mX4;2 z<{(RpigJ)kNs4la7zoasKyx4SYj0%RG~`#EIwjD~x221aLJ=E(dkY_~t8RN9jc%T^ z!ewoNZMnFjc6XYC2I}CV>crPS^@G>F)-liG;3(Z0cTyd4%HSa^NDj|UCAF@sY(C5S zFmAmT9W{U-W_uJz2Xp2^}m}e)n7AoQnAulKfwnSmIVhvcvgMn%X&|fK2>1)D3me)4M*a`0UbNKzMolhLQW0i>R4Zq5 zjb7k*Eq`U>@`w+6%D*bXVosC`PjD|Zrn-wFHwvX>KDDrqLJe0iKad!Aaab^Co46oe z3bd6O(aS;sZDq_f_=|BsTbU8iR(2`Qt#;2EpD`5nR1B7K&fNe7=nTe`J5ig}SGlH| z{DK73OhW2Ht#~vSsHhXI=AQ)?LiPt)sZfKPbtU0r;ybJveUBKoauHzBIqMO)w~Wk+ z_S?m+GZTsx)Z#!J8t^vkrTp0$%BREHAEmBo$^-9jwO$Ho zGVBsThF8**69Y&?gDA3+TNL{KK-8;>^~YbbksrrR&o+^ujTHxuiv6-_g3(I-RNCtg z!rFk7VZVTQBdwIZK)RE1O35}6sQ3~wh+<#K&bOrAO}8s`6)A(PR)<5S$SOCq`#l&I zQ6C>T8zgl8uq_;kca3F$j@GI(CK>LU#@LvcWJc2maH^wUS8{6$97j)6XV z&F6S|i<;kvRr_p$+=(-knhnvRWPuz_SpzkBGLr}<9ka;*J^Uj`pmSfOnb1_3pSVd4 zPXJ1=am3Gx>pepo59HsT9_cI7wM7j+8xUxe)Pgagf`g)b(0|aL5%FLcrWw{$;bIEx zael8VOx*&2UIC97rP#?Fat{aySD*?DD!j#2XSWzgF-Y9w8RJ%I`NHu z%M1D8KtJnTB!8zK*8g$`h7Vp2>}jLkw9ff9TF(u${v@8s-* zgvu`^C^am<1vSSMr-<*1*8pGYw|7ALN1^vNw!c{bJ{$hbLW(V`(H%RqOPqd&+fJuc zh5h_H@DB_lhBhTe7;l5aIDJB^Ovh?Vl2n2RxKg-Cux_;UMzw0b4P;|74yDE#n=%^n ztua7c-VqvlueXQp$`;=!nOJ8=CcM{Yc2x&IS|d!n+u5Cg^?3b$MRRss`$1-Bk8e7O zY6PdVWiQT?n6!RW1acWjeld5kdxZ zsPYBB-xI>CC!(l1gc4FsglRQAOMkHdjA&Z4GDEB*RMt`bnlmT4E9+;z6>A}zB7C4- z!6g^AEG&?uuU94xaX0D}VICKC6C2#rQ(DgnOaEqeiA*JJR#;x+Q|?(=MbHlqS>Hg;A{VzLDvmt$8f~@R#SU zIqf+8dHglu_s9JW-=wJy#BK!tqAoRM=3rC51}8B#&@nxRGD3$8!!N92?gJzmz~TU0 z1G?Oqyc`xn19|>v5H+*m{hg3BKcuzQhjozEdtk-2phu6LtFNPQjQ?_U673+6X9&_@J&9KW zQs}DcLUb7qqh&w}y=#m*tQ=baqB`WFCI(y9)8x>W3afHA_y7PQO=R+0P7MBGptA5^ z*0Cknr3duAf%Bj>;k`4hQU~AqYwqulyCeO~`JR%04b$`IfUy^k*fa(;n4QS`7yIOz z5Sj_f4|a}xfyz~%9dF<7dtRd8+)>h>?o)mX183u{4U4d< zEExMUv>COdxEJN3^h4^@{coX~*57Ed?h4yK9sRXBX4}>MGe~5#yN?YE#V+ndon40* z%HNJAr?{zo0Zum2^v&oQ>8cUdh|k}q6EGs)LdG_?O;X^nj9_%Wj zAj_iM$vdJ5g!G&?34yw?@3Yrxq#_>3R>^p#`HTBE(_q(i&tYr3nGy>Af476Wcw_=r zfVMFs_T<%leeNoQlXK)55X*N;wIm)O+TgHz_N@y5WESTI>2QI(PPd@_5CW%nlJR105XR z10B#Nswa9NojHlrSef;AR7eALB?(kABL3lO5^B*ALmag~b~5%tex^jS^>Mi|c;A%E z0~}$L#8*E~Bj?4qBY<#3?lX=4jc&`Ka=}v14B*T0WZY515F|kB9U6Y_xoR!T8pYN# zCMx9PnLf5KA)BLbcK^tnSely7+ckN3rfNzK++Xtm{_HVR@C)I!xo>Xx_Rs>2T#mkF z!?i}nB;5basV9xUv@PfUi&HNoqXqZ?v4^Gq2Yc{S_@5lqigy16QOCCgx~HGLe8pl* ztT6w&r#Hq{L#Pa-vKpdS;?^>xi~!`Pctv6@;Ix(=^CQp(3>F2R)(DGlN z08Kv5&Dyv~v&c(zSN(C&_oNM=e0o73^s?J53zEN-pP^M8+zLgadkI0l$I<@|)xp#C ztCGIgj;Ee)FsH*XpLP%8PbI8j+9&WH+$7Ze2HXZOoP>&Y^Xr7fjfrYw8FqE>57*pf z1T6A+9JqKI4cGBbXqZjoKUiOsYt2Nx0f%#C5>y;8(3j}S^61z_So8A#ObSt)8Aga3 zoo37p8bRQ55#!$e)lR42kiumDW>*u-l`C%LsKZ{4xfi2yVO(8>%~ zN1)lZ+MkCwBZT<6CI3KrXX%HBxh}rc zyw_CR@I7_ab|c?@+)0A$yXpvX{S)zg8Qp;qPo6hccLFskcB51CC;U*V@1V_2etCz6 zW-GLdV28YhPj1fUnfBNwh#zMTzL;QW-|lcX^!NR{WOy!$RS|nRD=uX`NNfyS*Z#8DTF#@ROpj7&i~3AbS~?{nMQ`iM;Rt(eGmKT zXEqOSZUm`}RtmXwd@9Q8O- zm}&O{B}^txp~Ff2*LZBm9j4GC%=~wf#QaOj6@uVr@G2d^tsx0$p(Z=fTXsLepcN+| z)D@4l@v0=q90&?_HvLvl$Z`{_tcsSj1S)+oa+mDs6i^cW5d5a6*mC`vfG#&e1o)II znXI>9rz93ox|snCpdWJdzTPqkfRoTn^)a3&^MAcX@LDs;((f2%XL@$6SV~P!?YYJ! z1daq?u!sOU&)f`m`U#4sXWbxzlOp0`tgkE%d2)aDy4Gi>Ay}1aRtH3YmUP@wb|)i< zrRzwLGRIp4w~WTqEyLDHs^<0G;ZMTHN$9JdGBRSv(*B`aejTrk0{Onk4>|lMxg9LQD z;4&J7TUNIZf>5^PHI{Q{HZ)RkXI8MB?pc74cP(ECI<|dkcK~hNh;_o zd3pma#jd(MSK0jek1yHd5QA1#?1RmNkW|G zTo6X~@*R0xBMvyDC4W$R9yOl=`U2oIku`>&D$r(JHId&`;B?nsnjugsTYC+RloWaL zsHc|*4$fAm-kBR;ucH`N1?9&$cf_YP8|8vB7yLT9eip3ReQ%=#CG$oeW)Dm#WV()I z!W;Lyzrum1Zd3 z@pZs;oJ%&n?Q|qQ#T9pPCPmEh+LBbG)U<*&MG^bhLcbvhVlI>L_8GdTNBA=LRg<3JJQh<^vW*pi^sCzwcCbMjgDmxUk9dt74Z^vMkh9uojqIN@G$;rzNbETdld zPf&(N{;w^3$8kt$kZ^ER>UXZ01tV3cm>s_%6M#~q)SDK&HJd(cQ*~*ptan)0xzZRA zKWDZ;q@}LUIn6F4%Y=qOWtHj$V}`lN#@|LTm`Gan+1z%AFn;p3 zWJ0D?B)ml08i@l&v)ODjsykoItB3I|yL-C%+dsZh9AbhJz@G|dvlA?wsU=sS(1j~E z5Y1M6H5`UXCn!?*u)(Q-g0c)`lO6z042?%GdHYA}-h;_NXUI4xXE17MCR&& zf(sUe!k;SraTZgpeZ9>&BuK2~{3+D0>c7|YMt&zcN-q)_N0Kqn@fC)*(b2h)3(F#q zn=2>UTn*F!0!28GDlDMpFlTv`b>p3*EpdU}1jbKr@R(jj{nRa$LDCSiuS6cuYgH+s zqK+y?D>|dLgSHZmN2Uw^ZEP5Rjd%-7g0l2En*4z zzVjVgo}q;)fT5&0zr~aCFp*&f9e6irRV^BU+KfE`&LOw0u$`g6|5#+4tu0N&(#62L zZG2HzoA#S>-)94=$~-qX30b&u&0LPZ5eGw+Mltd>0+$9z?aV4z9@}YUQBe+)IlxJ`CP4znR3kqh;271y`8`$YyW@4O?JQiP1{99Z>lzW8lb17%H`=(_`tFe@#a)0wWbQghtNjF(>Inv&PsJ=gXcE-t8 z6pzPU7=(y<$${EsN*+d8@R9L^za$%nQ!u^E4-JBTZcZo#`&-q7R%w_AuNDl&SJUXH zU)b{7&J3JStNL?HjBy0g&Qk6-B>05@l_;e˼-@y=Em6(ul>?5sWE0xc$e0UrI` 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

    q&|y>!t-?)RBgks!vf$v*RCp`OrOK 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

    p5?HOB=Mw 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ⅅ(pn$(6E{z3 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%0DGSUU31Bn*Lbz7G0j{cC5368hswiX4Us6A{Fv5 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ξvqNHD^m(%s) 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

    upC30$h{ZcKP*l`j+kX12Tb=JTqp#_+70F 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%0A~@wN|(fPgA$-|a=8ipjQ{cUTq?V6FWu@Z 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

    !+1g7wC+1AY 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

    ;y| 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

    dO8YW;A~kYyA!WcMrTf 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%0A#0+H|Ci0@G=`a@Id7wZ; zEk5_ru zXW*{b)qSQ;eey88G~zp2fU48OWfr$=`X2f?q^2!3g#alX%dV4nLxw*zCkx{zQO`-H zYTu7VA#VPQW})~6_VeWvwpa#v zvZP80*l;VBr!>1qYL;B7ct@B;<+E0*B9~xNOvQvws=}ck2Nz$~M6i}tF!>iP&0um3 zZaze9O~_DF$CG9LgoT{Y+a5P<3IFihz-phZHlO^s5AOn`qcSJZa{dFaiJT`VuHJ(3ug-}hJpd%xtd>X*`jGKa8RfBq`B>~p zE@C#2psW-y1$tY|moDO-#fR?a1yR=L4<5lXP`Y>``+b#er#7a|odAi+DhA zIZb|R0nSvf>+ao3Eb`+v>fmP3clhSnP00J!r~j1`D@{C#%Sovm&ufO#cz?YNE$E=B zcosw?xx^cyVElaA)L}55$UC>H>>83RG@hh7iI9jLC%9QPlje&?-qJ9BV!9SB>;YeW z+lOTgjPOg_WuqD*8DA^wy8ESIj(wD;JiYYw0m%8~ct3nCY}>ClZ=Zs>;#?zFbuwpJ z;DK$;L)ar*gMcSIukUj|_q;x=yGhoeq9b z3YHLR<*PigeGh5{?U0Dd0FU|)<81FY5-%^+kan?%{%N70{GVZPZ-gv%f zx395fKLGr@(K`(LLouZGa1`KyfOIwXAt3JESDAJDKZ@1Yl}CCk+@8bb-b?1)e5fJJ z%r{IvkY#%@nQJ`GjkwOS-&=on)AlrR+`%Y`V2~4N`iF^n{Jc_tA{d1PMvI#IJrnm& zKEX9MuxwMvUK#bsT;B=>rCp(SeU01sUq)u0ulFu~fAC6);9>a+gkMoV13@?agoQ<_FpC^?doPxm&Wb&Ng`dwe zQXJ3|>uG zx{i-%H&1@lHCMyi7tgei4^88Ui()T-bKL2OLc7Vn#=eQkEZ#V(t#gZ{r#M}0Ibv*6 z)NIASi3>H}#cKF(Zu_?U#C?#LRg z5Bm6}W%gJm0ijX5wzo4icXL6el&a?-)En~8vd;;uUqAgf61MK)r4 zY-7-e*IxxRW2Jg2qMfAo2Jytv$WX9+9E1L0TB5)p^{e|P>5ekC->hg;$2Yrxav z4l!*R5oW~&jR-Pr&UQ99DIF>8OZ@17F@(8CFLEdPS%HFjLWUFY* z=UKHV#TzPxyy){E`mSaOpGl=7Y043c`N>6%x@j<2rB5CUp2wYHEnp`*oE&F|omjF! zoZQW!LYVe3qRE91@c7Ev&Vk+00Z~85ZB3Ew2L_kd^SJ`+NYwW+JKGgSZg$AN-cKnIxH`ieUIusU?PY{g9!#w|aWt_YM?(`(cn7-Li zXY`8(aJu-PzfL`L2N?vVpHZA{Dc3IkkioN9<=H$7>UF11E4JZ>c|IaxH;;mzS>-uO!<9#ym$!6B(vZ z_Y8RUWKtCz_YM_gCFBLb{qLMzcjr#E%0%ZhG@x_VW8%j-OUW=yn@Ym|@DLpSlZM_2 zwyRy#6Q#Zez4MqCvI~S~3**+67Kp!c(Z%K1>*RuHrGDi;E&Rm#nKvF|vy|$Xy&xPl z?n4`Yg8k3XFu7y%6@uUO-o&2s3MM zmn+?*#ixluBznym{KmG~VFBJI8{SFAunLmyWuS-Vdn(^5!6>ZDhh32kB0WL0K4p~{ z*w3Jt9c4A!I92{Be&48P`l+8_oN+2iD(xik+oHg4tst~u(OPsCAj<=(VdT3i{D(i*^|h zZ(&%67(VLJ&X2#D?FVg!vzWp|qA#h=YaU;G3zk583<8N|`hbGRy7U9d4X7o!O zzG6bf3TU%7bf5&noLmlVrs8fVL=%(yN%BekHek(D#-N6H29-7!vyF1G$~aZkk}h+L zMIY{ptdg<;EwQp5dMKdQCSo-FZznPYf)>DUsl5kJ^7LeS#YP>op`G${tOvekAA!(X z8EuZ)2DNK|*fP9J-6#Ze(@(*|<8SCXo;ELNK=eQ^Q$@150Ntx!$WbWm4h{9<7F_E< zR{dY_BEJw}`DDP>KsT)*lu$v!E(mtEgh-pp^tI8N3IdHTj2y|T8N^h&gVQdY5} zFXJW{UKr+d4xW@8fjSB^FObk7@n7rKve(U6^V~p zff;O_bS#N4=FKd0JS1r8;u^EDgPdM;6Tf{+&0BqiiL0hDF!^Crm;=yj=fby9El{|S zwVL7%#QKKRP56Vv7d}1wa0G@AuqYf}4TM|`_5*MtD>l=e-0AOqi5L_h0u#0o=f|%K zrAEU0{v9ryeFANQD-@t?FOdZK`Er!a14`k$6;+Wv^d-;!x_fg2qlT4%L$}MCgCVfC zjbNqt`FU^e_~j`($}r3uK#V1=k<`+&Rg0owpO)nOf>ia1H&T{ICvoR`*GS4kV1^qQnKY12?`H&&$U}-MoUrbNL zz-rtTB1d||UaLao|lYQ6aX)u*PIoF>ulh;Pu8ADB%>cZ}j49C}(tSXv{Ye#x@w^K|xEQ(=GDZ5?mn85LgGDGT$1g_dCeu7+(WtgfTGH;zdD?DrOQkmNM^9Uk5ph@jx$X+{(nLh2^r5aj0`)6z{tZ z8?xg{fYY>B77- zqc{Z+CB|zgQK(Z9e?($v6{v3%jY=#1C;48?Y|34khAu97C5i?2K5;Ag{Bq>`G?`Ph*<91DN2+>u@V zYa0Q~Ug|rkEKM{nn0bp}r7uKhVAs}s=yT|uCewA{439!e^rgkRHPEzYFCZPb>0pqE z&dhfL?8;CNOSZ2tLfu!icK6u|03DboZ*3(H7J3N2F+qB2VB) zng3LlM(;KR^ZY69!Y7;JnOV#jjq}u5S+3;)f{IQWezw#VM4JN%4kf;C8u`OZ!r$qm zD*aOF@w2_7D!cdUn}OW+gtBWBitk(Av^paBZ)6OOaW($O6txdHRJoJ>HwLl{aE-&& zj4RDHdY;omtk)X;nk#P0dXz~lbNghf6L>Qy-$>Bc!b)p}I7TJ=xT!)jSPXw4eN}ay zmI&-QD2S#ry-%!k<(C9DcT6Ro#az4)L%!?i2+IZRIo8yKJOjht`HDa5%v@bzsL`X? z<1`I|q? znIN>x%jZaxlLM@K(V*}#FuN=W^J$h4xQssd}Ky-DyILQ5(tFWbOfz{ZEQzK@-s${Y zL!(k(>l*{hsT2_@Cd~VYNbS{j{H~}_5i_nrF2N*{Y%Y+%SIISm@vA~9LAr#p$gdn9 zop=E5!HxrVI5bCtqP8uf={Z};I5wD(#!p7hG>;UY#e8KwnVdI4UrUcnKkF&5R&|;Bh3cjvzWs#og!aJn=$i1Pb2C1G0FZa*RXtX@#-lcL z2F?dZNzDO0%J39kvbacWyU>71{?Z=H<2v>|ou$BBL&L@W>Oa2^#|A>OR&C5KqIBNDg9h;-B6%H2e#1$8}*I&?!u zas3qt-cKM(bFz13-$5io`v*hi%N*qHUvou6MslNjz*qm8vV3acvm-ZXk?^dyXM@|b zj(zE>rS`EuJD>NC+#HSJdX0bMpnIITuwcvyYP~U|4?jG3kk{2=%DwdTC{gzK_~ne9 zokoE*QMr|W0}N1v}|8uqi@l{7|c4L7KXlm=IE{juiz zT$EUt%#c9>3BDN%_68aO&!JbPqjmfU)A}i>*rm*Y(SIAII06Op`GvDq5qIci~4Tf@K#h1e|Yn*8FBTE=z4;RI4@d7+08I zM7^gZ_tlRi9)u<+zoOS4ssciLXHBMJDdIY`1v_tqM&vBl8fpv6%mf& z;5#qd>$F~!i=3$Fdrry`Y7u57*q*xrDH{z`43_K?(!c8(H7@;OYR!awL3DP$?{KGZ z>WntURCWsPi`!AZEqe;X{QXvccL9!}3>b^k~$*VSJ(MTj&M8NUoWZ)=z^IcOYV1yD>Ohr=3tAe!+( z3>vfgL?jzQQh!>)Um+yCv9&!yQ+y+gDgvm_vJTbH6`(mihA!nGC%jf)F%i zTjw8eQF7qB6wU`+G$O=U_xcrtpg9FqHQ!1;loA(nyu=#9`q%g~jTeZXhr0Sh>p!>F zytRFSPlJSKlZUQqAi8L>Ke#zlN%{Rq0RvaD8a0S6x^H{zk4%2L%iDo>uN;XBtql?8 zPQd!6)zED9`7&u$x+KM@Ais5$X01>yaB$=bO$KBVya|6_kDVTPA>4=wi@oZzi}m&M zJr2jyK39PM+=OwTF}pA-vw(78JRnva^tBe~w?@;}>iQ?mc?OL)U>i-Q8rMZDvTckB z&X=bNJY%6O_lpnYVnhL+*5^b%B5cq@w*vDaw^g<<0B?U~T%Wo-ppQWxKCn+VZy`#j-}d z#LUTk!%!zws4;EoEqIkvvAcv?Jqhkr1-$VzIW6p&jgGP98#x($Zj*rhbw~8#p4IPZ zeViL1XE!m@EZsLvXjWqn70u2)cc430v=8VcTZ)EY-P&s5Q_{geh0hv!7<8l+ODD6y zQO7RhWozKCtnXL^?g*oBSM8W#v4%Dj3&Agye-^~?O1%KbDQEk)3LV6r!Qf9Zv{0`Z z`s@Z<5Y1C$=7^ntQBk9~w3`T?=w10xXLbae2YvT44|-au4ktHS8_`~~4-|zvvj7bd z)qGNDN{Z7NmU6oEG#Ms6$sw8fY(+=wrhtJ5{X*pM`}7RR#YA5KE3#V*GVl9OmStHK2#JtJ-Bk1sI;^MD)0}6C!&~g`eKCvy{STuv(_7B z-;6HnMQ&K`5@)R*Nrx#!l_VBg@L~ZJQ$)4wxim#bT;#TPP>~`Hofk2$SwL1r`*m@u z`9$gJDYh3+O5)Lw#zs~t${DpPABUgjmUhjI3~RG|2Up4`M<>h23Hk#I$H%h6d*)K2*x*>{NqH8hTXqLscOI5aY29BM-K;)|DQ zjvBl36;^i+YfC2>b#*^-4^y-~!9W_ixaL6MMMX?8AV4;THS4|WWO;meN!>G+OR!Sa zDBMTO=*piRGYjaehi!fDLFE(&s9q@Hq1OGLaG!0x&=CR?4hFbgy#-;&Xc!P z^44NiPqx8^AAJcA-QPVw#A`*E?d-I~&o3CMjG1t#56Y$-4C_ren;b1mgfk{Hl&=6< zr5WSGKA}d;n(MC&fI<2S609cD#A?B4i2|q|m7a>)P1mdwyl$R74H?{wV+vyTl& zg4}Sc+ml(nKwCSa;aU_k_FXdSh@$n@#gw@g@aR~&=Qu0X4{;Ruj3>1nYF&Y7STfpf zcilT*z$`pF|5o6fDfufPv~lgP6nXiwL8F{-jT3W^4fT+xxyJ`zn zpn@Oc+_Bjaxj_%m3A|DxLrdg@6`^XE7tX3Qr$~aqc;KqKkOY-6OC)hLW$8)n=|y?d znsWWlsU3#)-MjS*jMrm+t{H6b7^@ zf_VAnzUJk_*Y6!$iOG9}J+nimwioDbWFp);l)cXwOh9H`_NKdh+=+ z>H=)dX*;}YD91)YMFx!EyVOnIsG=R1Ph;j35v97cQ-$sjI3m1ulXo1ce8uYX&@!k> z{)om338s=jKn&lhnBqvmS2!5Sr2^ zqx-<4BCWE8&M^@Rp}QeB9?%gqwdbv(llbvZ+2PGtT>yP8i&J1v7j$N zw&rxqf6G4c%`EdB5XPn*gso9gfP}&VgM)(uJBx-)`#)}=-tLxSuCAuu|Jw}|@anX| zefRW+osHm*f~GK26i4L}*41exyZ5zW!<6;3Sp__`N}i9~~Jg zO%SR4ig)w~rvXMSww37U^mL+Uy?LAC=tv*BalSe?*(K#bDf z|Cdn;*;Ij? zgEk=NpwRAlCG!WPw3IuO$-d6=gHf6ROQQP3kp2^5HuUp!zlE$o{v6re`-1|^_b(A3 z`^01fTW~969LKS2>TZMTkU{g62Z<-JPn4LdrmdfWLanUFiB$ReojV`=PR4_k0_ISt z%Str6AukQEjy!scwYh+Y1BW!eUaTK&>d%NEn$^DpPSL{X8N#p70yst=s(H&A_m3%GhRieOy}lGfG*Bd%k_R6x z9-4W^FUhxejyf%W8hP$?EBVW5n;#PUW}V=1aPR$uzFG?)>g%gC$Ub5B&pz?@>Tf^B zeQ&`2!qFZ=#AUOLIa|43;|{*p+F@dj*Z*Raa&EodPP}ya2$bvLON)~H52JL4{)17P zbFapRya{CSmlgVN%y$F2eu^f<`hAS~WDieK(76$6ZV{jxhJ{0MLJ{bYyu1d0)m_YI0ur zuJIutuL*Ah9tI-*$22cb7{4q0&;{Iw7cD{_c6LdbIxg3hso}tU%^8SgJ22=Bv@e$N z>!(lu7Y~yciD>`HC#De~CDR9u0w1kfv}~A;|HZ@oPY)uxf4MK|KWe*HpxW--cXA}a zB8xUJ?Dbp1i+QPdMHFqeGpa#5ds2gwTKSv_czsM?D-6siy)+OlbTpR00ukR2K?y@p zafq5F_ybh>HxOhLZCaqZC7oAK76OwxBE55?oBwQb)2)#!i~eYj{nIvt08^PlCA#!M zDwKJGKN6p?5$w&o99MmS!yZ4xcW3RZF&D>;)F`8|B0#faz};O4&X+gAB_D0ysaBp{DO)0*9d8I%;Qgu}~TK}m7_>OASNdJ#6s8Aq3@YFmuK<^ns~SaHjQ zf;&k*L~bipC(>n6wsJ)DrC0UDMG+nHo$gm4H4`>CF_O-ZW}<#GZK(=WCet|@1lcS# z5>+yg%VdUdX?GS~n+XLcEL-b|~dsKdWgaSKh(J*=Cu{ce=A%dZ}4fI6PvpN4BPBBgw3ziFf*8uxL6!MrnM$ zWZIEu*tGe)AYZ#!jj=eLCSa)ZTK0qG)zumpvnjlSJ{WG3v4%AE^H2aKHTOqA@=>tR zL-O_hBPuy#(5`WO?q$q~Vcz#l-D3Xvd_x$RGFm$Nc^xry6hV-ALaVs5e!zSj1M&P$ zVtf{4na@zizW9c$4^pcl(3j;_G`>VtbACs$8>e}Fn?-8E+6-7qVy+l zjICpU=HR@>C2;c8Y37oob!H=H5;Z($naUQ(E3nb~)@1So0+ar(mgh096+q^WdD5VW zj1=gbax%*xtn#{{l;A#Z97C#?<%t%R%hZD0gt>c1FV+S`J!ZWSaW8BB+XtpR?kRSX zcSzUo6eYb{z*+c?*_)7m4?Cup1=^V~YkI1?@hbRZbR1#Dd&WWjSdTJ?7`(-Uuf|Bx zK~YmaY$FY!7(kY>BS`|2z>MW2Dp~ejNr2o`jG>Z0m2{EA(eH-1>^8*O7R>PRUC6d* zKq`-i2Z2$R&Mbq2m6ROC96hv6<+-JO#`yumDM1hiL0Qy%0+(G*L@APwKz}uTBxVL^ zEm+4m#ww6y(9CWI94ApF#c*62!w7rgR63f&8d5>l#VSA3a&Y3qIdPkOsJmf?X0*hu z^`%}TQzU3?Y}{~cRWCQXO;-A*d0)w5O7r52PVf(gC*9*45SFy*25q+79py4P6+|W7 zG(&L~@CtisnhGkN#Df7|pv3qP3{S;qEehsh&t10U{&rx5Hmr;;GK&8C$+`5@W(DIs zCTw~=gO9T~0vC>`FO_O=!GJ~W%D$Ag)fvnV&ZyZdIb7cQ$@QW^ss_P0R&h*xT*=(hNw#C@y-h$I6X3SAMNSH<(LMEZT@n~%%QRGo$D&6GrmMT3dz%_3fEDnCUPenu`sIH3Z;!0UlTr6*yA=OVfH{R~u&hM-yq$G$7Wnl4LEizRS zT_(V|3eW-W53^Xw$n}`TBd_2sFm=5L?_Z-8EA?Ll+!$ zpRkA6M$nKUs`dV&gUpwqRtj^(7i;{En}WVGsry9AZ%hLSOtXw*W^6>E$Ec ztpK)Db@8X>+%CNcwmp(Q?we~Oe169WwqJ?8>;pCO3<*B06WTuy{dUr33nhj#d|6lN zv9EynbiP~p=Gkwg(a-MiemGgT9$n3e+N*2f<@?h=wbVr`Hs@ev!Ew#{-!9^s#wHv` z0eo4OLbhQUuhWV=ZoOBzzBBx*%I2u< zKOHg#!P0%Xn%R6Mc_K)ygzVo#VNlBO>yGH4wz@b?nX{Un>NIQLE4d`?Gw8J!cz@zcv&y&M$I(&Z8fSM6iMQLHZ(tkJRH}^nb>8)Ep864( zQ1wG3B68aQz@=_5WU7oLieQzds!62dr(eC{H1V8Z#FF1woDcE*skF4Wf)>x^7~!Y7 zd@Ehn1#Q+$satYQb*}pi2>Xoo?-83{F%4C*{qvEEH4JJw2Sx01jMTMtB>o@1-YP22 z2Hmy}?(XgqB)AjY-Q6X4aF@c}-QC@TO9<}n?(PsEz+dF+?%n@BXB;kSRB^=}@2s_+ zHO~i`5?d9@{li?L8B=IZ6A-(4b9`H6p#Mzejp}d%FeA63_;!K}Bm)%ufBLeK0ha)J zb%9T0UUv5;AV>L7r0;cC4ouSZN6X`p3@ZnV_6OdxI@eJSPZt9aSr*~~ z_nRH-7Ds@tttYSE+dKxhi4nH)n>6Q<@ug3&V)^OzEY|BN6F;FL=4DV^)=2e(EH7cnPz=_IT?Ld;AZMO>5guijZ@} z<o%GS|RvwMSb_cpZxD^eFF6YYCH)j4WSj6C&?!2N{SuAYamhJ3HLEskMph) z341eUQLkYp<5R{0eT?wWh8U9N9w^-gD9itNCR`fZPLH;~o%kYZuHP8oqz%V*SlV>9 zT|-X4@ctGfJy@hCq2faW8z>YdpE4VA2&x7AHOHH-M!%&XHmUwdZ~Wd=2lPyE?2x4a z#qq!qme8T`9i^%Vbwf6naRi`eLeWXs)&cD&B;gXQUrr?D9+7hp{{|Tbztd;th$z}x z_pQ1LwVHnnf}{rdZIJ_KC8|m_2`A5%koW*H+}`YEyN6v8z0{yDZnz6_{(v(NidQ0P z2Ph0o(QE5P+US5k4uWK$hwRW_fd)a~2utPp{YrZO;`k=QAJ5JLNU0Uof{hNJ&L@wT z1PZH#^rpj?JrUztz8V{YTS!(S2%(uC)3kp)6Fu?Yf0-0d$_RKb!@n~6OIH3~nbB2r zOLOX9R0DeBxf>&NubTkJ`PG34Cnk`4+6EfIVE&A)cfUn%k< z0RoR1p(Mc2##*2ERgGE%jEfcNbJsPv3fv^Ebv+9-YT3u-WiQ|*Tp31+99r1ogW>Gc zDcc9hNDQe)Lh)XhY(CkI1<62j%2H0lk`!^F%phaG_&1D}VE)Z2sHTLS*ztMp z7Lnl-t}``v7@)#LOuV1lJPSMK65Azmd$D4LkVs@!A5W<3OoCfb0ai7Yys3JpVF zXvZb#DZLss*eVDviAdWOqe`G?q6sLPV74`NF)c;`ne3qb*(3Pm5EP&{r-wcr=1|n= z5or@I6c!HaYYkq{hK#Mk1e(LcKGmb_)-z~;-&-#NINKS_r4{2D_`WqYAp6`Zp@zn5 zXD6fKq;HZ1+BZodz3SV~p_E1V?^4yH9eym!X%B^b=>V|&(8Yfi`2n=W12P4@dTkhj!IZyv!p9=%Bg!L<1f+0!4I|12WF1`V zwaX$taC;W=(XRByW{55%=3nMsG~hxcVI^=Zg(ejk8OE2Q&`t;Ac1iT$2jvkfor!kd!QQS*{|~-Y(!wuVJ&k? zWcP$k6WN!F4koL5A}-_$SO46+?WFSOoZg7Nq{{SrcQIYDCdE(+gX@JuXp5=qSD{~d z=EtL1Y!0`UNZ5KJqkzgq-#_Z=Uf6VhPK8pU(q?7(*FnL*JuF7qFw+`COZZ zVjX@&18wna%=zWKZ5V~LSK#g*QHdvc7=#hc8e6g5L?j!|S9FdmO6~f=v=DzWuEzB` z#!o$kT!n`^KG3L=-VvT;?m#Hkf-`?yu+EkW(WjD^<6H|6y(!h^(v+i{%~%|<`D^lJO#_|rp)piQAw$(Y z-H3qrUnSB>B=c066#QXJ4sE_JNMMtezx49B{?goi7=EE%)FvoZHZ%u*nYWCNj4bDj zQ*8RJt~jC{3tKX^B;tU(oAo_x3toDJqshs+tnqYz{*4Mkht&6q`OE=fB=M@&dP@#6T(PtTd{l#h4Pk@u;JGZ^CxOnbaw=tRX+*LdZ~ca4eQbVc6pAEhg`qT@xz2 zSd`gt-ahIBIwr!Ik&-4Z_E(IZ^$xfRuwBFAUtLZUbrb+V%>-;ndG;KXGdgl7=3W>w z8*U7n(2{b13Wk9QQ!CV}F#x|NI*o;X^IN3E*y}0GBNfGA>ly&X;Zl+_24Xhz5lZB> z$K9g%lVLITG`P%XGD{U{#{6tEL$SF&WwjQSN9D-hb8j8_vi7Sx%<-F}qNe0XNpchZ zqNXCo8tL~@Jtp8*)r{7>`JWZS+S{{>K6~>H3S7gefG6X^i<5}mRRQ2+O$l9a+Ot@= zqCxYpD=n5*YP0YaD&HIhSs%ldqNTjcrCa6A6J zbMB#^5lIGD!jtX^4geI!^DjVnp?|Oa> z*V2;_-lgQx2fG{0eEFO*3cODw3Lu}#ef@i%2seXDWhN$T?<1y#)!e_%JoA)z*K25Y zdGx!BWyT)jZ6L7GN2>?>3S0ThJl7@2N+A3>@r2Hs0c{3=DX87rPtucJlAqhX&4}q# z=f-`O)lq9{YYO!4j%7EAf*Fs+>{HRM_VN%$#DQSj07m2@!x`>OOlnj&fp42wTIEN+<3z@ z?VzqfRCcT&$(?ZhW^J|l8*SjDk!x2C6zt{fg@~BD%yL!>nJs&Vf38`tjDD{*`f!Ab z)cTa!&FSo~_2A<}yt4TGp0A>L%1uF@93q>pQ4*K(hFG+dgBpAIC#dXgqN#N%x?xUN zh;I;pF;k(f06E=*8K7rkbCpsLdVw68B9zYDX=d=pZcD}9elQgs5k0(SBk3cm30>J4 z)@*S^GJ_ef2oHY}*QIEBJeF~>exc-M!LqG0cU8il3Jzt487JY-eTK&=U`~tce1rye zYqyVJtP3gf&>dbv!~`!lFn)U%`)HsHImm9RPk}w7RN#7iBv*Sm$P(VA?+5DO@UIL+ zsBTZOJ>CEb12s2AOwfK51x*QKBiunRA9?SL+PWLS2ig_6SKfc<<2q&W=)=!LPUJx~xOcYucCDD9;XL?c({RoS)d{v<2QcMWkYvdB z+lmhXxhFWhnj>A17#VKf)zQ;iNy%`*M#$P|Wr;Tij9&LCFs>$K&ucBeR_jrfoZUns z;*>4sfea$&K=u{)gW@w8&9Q(1zJWxPnh+lAC-5JA0N&gO;O+hk@N8Krx~F`BfEPvd zZ@^mz5H6cncF&_l{sp`S{*piW7EK?32mCG&?Hh{vCU9x9x-j1@q=gI@2Dr58d3g%l z*cmRG)Uq)zt~OERxx+?gMhr025N|ut`^BIk!hTNg8E}?GP<6qLJ1|Bx#bl*LSV_S` zHltx%xyZ4xh0ll76(9N}D?MbD6NX|8m?1?CWo>K~(l9}<6P&HL5r3BsSt-|+U1@Av zij)Y#yAB%zTH>86L`C+#*_WxkAbq$5KN!#bPWbYfJ&>Na2?LZLM>nB+4&&{&@7$lM zq9LXam!RKZHFv-Y(qEULZ$dhAdOgvm0$qWMA3^Cir;xu?*1~QWF z0K}sN^BU;=${UrOhz=7FQPB7s)OX+(@!fPAwatroR+#!6z?|-KJQ|nULO;sm_WAzc z^jtpKTEl7~`!WG7s`t60*>4#WY}lB zg_)+Gfy4v`W|fkDKN$pC;+e3RNw!$iM67}m4@8uN4bI>uzML9y6V4v3h&7ouaTjYQ zK*YLV!8mvOuh4%2E^gw>1UGu)Hl?qv8pi>t1~LXa%$Wp7k%^R7AVq&87Rz*OW;LGJL^+%DjGzf5Q77J{0g4Xx+x7s>9a%k^7i z1-~Rg3D>6Rx&M_3cE3|Pe#ivp0`*hh5C0<*1U5N&&WBYZfil6C;D$4Y;b>l~C=Kn? zj0{^mTY#61w_Ya!P$u{_S6@&AC=(2@*rGxFC#bV00JP};iS_u9305f>QS>JI5)(Yb zUs@(_|CI@vXqjTbT7Sp{nK7_UI-vOf$^?-iGY1alpYyt_QO*`P(+h`C41 z)MXJ-SNtr$&?Wma(xJMXlqLr5b=L(A2DLwmG4a-9G7>S9&crSbi+4heZM*BH9RsCJ zL%HQP*o?CTGYNRWJ|o3W3f1)@y6ZO?Oohi^X_IBc`dpqH+;=Ss2HQ0okDdjZFNW&gfP6ApJuwoHzV4qWzwNFX+JlN*6 zN@jU0(XZ>q>2$My;_)M;Q`*ENm9gV3`AF&9JhwW^#CR*Tx1Hw_{7*DY5L1#cT|Wsj zJOZSxw6neBN!sA*S~Nrou0=X zRGLHWeg~#>qMO39=1s6843xHwC>2uuKgnyPD@C|0$yJSscQ#8|nJI1kC=+i45|Zmb zA&JrL&{We~q9@>i4r97Nv-q**J?1uoI081x5kur!EbSSw_MDypjOyax{20pM5VPR+ zwi7hOsCaQ2ReLiFzi*yh`0j&Vn<6q2O^Z&ZdX2THQYF4*$$ZXM(V)rr8YGinO(DJ; zrWS~7NYpQlv1%tmga1g_mzb{V-}2;e$VZiSw(5<e|ku# zomZ#jP4=nlNqfiJ_gd^N7%x*hZ^LoH2!tfOPVL(0=hq}Z$quv>7LAXKytj&$3|z4a zRYFK{;#vwgCszxdKQCS%x&{~oX~(fF4@77!fbZ#qxEwaF^1LryI8R7E?hX%cJY7O8 z8shAQttuaXPHsplklpnyi~H45z4h7J$R6CW`HZ`JpR5|8>n#9NI>z2?1|8GidtXef>E#D_$O|;c+R<T~qFHI7VMX17JZ+6`LZiK<9jH*MimN^)$@00qH%f z;!~R*{9YuWh8bAuamooEKk4|J(_Ph9s&Vtm>WZBBj2Aj%MH|BRMtn27RX9G=tNyxh zp}H~ecU?-oeCZ-L3~^r)37>CQIie~&B?mHXC3pd?*n6!Z7zoBDfq_Gb?if=0b$|nK zn#MJIVmDCy>t}5?w6M~2HZ43B$zvD6OI_}mPq!#O7CnlannIIZd)W!yJUzBKb7t8Lnu#%pA5rhwitv>Dv#6+YjBjh0;MDAIp#L zMXh-wtZuE96-shv*Mk3u>AcQ#CJ8=bx_L#;M#kdMY~}KSU)YbBKY%fv12CrR`AG+!}xYBd+)lIFMp%C!mr7Hf+QmVhJ-`o#zKqeugn%&JHcp#AwsN0J_*8K0s3?Oak0VTbFbZ}m z;{>V}XaE5b2f^n3Ou&1VsW>3NvD7ZEyA2Yltdm~KDmNMH$czC9rlQYZ>wo5T(A-bc z$TAcyOELgEC3MXJ-XXvlsf90P{CG0gH(=O%k-F@YD*eF>v z!jl1II18c22-jsg{U}o0^YBpou#-sTx=a4)HTUj5_f@WDk!!eHQN@G5lt>CEnwCE_ zxBcQ#7Cd0rk3S-}uFDH&dw&%AcqxT}j2!5?6LWiF{yD0ef}+-1MQA3Cbt8CXczu} z%+OqJ|4(Z7Uqq*4W4p?U`j)NVtLj$`rlPdLe$HNpVGZlkqBV3CL$>yT=Q z(dK3LEzHI>tD4*1;QWjf5VFl!oGC_vX#LV?M%;Jkb+gcHYinDz>P>4zw%S_f&4-A1 zMjUQrMtKsqYQ;-B#F{6l699@Ioel}pkHOcg=djI#iWRk3-znU9d%F7C_XDbC+G11Clc&7~fYF<37a8b5`Q#{N zCc8@x%LUVVJVy0PpqkqfH*?Lt>>9a}am& z;87%Fqb-4kXQ{V$m$!9=G};PsjO6T9E*uwWUV3YT)dd0UGzdaBnV5eu%B{PAQ4aEV zV#GEInpS&j;+!}`z-%p@_Nz&X)=eY14X*bzUEsi%0<`QD(mB;C$ndm`6bkJs+q!9P zIYa^ftW-l}_uE16=D@mUWG~K)g6=(z>pbB(Xi_XV@j4MCI$V#v3(KY7X#a{#j|Ptpo4iV7L8iydUa5>me$j zdLq`*Im+WaChK8*r_w~;JAXB70>+v=Y{Q1u?AznO#Z-OsIxFitu_9!@jlFurw z<8ad^`{0Fdpn!8?A2IP6F^S)#ErJ#eTbfSxs#I1Inq!9KBZnxxR6V$D2yT@*k%WJ60bLP4f<5KhjnA>P)J|V~r;B9JE5HfO2h~KElp6w1l3FY6!u#JoLY|-KUaRsC?{9+lK@||w}|jEHOwS7 zXPi?4Zwt22oEgb(C-St&&&~Q4P#baS#fTn9I5Nz2t)Ggb=1j~|V4Yr?=uc>w9Ld5l zzsZGQO>zMOgdJnv`kY#>vt4NtIzpNnZea}v0`a6$C~()!jD$ShVlR%Djqap@tL_TW>BTls^L5KYF?S~ICpAfepG*tl2Q{baf49yN@C(r`B^gJm05XJ1EbT{}H-J{kiUot~C4~+64H{2of+_Zmp-+&POX?=LrSV?FOHUE* z&04B}@b_~7ZrPQ-H@qoieE4gH%%zIim;oVcR8757TragA3*xC^r$kv7sD24+KH**s zaqKwxTRBZajbxL`O3s-jOJuM=wPeCM@eqOzOsB)J6a`Z(xl*9&NPwuB&js58HG>%d zfq-(h4%m7Wjin23-iz`KHAIg`|Dl9$hE{I?%|`2p zIH#VpsLhs`cJB!;lvtt#pv&PcAlGn3{E4HIY9*(KdLh1nOQkto1!u*ATUpvH`A{U~ z-U_N;7LVn-6TaQJNUzU8rw0Et+Heo(9~N!j6kl(i6&rVkgRko%8`B7@iVo!xv-&(o zH+TDpDR_(@4~J)zLd+Ev#R~iR&&+WO2)~0~G$(v|w>s`Z!hW5ER%$S9y1R(GLA}aQ zB<(tHgN;Q4l^H!lu(ZT4H!nXZ5tXZaffh^z@VV&C;^~=$2!R@By5PKh{LxUrqEK6^I=S^{UcPk)k5!cA9b8CZk+XMD;t4~a|Or)GU$XY90&;K zwxtxfb(RU7Y<^Ohe_fDIeDUT;Kf-g!f+zU;<$C>6gn#3}K+Br7vOl@kX~{!bL*~Sx zh?tBS(#|NAtj_g}(X84f%ML z1!~q1ZJ7PQjdvP&E52wC2ybt`fyv{j<$0~pqu~3b2?O1trojFBg6v@eEv@ODLQm?< z$sbNp#;zY+KE`%fC^oJoaBOEWYtA&+PM{;AdJxWfd0qU8AlL)P7DF>h8GTYq<#X=H z*}01fat*INoUbK3he;`kkG=E$b(wn2V&%Nm{Be`z9qzq-)XHx1IEsJcJuvA&$)Z(I$wF&VYim+#T}+MmnyMw@KBjzL&y})~$zeMaSMmF* zUiSNy&AE1!=~8)zH@}gGHBLTr$lH1(Zfo6uZX~WNBcDv!1^`|bWO(=OthHeBmzdSH z)lUg4(0wLn#Rr83uY?#6J9>zN>~AB33))6j&PV<4YXO_#(!{#u--mb4jJ4sF3~hZ^ zj%TEZ7DhVLn8JfYUsxxi3gLD+LtA1(&%l1>h42pNW$)8QF2N~yZRA{>e_5A6Ru(+l zQZ!273u@_Z3j!Eyu6)+$H2EQ6NEN)sSJ1tfSL;_8_C-GHQC)ZL-Ohcv>xs;jav3F` zjCXyUIr&AmGBbKqyX*DUL>XS{0fb<6>W;i^DL+phd;eEMFuYK$h=#PBF~!AGuF_8` zR7Hu<5gn29GtJ~D*U17CyTY1d`%Z;y>*5*FKkwuo12TX?9Ts*6<0Ar&sAM5^1a}Cd zIsiQi)tP~RV-e*%%Y4~QlqMhriQImd=)tc9g7YiUkYlF;N#zk3hlA&0I23uy7#O-s zR@s6NgY^XcdV^X$l#TPGR z10Y7m8gC*+M`D0qs-65!8X#D`(UjrIlA#2Piwz7URRz7-)p~zih3F}v)~u%=bTx}I zPWa?f_vxWi$OXV@P1FL&CW=G4IELYRZvi-X2~@W2{;6}{;taXSyI88nJN*R!{+n*u zQ!ju5$_b$MpED=i+tFfYPV`iqUoR8ij7g+}uBRlh#fdPVyIa+!x;Z{7LMj>TCbq|)N4Hge5G zLa(z zupI~Hjtrp)pP(_^P}IJ2L~|~cU6okr+X`&Q4L1PWaoK?g4vt{q^o(?aAcl#2&wuLg z@y_hT9YL^u9fJCKq4#B&<0pKyjC$83b`4RM>jh1GZ75?UE(~1PjW4>pFzxy$+bvKSWAR(L5%esTvV}k zw_^u5*lB1h=Gn*7>3r$@V@e+p5^Z3PbbeqOI24}G{`Q6FeTE2F=jl1XNi`iy6+Hd9 zi_Se``r8_v1*ys7t1kg#Y>36F?v)e(FlT{`J!I_F4fnBtLBJa7_w=cT3)u`Go$F%( zgBPTL^LjJhnawF8w+SAV9@Y?1DXlEzts31 z$$7G32CPuQWpC5*=+ql;YLP80JRcma4y@+rYv-t6LaNdVcOSYUFGz)I+2VVI3tOs+ zlys`B1#YAe=kxum9f$k39VZUb_aptk+Ht7=X~%8;yB#-BJpL2dj>AIuXvZOXczX^B zJK?yXLoB+(KFg#Z_rFC+znIw}HHZdljS$K0mmNSsVGxL7@GsauMIhCfs4Dc zOCnuR))NIMRDk+$VsyIm5+57kCd?UjU&1K6UDTa9u|~fkqxqLHYKnVESXXw<1+|8J zWE9L=_1sR~sw6FGhgjUr%6<*yS1Q}h0bSFL^0N^YGSF;yb&-{ig!>c0nu1d8W8T5C!&%( zU_LpL>Fgl4mj(4g;kEkZmLQ)I3H}IUsnL=J4xWz*(l>5a)KaD z5t|C)VMuvr^eMc#Z@RS_n<_HC4kdwJeE-M^goC_F6JgD^i5mkCu*(WMYi&A{aG)}o z6x6%Ezm}{$Wj7dT=^v~JS;P1oE+r^h;Y>j{}Gh-1wR#ka0};qyjwojy5!L?_WLmH>Ok^WDaF{j`!kU;UBKe(^IQ20sik zk;9@SD%GCNt-M4bcru=6s#jWHhi~PaOSf36z-9K5#|v0xDG8FsyM!neTjO`PC9L>D zOJfpL!)-VTFnnG{84tcC5$pS{rTG!fw~7H$=+(&BjDmhJxGoH>ClWDxg<|Ec`|?7a z!~lK(}ye2*Gf_w`Jtmuxx}X{W2z;<8uJn}rQGKZ3h? zE#gbK$H)$iN!{(qF3COPcKZTxp1+RKNAEv1Ma4HexweO97~nConcj2}biC3p3GaM@ z5+=jq8MZ-F8>JxrX*zp50}<+^Sy`P&(HM~7QqYrx@z84U63J6vYDvGe74V=r*!kOS ztC>OKaQFClqd$iNuLJsK4p8dUO4;BOAiFzU8u#nBuYngwU8678oJl+ho{Oe6q(&iL ze=ZsD+UblF&L0K*2RMGAqH?=41Xyc5oY8Wrc#cVbo7f>Y?P4`eY1L2)YOastZYiP(-d@%D{0*de z96_bQT7%0M^exe^p4e3zKEGmR-~{noaRf#Ve$HA*WL5vLTZl>WRef5cB|HMqKdk~xPGyFAvb^QEDuo;RchmAH1%y_FYi11y< za5t%nn4iA6{G4M_g0ne3t<(e0Ig5j2025g!CvLfrEYX~_gi#abojBQ?LKsr94kLEq zS}jU{BaSu7G@#@%ovWeEe1e*Mts~pPQEN17csvE=u^aBO&MyAt&DV{4(pySO1^a7n z9OcC@r_!#rFWJ3`qhldq_H|#9M@|6V<>g3)JNnDm~j^`x9z)6A%fzoao`2 zh+`fIaKj+|=^R)hj`^i~(Q_m|zUs8r36sWMQEe+~$Szz2oU_NGKM@eCE-?`4C2{f( z6VDkho&rowF?DNzdNrJ@!L_^3pU7=(EXwlK&uW+uL^{2?;1tT3=+edrL&V=MgPIxq zG?^`k&jDe3ld@W%4JI>J(i9_B8orI---Zi;g0;>JQRrD@c_GZe)(B-t0clD(F#;T6 zgKlUWn6Y@t_I#Z$LYUD2*m!|}ha6f>fnQ%Gq_Z+V7d0*)>+4QpAW6St-gbwGUu;|t z8+6zpK=Ssg4AD+Jub4{(yC9c*0RU=~AcO4ja4aVISB$U7*%}x}h z7LLs%7FBsglJAdsvo7b2(0iS=I8`gBdV@-uYq!2)_Z$W^Q6YH3epgvNU@4!pjw6if@+Zygr?wBy6ty%Sj z{x_h84t@t~(fFcaBGi4$jeKA5eqeq-dzfb1b*aaTl19C6+t8)$k$>&*q3Kf}aXF$k zAA|G7LE;1&A@c0R(TF+jIIeR)UpR{s6o}e1PsI{t8nd6;nKJl7*dlr*e6JK~HWV;J z$;NPzD`P47QBN2v1po(&Gufp@_;oW^pAC2zW_gFh^`%Gw$qoY<0$d*pCS|QH<{hZM z%d1_vIaFMkx2M;nd<~a%>(Y1fl*yPH{~QR@j+_yluk|SHp8>_WW z%TKMEDWo)CxMcLghb~0Ue(3)2*6I*rvj3cqCy9eV%iwof9kLF_!AbZ;(=zbvfcIyg z-HrVL`11Vl_rvc|o2!)7EruVmz1@#CS7SlXmmSF8j{vP`Zw^#{>MjH2BfgZA=8}IZ z4>y;Q03JL^$i6Z-RwcdvMY?R z2svUjYk7G+ZId^7rx)p5ZuD(;C)KNV61ZY9STLJ_$yAp%XvLHGhcpnp!7@5Ys$AKuu~V~r&p4~k!C#36E7x0AUB4a5oRC9cf3R%I|!XC>u1sMe$k z!J^85N-k7p2A>FJhetX{z`@wBTxhPi=irQ<^tUAk3-mje>)1^Egf*jzZsW2dX0`@+R`T~>cFq<6Jqj8g5J?O zo$=DItX1Nx?P-K3X|Fz{(}ZxMHbl!P;EuoM*7T`d_YGP^MNgnut}Ftf?2&v%;WY95 z`8Yg)%V$6i-0GV@s*KogQP~gw+yh$m54_`d;&h(MDe9TN5C5FyR1zA>Qjg(Lf1%(T zv&Q(+YPAiHwf1Y(?&hlZbR5su=~JM8j;H3452xdsHBLyE`~*4F?yVX@#_5z7>aR5z zo%Gg6#LM%aUlo)%@_8NQ5w?DJU_2Xw2LQ02+evIiw^>_@y79s^_?of^H)b~H=?C{~ z1zd`SyCB+3RY;%{Y6#mc-(YFil1_SzcIvRhcv;6X>`>zfLs4djcx!<>{==~aejIlp zPUn5n8BQB$?T&&INB|!0jycyN95Aq*XF2?Uk)U12Ls(YXRh2EB`^=$07X&5|RDh;j zHuKv6s*;5$aO!Z3QDO`VICY4D2c1M=o^F6qG|m~Fy;CXkEk~3oB#9dB`;HZG$3L;3 z7iEhVM}$9_$|Hstfl6^PGAI#7%CRWjuWGiuK zO{JH%`brv|m_RA@7?~7?HeS~RAdW08SbPx08Rf8ouhKW)nhH2|2obA7u&JI%<<=Q# zF7axQkt;Iosa_KHwg`5 z+)L{c~>F_9qlQ#$hu7r|?hO{aU(E<=l1Q=`h19E{U zNJZu+{1OELc9phq7N00PNDO$F#T=`% zW(Q6kmcAc$8^Yc&d|0VD!ANb>cO`i%y_mOn&P-G6J$7)ke=U7X9cp{N+*5dv8!J7CT)X{$rrq5^p3DYXqR$##tdhxO@X)ZohQfxW@Px@?UC^ zJXkBmKA%Vn2az}Ir@qi>^VKfA{LMta3=ccrio)f(mbaCKnB1%y$tV!abwOcm%Rw8o z;7>q4!C|Agq4GBT{6kW{!;IABZG#?|#KzK=;;-{N2n(MAcx>=HYgshbaJzzjp&;@2V zm;N&=V1NN#j@xfuUFkOo$y)aaCL2+~i6kdVs#xD|QhzKz`RmMk&A35#YAUuqs|_dU z+n(;HF7x7RESy#^#c7penc0nb;n!=c>!(o;BH()WJuP$gkxd$7%6!6 zA1E`HEame_am(2{BPtjZp9NB>wBNsMcukh_U+Upr2<^bs9sSxjG%5dtyu&pe>IrB{ z)T0#oTqYxrX}&zRw-O7-0{Hg*G~yCQ%r#C=c><*ic^Hc&FpXLdZI2~=_twRouYe`p z`jPeBB8$+az0lj72)KI)4n1p+i^H;HOGb)24hn5~9qf#dCKNPGmyHdhASHJDOrX){ zQTDEAif~tr2v- zx$E**jq@+k!41%Bx*bH! zbR){aG~;_|8@KOhq5KE6iUm*fhWF4Bzw#@Q=*`_NNY*X5K&}TO86Ck6Aa;slFd=(V zr);c{m)p@}jzg-vibiNvKpCkc)eCSZ!DJj@aT=k%GztjMBG70tKqS@Z!0DWisi5pVV^MW2392t={g!)x(cP7YD>c?9uz*b7@9M zwh1^yOMS|as3CzzjE^rmg)X6V<)rnAx7@GXJSKq3o}TN?SaBE!{}u-QGsL2F+m(2M zlBqnch1Eeikhw{D(Zk@HMB{uH~3oZtVrYYhM-E=UJ1o{c($nZm_g zT~Uomt~v+7ig@p`f(TDpXzY>Xn=!WbkL0p&n9GQzdr(sXOdos*&81pdt@$Jq^96)) zeB^MMRtNj-aGnZVyusgf!}q)(M^(R*z)mjW3+T>NL+^dw#V}YiFJ7Ommte41RZ7}R za-^oXD~H(TRiy#=rC8|)KH6X?a_^O{a#5*A^XC;31(Decv47fwksv?t&vOsmDk76X zeGsLxuV!+oWrvY2G*Z@%(mY{k%(tZq&&JPZP`Rs!b>CD+uwbkR?iP({9wkjp2*3I?bmh&X6y zUnVt~R9fay%w57hxk?O)R$X^JwQvu)KeIl0YVl_WQ}+ulsMf9uDKGe9S)aN_GP&t|gOmR}U42Z3lC>(>u<&8>{B10SyL7H@PU*Ibg?fQk=5PF4iHAjxP z=3`Vq?Q8)oTI7qgi%4Lw&vo@){-63+JsOQxX`c^&UGG}j0~TYI9NbKpUf{dx-z%HE z(huT9!K@aOyX(zA-u8v~BbP6r$jM~_~r&2(qKZ{Lruq<1I#9t4|Xg&cs*k-)uSd;c2@@NPn) zwBG4R?J1wgoCqDNU7z(PMs7MVACFbQ3P(WBKxLr_vMv}T+_H4^w7ei{!a;sw&Z{|5 z0g!DP*&DF+_jh(mez#lMzL@+X;hL|R=msYXmK`;`euVVl#D$`aD&nJ zhDSs9b1wCCGDE<*`UXO5pQoYW4n{gyOzl8NN1Y(k=;C}FY&7F|_(xwBBUq41$ki&h zOO8x(+9I`J(|?~PhPpTM6n_yZd6v-E0We)>bh&?e4y;J8`WaETe^F1oe${^Y=mT4?o9bOAj{Q{QwzRdrZ%LX=(H(p~(+V^8Xx=q7k>L?+pcCxn6$as%C#SNTD7kP;jeK7BJey z_yboey^Ed0e5$yZ_A7C#9V8S>=na4ph%Y4ItHlgdkus+YZ5_Gi-jyGgFkpLyEP2is z?CmF&#@FBEZ|WxfiMD)jRX?7rj^=J&=Nf%ivN~{8?~J{*Q+d9CaXy5nt*0jx_u%agBkFK}gBqTaqR`P1xU)}z&cKl87R`_+(N_*Q@T5-s!vLtscXP++ z7w!%>(i>1r#yBo4r5jbWh%VB*pw{zSUi)W4pDWwA^AO08$SVJfA%PsRTbmj?Sr}RWH&xP^Xz)YxUgznSNrpg3Paj1DQ=rQD8jD8~Ql$J!3E_KEd5TgKw3Y5l04>ex&ZlU+2 z9?1;X(TO0&QQt`nsn^VUMpHw{H$*4X?f0fMMOO~0m&qi4S!9GJ2h0)#IgfLPz_*Xg zh%#oZ@=PoeDZ{>AMT^oO;ncdrXr8f9A&~jWO=O`DL0yxvpWzf+l?f~>tH{gb6Bfku zg|WGk0myDNWAy-EtYbMHZ(8_JLZ3mIHJ?SH)_gRBYa$N+)WYRM-=w?-69Xji zK;39gBExx@-=@tTH2MY~eAgg=E~4H^nB{2KCPfyK)rBpv&ir#8>hL%OW@_|x=*E#} zs4+nyCoxAIz@KHvriMm3jQ`IxITa}m5k0kQFU!3LVCvgszkg^#07&>WZk=8WR--wS zq?~nn%=y-T^rEZ|CV#_#*c0~0CvMi}TnpH)XU1Z4*0i_BK3sue4HFY3jGM3mV?(LY zAOb}tf3hnr3!9oN+iQ-i!(`4t`ugdqs>BaQa%hr)Cc39C6Dx@K?fAL=Vv1y=YZgL) zs+yP_5F3H@)Kh|r3xdxQF)jj+4W3QFsqISr6x-$FY?4sn*5B1el_JqiNW4x_Kk5q# z`V9C`ls$4)pKO0E)(> zT(tn9c_i{I(+IWf@jT*QqZh%CNgUVp5>`lsCJ>;M{ep zI5O2ULxEROD5egG7DSHXA=0Zo?2&d9aA#OaICm5T**l2{ew?*+g*HxREL+gHeF(-s zYu93n#sW>~{TT$-a#)|c4Nm_#mI@IJ(IaH4!jBhAHhoKsZQRR!++TApx0K7dr(}l! zurr6j4g($UCPn9M^o;?SukJODiR;Hiiy0)k7U80S?TQc#FHGO_kC;^TK_j?C6${Pn zG9$toM3O$8ft(UD_O{Q@&rkTm8V}|1))scdlgcqFk0XF5<&VQ03(Yv^OV2Ct2_Q4Q z?daSZqbBv{9HbTEbQnqwlVYz%;j+pC7~TXVP3>30{X!NNnFDSpKO7*FPA#r=2cTunaiQ>n&9gwRt%s2X7&FFmNhJv$G ztfuLB_ncs2QS`{zy$F$ZM*O1*TN>I&B~r9b{m}rl(TqZyDUOB0J#+g2nu1u zGEzc8(xHj)`j8IgMd~C(L12-2eYqR?5VD263Fz%?_G=#dygc+E+5>P`I9fLn)Zv0Q z4gK2=Jj}qYj#rQ_k?I4$))N~_AFQG#(&a8K*Z37>RNu*ZL4#|#3(c$;CIulgr9%9J zQK9QrtHu(EfN(Dxo~oW+6O*G@9yY4FoIANxG5D59wb@tE=ymM+KpG5Qi>_#Mzo9GM zlNw}zb?e8 z)}eaGP@*$*BI6~yPTYo?^oER%QQ!!!D3>Mj%Sm^|t9+u{&gUY>n(c+O=m-5=k|kg^ zdabo25-6va@6JB~WCC#rJMwY-v=qt4^54tYFC;r}UN_F%W8wqq;_h4D=7luNc( z3fUz6=Y_34&~7{=CkN5@D_MMgZ8$OX68BwZ^KUeQ0U%M9tI-jPf7Ge$AysZ%FKnTw zju+?YnSA@kYysHR-RI%73Bp)_0)(&0znX5wh2VVu5U zEND!Rm2;#Wj50k8m15M>(w;+w1xg8dj*-5~1&$b5xm&AP&6glw(FdcvayY$5nI*nL zL!%WMr_xCIXEv5z%vCEtdKdPEeEVv?41%w{#z$Lh0Ou(C_&iI@VTMFi?Y~9aU$W>I z)?@hi9U9n?nYFRodq&%GCd9pb*j?kI9Q&TMY&FAw3(-y!!ZMA~1-LCi1)B`EDI*Co z4(S1o>Ls&_82Xy8M!z05fE8mv_kO|AO%VL_S#F5gGq zXfHzpPx1+kaJ!KoI<=`BEx-9h>5X2NKzW_aFRd|4gHOGQ)q(HOlSb6hC znUAxpe3$8Ya)V?_l6|>C1v0t6L7bXlui?%ijwz!(U0I&F!p1{*>jo zH%SExj$QA-IBn^V8?~FNq^QjWJ_8QEm6b&%R=x-CA@YEd^Sm~Ov^G7J1FCp{S%kU7 zFJ?7;IJQIn#4^0|pHzyTyFV1?t4tIZ9IxP)6w2~tC&W^^#qQ!Fx`ft!^vj;6=*Vpu z76$xodCCCaBc|rM*7$8)Ta=+Aq~1N{J9UY8rJ&W8>(*kh%Ogu#&Mnk6!U2;rFHmaF zr|PUhOPSNS(AqcLc$h7Sp@X&n8}P0GKa4v)FZiP0H|pf&ExRm-7dFqHvgS^c`iYrW zw|ZXkN4Ut1oJpw(zmji^X6%(I=iGKdKU4jlhfVF^rEISq_oSny=f2(#3r@B=20w%E z=uFDYZZlEtV$x%UAc_+<&(?0AsS-<x5!!TIX(C3Lu?K zwdA2?#>cz49MxLPz$ngAJO48MJaD3Khj_2nM$$S3hS)8>un4+I<%;b z1U(CYV+&N_d&s=++OlVT{aZ4Dt5>1^syCp58t1bVY`lgUK=w(j&pO!O)W7n+ni{CN zciCvh>q&`SGk%l!qq+0nZ)p69Im+aGSrwF~`;9Zr{6~loi!c8xL^Pe*waed6MK3-O z@U6)b0)+@oq8@W9k(=_y3F|k+{0EP#B++pPO=0~P*+`rOtT@3O(lJcn|HOhYM7(4> zo@WE@dG&Sc*^q?+bJ0(0VG5>L@bMKo3}j>+5i*S{-S8Ey7WN>4CeiuCp1+z&ZFl^u zP#;H*(qD_JuZExtcS0G(%xk|vvLo}lF5s&AZso&CYC_1)$Ic|a)yU%^DzEEK`RzIg zlP`V7pY-J(gs-2bROnlg1H`UZ7JYz=U6lUJr^!AypZFGQz-TGDwI-fNEgAS~cAef> zueDn9Sp1|j)XmXuom=Sh{0E45GeEkZ z0s;{Y|3L1Xe}M?Y8qLIi0};ai3y5$B0uewTLK5+h4*}p;&6HLo6T$%&eF1@pdbVY7 zB3M`+CGoZS7%Ol;6Gl_v9xK*xbr{--@Ys-^CG1Q+^#Nzz;+e*%(NSwx*?KB?lG`ox z6JJO(9T4uhDy~!nD`+-rmd#CGiyAKmTYWz*@krbTzLrc8i8_QBIkJO%^&ihQ;81m0 ze|(7F0Ewjk1w^O{1^z!kg!Df^1mSu<^#1@63nc$95E1t;AOZylM6?U9+8gnfZ~hyI zfc(Eegx`OB2*7^<5zAT6R>XSn4|K>OhMzi@8EAE)#opgD=rv82trgLIjoyhrf+>&w zM{=iDVJY{n+rpcy8>8g8sYEokbFjDTtm=HbZoKn&b5(3){q5xoYQzv+icsud!C9y* z4s7}waM|*`76CSWHR1pogv0$IRKNn9k3M%)07cqgZs9d?R!M3!H4OK(4a2I25!Xbz z5CkWj-n^A|%k-t)P3vFJzCx?d;US!}AWxeusbT1v(c-XL6=OsH;^XEG4wQs_Qhn)= zskXKIrLdjZOAXRaio8S;sVQa~OGk2VZVt{`qQG}~1(vH6nh%^wph69xm||;YWf0F?zDd?_kn*X_kerzPGHm5FmM>0!!nV(%c=CqxKHw+tEY2{ zf^k3aL4`sZO`#+Biti0&3mKxzrJ^k~s2<+e1w8je`U)g{ zQ4V^u2zg!-iaIVv9Tw|*&gaE0%Iwc1)I#vYJE0uUO_ku?CR$?K)R>UlJ)o-uTh(r{+9+Oe(ozR@OAnh6EKz(pOsQL9cTiU;fkMFJJ?G6V*<`615H52 zzb4?Xl(rTWlYkE{mp>-pF*vdO9}^JnM_>+yYA6MKi>>)LI{=JVt3Z9z!pH+ge!C*E z$RugkRws5r0PYkY)UX6gXvz5v4pp>qUEf@4iA%@kdHlVvLk`;kBp;4P{c!rs1K+%l zdVTJV@s0SMCf6q{s&KqoG`rGm_;r-yUos4lBO1AHg}l=cMbJ}$s1Yr2))Ailg@JHyc0tzgk>>Qt^w6dL8Hiz8rRAdi$xxQoqZT zjd5i75ZK`=NJmi&LPPF$2U8-A?++$KF1JjPeeNN9V+LEFsj=RYVBX9TjGd@8tS`DW zGSPEEelzz}Gozg>yq(2|nDgZxNI(GirxJUBAjRqVmk?5j92n4TgLC@c=W@ zbN+gO1+$d4x{M^=No(pATtV7T=(92~Zu2Y{ocxE&0QTV#qf3zzzP^G7 zpa*FB#{)D0nEuNHeAoI;sb&fE00Z?(i-8_sVvzb@4^U?PukDVI2)t|nsuAiZr|qev zQyST<-j3L;O&Zj@gz-xBj_cu(!F8`hGE5#;{IGodTe1fTWZhg;Fd2!GUwJ>up- z;7-Ihn`qj3Abl%M)4YHr(t3EN;(k{NBZd8Dq2GMEyvB7rkc$zH&-ia3-K zr#fUYX=#DqQ6q^$Q0a_&CF)Oq0AArJ82WcB{w1Q_fV=TbD?SbrQR9nE*%pB^A*Q|e zh*+=9pj%DmF^_KHSLDo;hc6a5GePoyG(fsP8lcs`HNel2k5znLVi`M4`(_l~DPyCO zf6<7s(Xhc9)>C}{5tv0`qf&t=TE*Tn>Fsq6_Ag?whd8VNUvNx+G3Y*}FjSvYVU@H{ zy+Qj!S@{A%8YmmwCU#qD2@GQBtpLjl%p!uM$D@a@4Z(KGnd9{{1WRx~8OQs1>%6LRzfsSTb`Id+4>V=A>$rS z5<#cQ(W(2YBi)&GgPU-GFnoKVZuP(Oj!1v=j)amjnVDP*0|U5LdOKJTW0Hp|v*&#q z?=#mT7KOXouT`*CZ)<)mTP(%8J-h~1{Z1d8^h=FBj!si*aP!V`TVy3`m?j3d9o=njB18k_H+||cU1}7WN1SvS{(^YK9(MPU$;X_GHMAD%Ny(5wfEC7FEnTGZ1W`UC8M zmGnxegx~2{l{tXP5uFLb1}z9p6pM`;cjwe`P3^{U3_V!^D}-Jr&I^`RUG;v=fBj=yu0N3HIvbCQ9#`{$KKk2M6M{NuqAi zS=vakzizs_^`zb-(a}fSOk0(R@w-uh1pZJIEOKEtRP{`4uRZ5GA&a=E~Dkn_JIc2tWU1A^R-%&b9PW zV9eX%Y}nY50Hx|u8F~iOpya?TfRiQ}uJ z*^sw|J;3AEJOP5gHWd8^|4!;0arxZ?@G$Ydq2oB)C?f0s?fCR!^Yh1v z_~$F~0|_-RZgZ$_^E&HcOL7#n{3MgHApv4{G50SgJcYD7aYJ|v2UnufI4zBoF6YxA(AC6V(}kf^k8sYxAAlr(kmD$(`|OmJWO5EnjJ zKtz?}qY42;ia~|@Ny}xD2ML9cp8i6dYnbnLE~RbXFLWu009JZ&k`ha3(Mwiae+h%h zqGw#T_Qe$6RqO_Vl5vn^`dZ>fYP;2Bhw>=8o%qU-bJh1!xC4nK7RT}plIlUvb?#Wh zcjwO}2$QcG^Aq;PDq;S#u&q7~bZ9Cyq~|j_g&~0TCv@j@(tSUtq~eBsA;6!}Let0y zXUe19NQ;I?gN>rbtFH&MQ2w3$v8lGZzSHcA@J+ApauuA5IiHW~&m`FX<3Rv-rm5D9 zz=McO11EAy=ZkH%&}|tL*$EH*+ym0feJ*nU9IRI2@f^A$lQon+%1;XMSKHER<`((3 z9e@Qn>6i)oxsk>zu=5!mH1KTP&l?_LY}lWeB8IWs`W1@c;*-`^Knt+aE8-IuA{FT| zC~iP7a69m~(o3zK2q5{3zpX*)kgt{pyU^$N%k_-eS_K9U3d&G{uwMt{E_){!O9bX< zi3T5D`ZN(fcD^5ddML)GJ6O5u5hgnz4HqK(LXao7dk38M2gDtkYJLOmVR#CsOv3VE zUYH-cS-)JzpGvP?GHDn~>I9m4V5L{7HAsNZz_N>)tT;KIyd0aZctJr1=HE&$l|y`- z4Pd30_1{XbVxt6)jY&%Ii!Zevpa(Rjf0kF@kO)Uub=i^90)gk!pa5t#Q#z|oczx}- zPj|eC9^WtBKoQe8ssjjTn2EQ(fE&wobnH#*Glx(12+0}x*N|!zIEQ{2j}ZesV#VP# zrC<*+l^lruYQR1UyBSI%sw`XA@58)910eXvh zUF%QhGs(xR$luOqOW1Da%O4*-X!9Ifz#!zG&gY41Q3Sdi1ox26vzxH2wm~eGdskPt zP5bV*r^aiKTYE)d<+Hypv>9*^{7v0OPWi7va30{+W9 z4S^vo16nkdreT&2qaW*qLL1}L)$k*dKNwOYJwKl9W%~G!PWCKA({J$Vb7#oos1Gb( zIb$)_OlfgyBo&yVOV|k;jL4OR`RxGwBpk&z7j{b)VF*1AqC=I$L6u}p!-yzeJbixS z7b<{Xe63)X4S6`se=DC07Px)^GtOTlwMJ}R?>O!M4NkjS?*11z?%d&`2(P9(ai2ccKYfE2u5u}2752(nQ& z5fVPmJ*}t$-RwM+kbz`E-P_n_#WrH8H73eLi``jwNHz$UQhWo`9x}W5)V>5Wlm_s| zOkB}hEa4V-q={S8&*%oKr8i=s3Pm=u5*ly0G3Zv^uz7YNX_RwxxO$%q{G`~h0BdEA zr{8$_T-wJNo%<)kDbd z!!K9T&P=a~(|nnLQPT)Ee)*nMM$mw}M6c2Ku5#u*mB#UdDawI#B52ELM^wo2Bn%mh zb2-clc<(mqt*n?7Lmyk0Hqc0N3)tTnUs0#tObWXY@j>7UeH1>@mxVR|c@J##`kC3F zvkxnq`O`GC1XkhptaO#Kiu@&P{?Lp!)w_N=mF1p&MYuqT8NlMvr)^7L1d|ZJ!h-fv zT9b$r(BG|oV(t6{Mo7EgMaGB;c7d!lZ04%dK-(q`(Z(7J|jsa7tG|~h^=C79miT$F|DLu`}#I5N^ zjOe|1zK$s}d@WvFOm&DO3V_xzW%%X~yM;pO?OodDs)7l8J4=)n5d+L)Aj zxW%LgA7NOfwXoAh^RkuO`B;oxyOUHK@zhid;|IO_CUEwP6S1oKqVpU7;si%Lnu7Zo zT%$dr1VK|ciW;|8DJIy{PsmdUhTDLnsn_lE6uyZ4*!8%nMklxl;nSZ^Xpd>7OsS;6 zW*GHVRWnLlFyICdAYe<@?vL|J0WKCPsaodzYw{~a;OH^WdDdg~Oc?p+&iy~LpLVom zsyMnnG?*1xrXl@PYLLfw;Ov*gJuO0qNA?*rnVEKW;O?uf3w#T{bh4A_r~Bg8ZDoE7 zDpD^s%Sv?_dV)c`c=#l_Dp3{(G7jKO$5EUM-bzz1KdAsXL(W=^oadMQ8lmJ{HeP<@ zF|m`LQ%FU`|kczg8a$F3ScB2 zIyQ7jKsHdWl)8N2P0wFC*l5CZ6c7L7Qu+)KVYDcVXX#b>Bm?B&E7RCsUEtEo)qouQ zqHH>`XorAaFf-&IHPEwz+YF?^d?!B_KX{F}QdkF}-h8&2Hb$Kken>Z`W{5h0FmU~$pMMpS*!AV1_ zZja(ssHkiF$=z6QcegDc)aT@rCg2#C{2hXSkMT5GNb+Uwu~4b&n}?a@eb4nsYdS-& zd9-g!j{W1?!^_kA4QU*SM~luHSL>!{H{(tx_N^=3e6bK_RJpQkVaEWWb+mhnj^Y-5 z>V*n+O-+4bhhj1bn@<}Ni_Dr&Q0r?Uk1N9|Z6bfbT)0hDkvw$8*z))71i+$EiVN)N zr_t)8_(k13A1X%LmxN-m1;C5__QdPFl~&2`$Au&62mYAho->w_g2x=d*yRGz)Q7GO zJlifn6&kcwNjI5H)mcJ0@uugKy!2mr{z6M}UE{0at)8@$-g}&KPuk7;77l;2q5a zg!wz!hemNJd}p4u&2*6SW7&@rPpwBgC!6^;_>{kx&41VxHnT_b0JDly2ES8Vn`Yqi zX>gJ@)HL*v+pDX;@!mwa1mEq?K93dMIiCSP_Rjx#NRd%FWlC8zV5|~|kU6y?xV!9V zu095|w!J&Lyw(1wo|0i1oz3Nh|0HAMtZ#Ds@hta#=^pj3s^*&_#LYiWAf4iW1r<|z ztf27#{|Y4nXFFgz(UH;8+0OP{_XC(kMEmFjK$d|1$s(ft$s+nn?i5ZWJN&2It0IXq zCO-iOSnlN}p}c9kjJjZZ$wwj-w?uKtFR^ibK||>EsQ2((`0+A9>#^D0LBc^C%`~YH zw&0w(sZAX{ckZS(RNV<^lzYw$sbzYlDfHjX)Yt0AgJ)TH%Y1q9dg(Hg@ZS6FkX4%s z(Jqf7#!}C>t(Bz_y7?tz@B8}ZG%EQ7)nCHo>wFWCFd2;W^xWdXVwH!y9X6Ejn&vqX zW3;ke69dAMhn#E5@)7xyhDU0x>F5jbzYzjxb=pVQAd1K8SitAU^cGl|#fXEAAj zUrqA)iZzOCFSoS7hOe$hhF+qe#7DmtlTj0@72;=$31TIx?Fc`Yw(%(5K`9fo;DXX{ zurGWUn?fpM8;x$mGZRmPc?D25Te0$*t2c&dTr?Qft&Qtz%OVH<#J-f7kal!fw|)aA zgF#{tk|n{8fZZiBlgSXfu_nShCVcBLd)SpG&!tFNlav>gxWj;*a`lM*wTavKs{53s z6M_?_p5B@7IHDV`v>}A5zv#dO0;WcCZqVN!MP^~hQu51|IKfwu`R>2+*}iTK$r=9S zOjXpm!hJCcY*;O9?TjNI%Awt_F=w~*W$#7y%ujMQ0uUBf5*e6v3lX`k8D>&z#{3|F zw%d<(1k=Ws(3f4=QyANY`>N!fpPt^E;95vcj~zcjy2d4$A+mB!7o^Z=Y@4pI%>Q)N2{ z#9~1XK0wjd--yd4ROxx<_L5tmFW^3L^exrhH&T@7qQ!%4*A&FKKXNq`2?>gy%Wb3&Hk|O2sphMpF?4&9CEK;M7L43i<{)&rwCz?vJ9Acx%?ibG z6yWswjxm!8IY-q3FLz7Sbs(9krPx5g9cI1*wljr51p_zol1-hd|BW6`Fs65lg*<$U z+ypNsoOo0m)_t%ytT1gaJVIaPje>WBJc3=wYfP86fsj5@!oUle4r_hYvh+x<3SpM) zhXJ;hFZA1De)9nFL?H+i*j_kxEiwEiF(4_F^2nInxh`gm?(PDn9_FEfI2y+DrihX@ z1Gv(Aj;KsCS+<=<_ciY&{s^Hh?e5v#Eg8T?S+G*DxNfn;2ClDkT0s!lZ^)mgMhe`WP|21LiADvL) z73DS%oVHg)KL8aSkDovL;rIv+BM$cF+vyyrM~xavHyED?7|1sff_kHVE%FTtWZ-Sr zEZANHaHsbhsdOgPn7>6x-I)zgd2v@Hf5B)tfMd<5(<8@PC^Rme*qhtxM+4z96z>L= z-1w!EMl=Kxc+p18fd^j&{{oC6YDEB}hzk5&6Hu%jNdrkqLJ;v+K%Efjf{DYG#O#Ke zZE54_8UjBNAR7?B7oH7QYFk)`i77ho4)^4Ome*UV*oTcmNZRn#^#Q<5&_4%G$obXs zkQQ2x47=D-*$H_Ex4#XH-DW^pDEC=GTQ(WRS3ffOJ|n z{GnT?AGN~nt$^3Oja0xndjsV~-SA5CAu0aNyp`bL(HIoUkFHU0kPGhCfeO?RrD0`m z7slb7@3U1}ia{$mT;wNZ1hxhYX2l=C_0yAJq`Zi@1GP_FwKXD8q!nV37?M8enIRg$Zf z^W;wQp%fsxQXx<4&S<`-?Kth@tfg+zt3tUG<%X8yisT!OOiO^=h+L!0QOrq?=uQ|G z_9)LBqSR%J>S>euf$lPoOYOjn4j*E zGV(%XHUsfhbf881n3a!fEWRhp@l#ZMJcyW#oMrt_<7|K^@WK!@m>huEPi6-SjMQ`G z$g0WqsQA0iik~`B>2Rz-Jxr6c|(k4UYW%i3FB?jgVXy2vZhC{ z7x)LN@TTIHw<9F1zbvB1ArJ%Y=#NaTf!FrB!QoR8`(v68TLcf)KR#`P##M!b*o2Ro z`VtGrAa0-8*w=|kqmLU{F@Jt=#8oq^Y&HDixCoX6o6Hi4`g0_82mfo|Yrdo!F8q6H zF9igE3g(V%gVjt;RyI2-S2^HQd$U(%ru%-B4oPXq*Rc?&vxJ$XUnTlo`kys^B$fOc zow3;)`r^1-Pm*t*FhWyqxrykV%ISTlxfQATn=x@pha zrn=0JZV6A4XQzuJQiWxERqJxx;726dHAaRkpqebF9IyPgp={Er*y(HY{QM4_=%zI? zHcCp)Ua5C~beX6*>EHxuH9h@Fux){Q;W2mqh|C+MncMKx zS}&^OfTyE0?_IP$ha{BEei25(Z&S#mmwsClz(2u@8AAbb*W9+jzPeHuHWpwg%{Q;RYF&0&lUed z4l$NnEL-3=Zc1A}YpRGuB=#}m5n3863dM?$+OZAX1VU`ed51{Eq7~DDYU<=y45Ugv zW_6t|w2J{n7&7g3FM_l3iL^Y9GRj~pEFJzicVnzufFGV11_zk_F7jr^P_ zv0-o3H+vGpwwEqTKuY5&?&}P097#ClcY(*^!8{IdFMm`SbEE4{gwe2&Qm1G=^_gv3 z*@@TQ-e1|NY}+nN^Tecq>l8cdDO_@ZQBu=>Ua&xOZ}X{j?057h(o@YxgkLS{KrAIZM0K zV-3?p@%jl5exS2x6@zvH$HGLT%V z1Z;MR`fd{`9q=a;qk(2Q;6OmhHpthUgXD6RqitY#>b`okSPm1TPyX`Qocp@!6Cw~JYp!Z?yo7Up( zuZb#Y76TrFK|V?FZx7+er4z3pP!9EDrs{89wT~&CYcR3&0Izh; z3AlWz0Q3QTpM_A0O}wY!-_i^6LTL|Qs?Ml;>eumN@=Z@(7{-L9(rd$dNZazz6R@5_ zJzYF&bh-r+2?G$#PTwQ2C$OO}OH1bnSFU{=^JtDB-Y-$V#KYaSm9gD9$2r6exkx3Y2(*HrDuI14~h z4GL(9jJGElODhrzq5rAdG7TR~9go8v0CUZUTboy?0qt$Yj=&IP$`aKIL~tt4BZavc z-*qC-jvk`dPPJ^Zd{O40`#X6tzmTV{qs=5)GfeO064oCDy}Vz130>#uJ@}F-*57K* z<2QuKIcvu0jrI-yynVY52{>)puRNo4vJpYu`p9{NTq2{kuI1nu^0Q6gyHCVvs&vzE z+2Y6#aJ7`s(xV_zI7ARJ2MpBGfcPK<>dB+wOX^~^_rseOWL~*I2vZDDDCjoipCnwl z2hwXp>@$3>ns(L1i)nI0;=!7f!%%IgX3L0=H}Ivc^M-nBu=TkvNW%b7frEJL+^jtW zKX{oL!>%l$RGqy6%eH2EN&4Q8Ae$i=US^Y38A9Wyaz@hskdX}Ahz|m9@X5Kp;4yBO zV{|0tbD6Rx&G*qiKWCb4qQ8#k@dRC*vu7}!G6B4VHXQ_HKWT)ZP8;M_CSf$ru+c9>|3YjhK3?Q+s}K2Oa(U< zHi_eTRJiVlGCxB=Y;p9n5C^0F7~t7M>e*nj1B#JpyP1=IcmO+^kcd@NF^MQwCMM@I z;E!tXdan*~jgpCoz#{zd43J`oqkz=7*^_r3dUlIO&mcwp_)MsHXZX!Vi5B~6|AnSA7UKQ|T&KKX z))bWq9`naiCgS67;l>t9--={0Ug(a@%Q17J&C9{cgD-AK$u*{@Bvmuc8$3VEJb3A#p7ABVMf&a zI=NZ+0ZcD6_2Bc8W$y;!I65>zQG9YTmB7O|0mlM9?A!rHfPh zlfQ@_H17P@1PR*mKSzYA*_)hP#Wtxy)rkis$GVXY+`Uq6Z6aroQ)|LjVSG;!c`ah* zC8a5*C;@cZy9mb@Qao*IfjK#D96v}ke?E#`EJuKHvLu?J+~pGt6kny}N$zpN4*h>=g7suA(b3B zSd>{dstu>sp|5<{At5 zbRt6kp19^!FL7*qBlTR~H zB4~hy4yXP;>Ixz2d@v=9!U!s(trff(`IS0lHYc4w{c2eN;t_&lCoW?&1?*R6~zp0DFV+S0XY z^9qCn#!JA_dWL?XYd+Vt+Ajs-JEW3D-yHCFwcp`bk(EPnayFMM0PI8ctRCcu#I?_( zs@5m$F48zl5%y4{Z)ufakS<7xQOXw+fo|Cc1&)p8=Y($b2OhlH*KyY{R8ls-P-Fn1 z!=8Wfww7_x`!Je)+C?Tq94)9&zP)+;m#QN3=sj2W)_R4}vZYh{ZEHHQk2rQsIZN1* zNXcqW(8NveB3-TYdX^P$xUUV9(&kM{jH-k& zl)<;FvTC;022+Gi7{Mkg%BlN`MpXdHzP?#rm>b3VPs@`yZ@RuRD{J{Rz81Puq{6VA zl7ra02@o(2hclV4PVZKuuS+yJmryjAp%NjqB2`MIhhLn9^MjN!bTOf$uN|$B*IpNBYFm)DOqulpvfGhn`8)Zfk;bKgkxc$V3?zsb_uh2 z3J}B0ilu18d|j<5NUfmb8s-CNKr9Q2|4Krq8x0)W@2^aE_vXUU)yII3mD%q%q7mh+ z?m*9L>pIsCI=Ieq5T~hDNFmQ=lrS~PVU#Fz_~(IFFWSA0;M$pM=dhC?4pQSI=YgE< zy@U=;L4zW>@2$wa<5QJXU3xj2*dcB5y8`Hw0Oons2iTwN7cq|i@tr6f2#68uf4`lA z68`_bo&H@3=y*BJ0pCiybA-ci*|V(98fYO`sCcZDlP`X|WYoC1;)E#KQnGNm)+9D8 z7j3>}laEYsT7hG=%V2~xLv>Aq{S zbMquz2h`duG)XZT`(G7eLyb3|?>b2z0sCOP>ssD+2)f+D5^7f#TPwIZYLMFNjle&n1&-6C^d=P?EW~;+gwG!Id zDTfAC$dMi|pe5*fFL}P;>*D};faJQk2Mo*Gy#!|)j#HAu{1_Eb=+p{q>Jz*XRQI}t zE$N?eK>YL+r5c7D_SraYtM0n#q3s!sMM~khV|iQt=tgp8Q&Jf>w3oS(thyZE<1EtHE9LmDosNn?}V`f?waH`Aji*#$>wtW!<|>R~(@EPw=& zT>?g09F>@@)NJ_~nC~iTTPQ?a0aACLGKVvU>9K<3*4p!{f>tS_ zpvvqW%!jWzj8M@M#mt*VGjzFLU6=Km*L%mi_XlCpmo_mSpl`

    eJmAHL*IqmQ?eVdhQm@%QX+$ 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

    4hlZiTM=D!R4udETFPaB4_ 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 MYxB6!M)<$~2YaxlJ^%m! diff --git a/storage/connect/mysql-test/connect/std_data/Mongo3.jar b/storage/connect/mysql-test/connect/std_data/Mongo3.jar index 21c6c2d10bdf50c4389f0aeb0dac75c36b0ed9ac..2850177a66899d799fb171f30727ed05b906ebfc 100644 GIT binary patch delta 41268 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 delta 41268 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 E|0ilnEdT%j diff --git a/storage/connect/mysql-test/connect/t/jdbc_postgresql.test b/storage/connect/mysql-test/connect/t/jdbc_postgresql.test index 1041ef468..8036f7102 100644 --- a/storage/connect/mysql-test/connect/t/jdbc_postgresql.test +++ b/storage/connect/mysql-test/connect/t/jdbc_postgresql.test @@ -3,25 +3,32 @@ # # This test is run against Postgresql driver # +eval SET GLOBAL connect_class_path='$MTR_SUITE_DIR/std_data/JavaWrappers.jar;C:/Jconnectors/postgresql-42.2.1.jar'; CREATE TABLE t2 ( command varchar(128) not null, number int(5) not null flag=1, message varchar(255) flag=2) -ENGINE=CONNECT TABLE_TYPE=JDBC CONNECTION='jdbc:postgresql://localhost/mtr' -OPTION_LIST='User=mtr,Password=mtr,Schema=public,Execsrc=1'; +ENGINE=CONNECT TABLE_TYPE=JDBC +CONNECTION='jdbc:postgresql://localhost/test?user=postgres&password=tinono' +OPTION_LIST='Execsrc=1'; +#CONNECTION='jdbc:postgresql://localhost/mtr' +#OPTION_LIST='User=mtr,Password=mtr,Schema=public,Execsrc=1'; SELECT * FROM t2 WHERE command='drop table employee'; SELECT * FROM t2 WHERE command = 'create table employee (id int not null, name varchar(32), title char(16), salary decimal(8,2))'; SELECT * FROM t2 WHERE command = "insert into employee values(4567,'Johnson', 'Engineer', 12560.50)"; CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JDBC CATFUNC=tables -CONNECTION='jdbc:postgresql://localhost/mtr' -OPTION_LIST='User=mtr,Password=mtr,Schema=public,Tabtype=TABLE,Maxres=10'; +CONNECTION='jdbc:postgresql://localhost/test?user=postgres&password=tinono' +OPTION_LIST='Tabtype=TABLE,Maxres=10'; +#CONNECTION='jdbc:postgresql://localhost/mtr' +#OPTION_LIST='User=mtr,Password=mtr,Schema=public,Tabtype=TABLE,Maxres=10'; SELECT * FROM t1; DROP TABLE t1; -CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JDBC CATFUNC=columns -CONNECTION='jdbc:postgresql://localhost/mtr' tabname=employee -OPTION_LIST='User=mtr,Password=mtr,Maxres=10'; +CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JDBC tabname=employee CATFUNC=columns +CONNECTION='jdbc:postgresql://localhost/test?user=postgres&password=tinono'; +#CONNECTION='jdbc:postgresql://localhost/mtr' tabname=employee; +#OPTION_LIST='User=mtr,Password=mtr,Maxres=10'; SELECT * FROM t1; DROP TABLE t1; @@ -30,14 +37,18 @@ DROP TABLE t1; # CREATE SERVER 'postgresql' FOREIGN DATA WRAPPER 'postgresql' OPTIONS ( HOST 'localhost', -DATABASE 'mtr', -USER 'mtr', -PASSWORD 'mtr', +DATABASE 'test', +USER 'postgres', +PASSWORD 'tinono', PORT 0, SOCKET '', OWNER 'root'); +#DATABASE 'mtr', +#USER 'mtr', +#PASSWORD 'mtr', -CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JDBC CONNECTION='postgresql/public.employee'; +CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JDBC +CONNECTION='postgresql/public.employee'; SELECT * FROM t1; INSERT INTO t1 VALUES(3126,'Smith', 'Clerk', 5230.00); UPDATE t1 SET salary = salary + 100.00; diff --git a/storage/connect/mysql-test/connect/t/jdbconn.inc b/storage/connect/mysql-test/connect/t/jdbconn.inc index 05122f519..81ec80c13 100644 --- a/storage/connect/mysql-test/connect/t/jdbconn.inc +++ b/storage/connect/mysql-test/connect/t/jdbconn.inc @@ -22,10 +22,11 @@ DROP TABLE t1; # 1 - The current directory. # 2 - The paths of the connect_class_path global variable. # 3 - The paths of the CLASSPATH environment variable. -# In this test we use an executable jar file that contains all what is needed. -eval SET GLOBAL connect_class_path='$MTR_SUITE_DIR/std_data/JdbcMariaDB.jar'; +# In this test we use an executable jar file that contains all the eisting wrappers. +#eval SET GLOBAL connect_class_path='$MTR_SUITE_DIR/std_data/JdbcMariaDB.jar'; +eval SET GLOBAL connect_class_path='$MTR_SUITE_DIR/std_data/JavaWrappers.jar'; -# Paths to the JDK classes and to the MySQL and MariaDB drivers can be defined in the CLASSPATH environment variable +# Paths to the JDK classes and to the JDBC drivers should be defined in the CLASSPATH environment variable #CREATE FUNCTION envar RETURNS STRING SONAME 'ha_connect.dll'; #SELECT envar('CLASSPATH'); diff --git a/storage/connect/mysql-test/connect/t/json_udf.test b/storage/connect/mysql-test/connect/t/json_udf.test index 35dbbfed7..d45131f32 100644 --- a/storage/connect/mysql-test/connect/t/json_udf.test +++ b/storage/connect/mysql-test/connect/t/json_udf.test @@ -29,12 +29,12 @@ SELECT Json_Make_Array(Json_Make_Array(56, 3.1416, 'foo'), TRUE); --error ER_CANT_INITIALIZE_UDF SELECT Json_Array_Add(Json_Make_Array(56, 3.1416, 'foo', NULL)) Array; SELECT Json_Array_Add(Json_Make_Array(56, 3.1416, 'foo', NULL), 'One more') Array; ---error ER_CANT_INITIALIZE_UDF +#--error ER_CANT_INITIALIZE_UDF SELECT Json_Array_Add(JsonValue('one value'), 'One more'); ---error ER_CANT_INITIALIZE_UDF +#--error ER_CANT_INITIALIZE_UDF SELECT Json_Array_Add('one value', 'One more'); SELECT Json_Array_Add('one value' json_, 'One more'); ---error ER_CANT_INITIALIZE_UDF +#--error ER_CANT_INITIALIZE_UDF SELECT Json_Array_Add(5 json_, 'One more'); SELECT Json_Array_Add('[5,3,8,7,9]' json_, 4, 0); SELECT Json_Array_Add('[5,3,8,7,9]' json_, 4, 2) Array; diff --git a/storage/connect/mysql-test/connect/t/mongo.inc b/storage/connect/mysql-test/connect/t/mongo.inc index 2d7cbcfa8..fab2ca841 100644 --- a/storage/connect/mysql-test/connect/t/mongo.inc +++ b/storage/connect/mysql-test/connect/t/mongo.inc @@ -1,3 +1,3 @@ -let $MONGO= C:/PROGRA~1/MongoDB/Server/3.4/bin/mongo; -let $MONGOIMPORT= C:/PROGRA~1/MongoDB/Server/3.4/bin/mongoimport; +let $MONGO= C:/Applic/MongoDB/Server/3.6/bin/mongo; +let $MONGOIMPORT= C:/Applic/MongoDB/Server/3.6/bin/mongoimport; diff --git a/storage/connect/mysql-test/connect/t/mongo_test.inc b/storage/connect/mysql-test/connect/t/mongo_test.inc index dfc223e90..357fa5524 100644 --- a/storage/connect/mysql-test/connect/t/mongo_test.inc +++ b/storage/connect/mysql-test/connect/t/mongo_test.inc @@ -1,4 +1,4 @@ -#set connect_enable_mongo=1; +set connect_enable_mongo=1; --echo # --echo # Test the MONGO table type @@ -130,7 +130,9 @@ DROP TABLE t1; --echo # --echo # try CRUD operations --echo # +--disable_query_log --exec $MONGO --eval "db.testcoll.drop()" --quiet +--enable_query_log eval CREATE TABLE t1 (_id INT(4) NOT NULL, msg CHAR(64)) ENGINE=CONNECT TABLE_TYPE=$TYPE TABNAME='testcoll' OPTION_LIST='Driver=$DRV,Version=$VERS' $CONN; @@ -147,7 +149,9 @@ DROP TABLE t1; --echo # --echo # List states whose population is equal or more than 10 millions --echo # +--disable_query_log --exec $MONGO --eval "db.cities.drop()" --quiet +--enable_query_log --exec $MONGOIMPORT --quiet $MTR_SUITE_DIR/std_data/cities.json eval CREATE TABLE t1 ( _id char(5) NOT NULL, @@ -204,4 +208,4 @@ SELECT * FROM t1; DROP TABLE t1; --exec $MONGO --eval "db.testcoll.drop()" --quiet -#set connect_enable_mongo=0; +set connect_enable_mongo=0; diff --git a/storage/connect/mysql-test/connect/t/tbl_thread.test b/storage/connect/mysql-test/connect/t/tbl_thread.test index 68a0ebcd4..05409c695 100644 --- a/storage/connect/mysql-test/connect/t/tbl_thread.test +++ b/storage/connect/mysql-test/connect/t/tbl_thread.test @@ -56,7 +56,7 @@ SELECT * FROM t5; eval CREATE TABLE total (a int, b char(10)) ENGINE=CONNECT TABLE_TYPE=TBL TABLE_LIST='t1,t2,t3,t4,t5' OPTION_LIST='thread=yes,port=$PORT'; -set connect_xtrace=1; +set connect_xtrace=96; SELECT * FROM total order by a desc; set connect_xtrace=0; @@ -85,7 +85,7 @@ SELECT * FROM t2; --replace_result $PORT PORT --eval CREATE TABLE total (v BIGINT(20) UNSIGNED NOT NULL) ENGINE=CONNECT TABLE_TYPE=TBL TABLE_LIST='t1,t2' OPTION_LIST='thread=yes,port=$PORT'; -set connect_xtrace=1; +set connect_xtrace=96; SELECT * FROM total order by v desc; set connect_xtrace=0; DROP TABLE t1,t2,total; @@ -101,7 +101,7 @@ SELECT * FROM t2; --replace_result $PORT PORT --eval CREATE TABLE total (v BIGINT(20) UNSIGNED NOT NULL) ENGINE=CONNECT TABLE_TYPE=TBL TABLE_LIST='t1,t2' OPTION_LIST='thread=yes,port=$PORT'; -set connect_xtrace=1; +set connect_xtrace=96; SELECT * FROM total order by v desc; set connect_xtrace=0; diff --git a/storage/connect/mysql-test/connect/t/vcol.test b/storage/connect/mysql-test/connect/t/vcol.test new file mode 100644 index 000000000..88b822102 --- /dev/null +++ b/storage/connect/mysql-test/connect/t/vcol.test @@ -0,0 +1,31 @@ +let datadir= `select @@datadir`; +--copy_file $MTR_SUITE_DIR/std_data/boys.txt $datadir/test/boys.txt + +create table t1 ( + #linenum int(6) not null default 0 special=rowid, + name char(12) not null, + city char(11) not null, + birth date not null date_format='DD/MM/YYYY', + hired date not null date_format='DD/MM/YYYY' flag=36, + agehired int(3) as (floor(datediff(hired,birth)/365.25)) + ) +engine=CONNECT table_type=FIX file_name='boys.txt' mapped=YES lrecl=47 ending=1; +select * from t1; +drop table t1; + +--error ER_KEY_BASED_ON_GENERATED_VIRTUAL_COLUMN +create table t1 ( + #linenum int(6) not null default 0 special=rowid, + name char(12) not null, + city char(11) not null, + birth date not null date_format='DD/MM/YYYY', + hired date not null date_format='DD/MM/YYYY' flag=36, + agehired int(3) as (floor(datediff(hired,birth)/365.25)), + index (agehired) + ) +engine=CONNECT table_type=FIX file_name='boys.txt' mapped=YES lrecl=47 ending=1; + +# +# Clean up +# +--remove_file $datadir/test/boys.txt diff --git a/storage/connect/odbconn.cpp b/storage/connect/odbconn.cpp index 70a0a6a14..f7b1a43a9 100644 --- a/storage/connect/odbconn.cpp +++ b/storage/connect/odbconn.cpp @@ -137,10 +137,10 @@ int TranslateSQLType(int stp, int prec, int& len, char& v, bool& w) case SQL_WLONGVARCHAR: // (-10) w = true; case SQL_LONGVARCHAR: // (-1) - if (GetTypeConv() == TPC_YES) { + if (GetTypeConv() == TPC_YES || GetTypeConv() == TPC_FORCE) { v = 'V'; type = TYPE_STRING; - len = MY_MIN(abs(len), GetConvSize()); + len = (len) ? MY_MIN(abs(len), GetConvSize()) : GetConvSize(); } else type = TYPE_ERROR; @@ -190,12 +190,23 @@ int TranslateSQLType(int stp, int prec, int& len, char& v, bool& w) case SQL_BIGINT: // (-5) type = TYPE_BIGINT; break; - case SQL_UNKNOWN_TYPE: // 0 case SQL_BINARY: // (-2) case SQL_VARBINARY: // (-3) case SQL_LONGVARBINARY: // (-4) - case SQL_GUID: // (-11) - default: + if (GetTypeConv() == TPC_FORCE) { + v = 'V'; + type = TYPE_STRING; + len = (len) ? MY_MIN(abs(len), GetConvSize()) : GetConvSize(); + } else + type = TYPE_ERROR; + + break; + case SQL_GUID: // (-11) + type = TYPE_STRING; + len = 36; + break; + case SQL_UNKNOWN_TYPE: // 0 + default: type = TYPE_ERROR; len = 0; } // endswitch type @@ -364,7 +375,7 @@ PQRYRES ODBCColumns(PGLOBAL g, PCSZ dsn, PCSZ db, PCSZ table, length[11] = 255; } // endif ocp - if (trace) + if (trace(1)) htrc("ODBCColumns: max=%d len=%d,%d,%d,%d\n", maxres, length[0], length[1], length[2], length[3]); @@ -381,7 +392,7 @@ PQRYRES ODBCColumns(PGLOBAL g, PCSZ dsn, PCSZ db, PCSZ table, if (info || !qrp) // Info table return qrp; - if (trace) + if (trace(1)) htrc("Getting col results ncol=%d\n", qrp->Nbcol); if (!(cap = AllocCatInfo(g, CAT_COL, db, table, qrp))) @@ -396,7 +407,7 @@ PQRYRES ODBCColumns(PGLOBAL g, PCSZ dsn, PCSZ db, PCSZ table, qrp->Nblin = n; // ResetNullValues(cap); - if (trace) + if (trace(1)) htrc("Columns: NBCOL=%d NBLIN=%d\n", qrp->Nbcol, qrp->Nblin); } else @@ -536,7 +547,7 @@ PQRYRES ODBCDrivers(PGLOBAL g, int maxres, bool info) } else maxres = 0; - if (trace) + if (trace(1)) htrc("ODBCDrivers: max=%d len=%d\n", maxres, length[0]); /************************************************************************/ @@ -593,7 +604,7 @@ PQRYRES ODBCDataSources(PGLOBAL g, int maxres, bool info) maxres = 0; } // endif info - if (trace) + if (trace(1)) htrc("ODBCDataSources: max=%d len=%d\n", maxres, length[0]); /************************************************************************/ @@ -666,7 +677,7 @@ PQRYRES ODBCTables(PGLOBAL g, PCSZ dsn, PCSZ db, PCSZ tabpat, PCSZ tabtyp, length[4] = 255; } // endif info - if (trace) + if (trace(1)) htrc("ODBCTables: max=%d len=%d,%d\n", maxres, length[0], length[1]); /************************************************************************/ @@ -687,7 +698,7 @@ PQRYRES ODBCTables(PGLOBAL g, PCSZ dsn, PCSZ db, PCSZ tabpat, PCSZ tabtyp, cap->Pat = tabtyp; - if (trace) + if (trace(1)) htrc("Getting table results ncol=%d\n", cap->Qrp->Nbcol); /************************************************************************/ @@ -697,7 +708,7 @@ PQRYRES ODBCTables(PGLOBAL g, PCSZ dsn, PCSZ db, PCSZ tabpat, PCSZ tabtyp, qrp->Nblin = n; // ResetNullValues(cap); - if (trace) + if (trace(1)) htrc("Tables: NBCOL=%d NBLIN=%d\n", qrp->Nbcol, qrp->Nblin); } else @@ -755,7 +766,7 @@ PQRYRES ODBCPrimaryKeys(PGLOBAL g, ODBConn *op, char *dsn, char *table) n = ocp->GetMaxValue(SQL_MAX_COLUMN_NAME_LEN); length[3] = (n) ? (n + 1) : 128; - if (trace) + if (trace(1)) htrc("ODBCPrimaryKeys: max=%d len=%d,%d,%d\n", maxres, length[0], length[1], length[2]); @@ -765,7 +776,7 @@ PQRYRES ODBCPrimaryKeys(PGLOBAL g, ODBConn *op, char *dsn, char *table) qrp = PlgAllocResult(g, ncol, maxres, IDS_PKEY, buftyp, NULL, length, false, true); - if (trace) + if (trace(1)) htrc("Getting pkey results ncol=%d\n", qrp->Nbcol); cap = AllocCatInfo(g, CAT_KEY, NULL, table, qrp); @@ -777,7 +788,7 @@ PQRYRES ODBCPrimaryKeys(PGLOBAL g, ODBConn *op, char *dsn, char *table) qrp->Nblin = n; // ResetNullValues(cap); - if (trace) + if (trace(1)) htrc("PrimaryKeys: NBCOL=%d NBLIN=%d\n", qrp->Nbcol, qrp->Nblin); } else @@ -838,7 +849,7 @@ PQRYRES ODBCStatistics(PGLOBAL g, ODBConn *op, char *dsn, char *pat, n = ocp->GetMaxValue(SQL_MAX_COLUMN_NAME_LEN); length[7] = (n) ? (n + 1) : 128; - if (trace) + if (trace(1)) htrc("SemStatistics: max=%d pat=%s\n", maxres, SVP(pat)); /************************************************************************/ @@ -847,7 +858,7 @@ PQRYRES ODBCStatistics(PGLOBAL g, ODBConn *op, char *dsn, char *pat, qrp = PlgAllocResult(g, ncol, maxres, IDS_STAT, buftyp, NULL, length, false, true); - if (trace) + if (trace(1)) htrc("Getting stat results ncol=%d\n", qrp->Nbcol); cap = AllocCatInfo(g, CAT_STAT, NULL, pat, qrp); @@ -861,7 +872,7 @@ PQRYRES ODBCStatistics(PGLOBAL g, ODBConn *op, char *dsn, char *pat, qrp->Nblin = n; // ResetNullValues(cap); - if (trace) + if (trace(1)) htrc("Statistics: NBCOL=%d NBLIN=%d\n", qrp->Nbcol, qrp->Nblin); } else @@ -918,7 +929,7 @@ bool DBX::BuildErrorMessage(ODBConn* pdb, HSTMT hstmt) && strcmp((char*)state, "00000"); i++) { m_ErrMsg[i] = (PSZ)PlugDup(g, (char*)msg); - if (trace) + if (trace(1)) htrc("%s: %s, Native=%d\n", state, msg, native); rc = SQLError(pdb->m_henv, pdb->m_hdbc, hstmt, state, @@ -932,7 +943,7 @@ bool DBX::BuildErrorMessage(ODBConn* pdb, HSTMT hstmt) MSG(BAD_HANDLE_VAL)); m_ErrMsg[0] = (PSZ)PlugDup(g, (char*)msg); - if (trace) + if (trace(1)) htrc("%s: rc=%hd\n", SVP(m_ErrMsg[0]), m_RC); return true; @@ -941,7 +952,7 @@ bool DBX::BuildErrorMessage(ODBConn* pdb, HSTMT hstmt) } else m_ErrMsg[0] = "No connexion address provided"; - if (trace) + if (trace(1)) htrc("%s: rc=%hd (%s)\n", SVP(m_Msg), m_RC, SVP(m_ErrMsg[0])); return true; @@ -1004,7 +1015,7 @@ bool ODBConn::Check(RETCODE rc) { switch (rc) { case SQL_SUCCESS_WITH_INFO: - if (trace) { + if (trace(1)) { DBX x(rc); if (x.BuildErrorMessage(this, m_hstmt)) @@ -1223,7 +1234,7 @@ void ODBConn::AllocConnect(DWORD Options) if ((signed)m_LoginTimeout >= 0) { rc = SQLSetConnectOption(m_hdbc, SQL_LOGIN_TIMEOUT, m_LoginTimeout); - if (trace && rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) + if (trace(1) && rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) htrc("Warning: Failure setting login timeout\n"); } // endif Timeout @@ -1231,7 +1242,7 @@ void ODBConn::AllocConnect(DWORD Options) if (!m_Updatable) { rc = SQLSetConnectOption(m_hdbc, SQL_ACCESS_MODE, SQL_MODE_READ_ONLY); - if (trace && rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) + if (trace(1) && rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) htrc("Warning: Failure setting read only access mode\n"); } // endif @@ -1385,7 +1396,7 @@ void ODBConn::GetConnectInfo() else m_Updatable = false; - if (trace) + if (trace(1)) htrc("Warning: data source is readonly\n"); } else // Make data source is !Updatable @@ -1397,7 +1408,7 @@ void ODBConn::GetConnectInfo() rc = SQLGetInfo(m_hdbc, SQL_IDENTIFIER_QUOTE_CHAR, m_IDQuoteChar, sizeof(m_IDQuoteChar), &nResult); - if (trace) + if (trace(1)) htrc("DBMS: %s, Version: %s, rc=%d\n", GetStringInfo(SQL_DBMS_NAME), GetStringInfo(SQL_DBMS_VER), rc); @@ -1447,7 +1458,7 @@ int ODBConn::ExecDirectSQL(char *sql, ODBCCOL *tocols) OnSetOptions(hstmt); b = true; - if (trace) + if (trace(1)) htrc("ExecDirect hstmt=%p %.256s\n", hstmt, sql); if (m_Tdb->Srcdef) { @@ -1510,7 +1521,7 @@ int ODBConn::ExecDirectSQL(char *sql, ODBCCOL *tocols) ThrowDBX(m_G->Message); } // endif tp - if (trace) + if (trace(1)) htrc("Binding col=%u type=%d buf=%p len=%d slen=%p\n", n, tp, buffer, len, colp->GetStrLen()); @@ -1523,7 +1534,7 @@ int ODBConn::ExecDirectSQL(char *sql, ODBCCOL *tocols) } // endif pcol } catch(DBX *x) { - if (trace) + if (trace(1)) for (int i = 0; i < MAX_NUM_OF_MSG && x->m_ErrMsg[i]; i++) htrc(x->m_ErrMsg[i]); @@ -1569,7 +1580,7 @@ int ODBConn::GetResultSize(char *sql, ODBCCOL *colp) } catch(DBX *x) { strcpy(m_G->Message, x->GetErrorMessage(0)); - if (trace) + if (trace(1)) for (int i = 0; i < MAX_NUM_OF_MSG && x->m_ErrMsg[i]; i++) htrc(x->m_ErrMsg[i]); @@ -1610,7 +1621,7 @@ int ODBConn::Fetch(int pos) } // endif m_RowsetSize // } while (rc == SQL_STILL_EXECUTING); - if (trace > 1) + if (trace(2)) htrc("Fetch: hstmt=%p RowseSize=%d rc=%d\n", m_hstmt, m_RowsetSize, rc); @@ -1626,7 +1637,7 @@ int ODBConn::Fetch(int pos) m_Fetch++; m_Rows += irc; } catch(DBX *x) { - if (trace) + if (trace(1)) for (int i = 0; i < MAX_NUM_OF_MSG && x->m_ErrMsg[i]; i++) htrc(x->m_ErrMsg[i]); @@ -1662,7 +1673,7 @@ int ODBConn::PrepareSQL(char *sql) m_Transact = true; } catch(DBX *x) { - if (trace) + if (trace(1)) for (int i = 0; i < MAX_NUM_OF_MSG && x->m_ErrMsg[i]; i++) htrc(x->m_ErrMsg[i]); @@ -1693,7 +1704,7 @@ int ODBConn::PrepareSQL(char *sql) OnSetOptions(hstmt); b = true; - if (trace) + if (trace(1)) htrc("Prepare hstmt=%p %.64s\n", hstmt, sql); do { @@ -1708,7 +1719,7 @@ int ODBConn::PrepareSQL(char *sql) } while (rc == SQL_STILL_EXECUTING); } catch(DBX *x) { - if (trace) + if (trace(1)) for (int i = 0; i < MAX_NUM_OF_MSG && x->m_ErrMsg[i]; i++) htrc(x->m_ErrMsg[i]); @@ -1881,7 +1892,7 @@ bool ODBConn::ExecSQLcommand(char *sql) OnSetOptions(hstmt); b = true; - if (trace) + if (trace(1)) htrc("ExecSQLcommand hstmt=%p %.64s\n", hstmt, sql); // Proceed with command execution @@ -1908,7 +1919,7 @@ bool ODBConn::ExecSQLcommand(char *sql) } // endif ncol } catch(DBX *x) { - if (trace) + if (trace(1)) for (int i = 0; i < MAX_NUM_OF_MSG && x->m_ErrMsg[i]; i++) htrc(x->m_ErrMsg[i]); @@ -2250,10 +2261,10 @@ class SQLQualifiedName return (SQLCHAR *) (m_part[i].length ? m_part[i].str : NULL); } // end of ptr - size_t length(uint i) + SQLSMALLINT length(uint i) { DBUG_ASSERT(i < max_parts); - return m_part[i].length; + return (SQLSMALLINT)m_part[i].length; } // end of length }; // end of class SQLQualifiedName @@ -2394,7 +2405,7 @@ int ODBConn::GetCatInfo(CATPARM *cap) if ((rc = SQLFetch(hstmt)) == SQL_NO_DATA_FOUND) break; else if (rc != SQL_SUCCESS) { - if (trace > 1 || (trace && rc != SQL_SUCCESS_WITH_INFO)) { + if (trace(2) || (trace(1) && rc != SQL_SUCCESS_WITH_INFO)) { UCHAR msg[SQL_MAX_MESSAGE_LENGTH + 1]; UCHAR state[SQL_SQLSTATE_SIZE + 1]; RETCODE erc; @@ -2427,7 +2438,7 @@ int ODBConn::GetCatInfo(CATPARM *cap) else if (vlen[n] == SQL_NULL_DATA) pval[n]->SetNull(true); else if (crp->Type == TYPE_STRING/* && vlen[n] != SQL_NULL_DATA*/) - pval[n]->SetValue_char(pbuf[n], vlen[n]); + pval[n]->SetValue_char(pbuf[n], (int)vlen[n]); else pval[n]->SetNull(false); @@ -2466,7 +2477,7 @@ int ODBConn::GetCatInfo(CATPARM *cap) irc = (int)crow; } catch(DBX *x) { - if (trace) + if (trace(1)) for (int i = 0; i < MAX_NUM_OF_MSG && x->m_ErrMsg[i]; i++) htrc(x->m_ErrMsg[i]); @@ -2605,12 +2616,12 @@ void ODBConn::Close() rc = SQLDisconnect(m_hdbc); - if (trace && rc != SQL_SUCCESS) + if (trace(1) && rc != SQL_SUCCESS) htrc("Error: SQLDisconnect rc=%d\n", rc); rc = SQLFreeConnect(m_hdbc); - if (trace && rc != SQL_SUCCESS) + if (trace(1) && rc != SQL_SUCCESS) htrc("Error: SQLFreeConnect rc=%d\n", rc); m_hdbc = SQL_NULL_HDBC; @@ -2619,7 +2630,7 @@ void ODBConn::Close() if (m_henv != SQL_NULL_HENV) { rc = SQLFreeEnv(m_henv); - if (trace && rc != SQL_SUCCESS) // Nothing we can do + if (trace(1) && rc != SQL_SUCCESS) // Nothing we can do htrc("Error: SQLFreeEnv failure ignored in Close\n"); m_henv = SQL_NULL_HENV; diff --git a/storage/connect/plgdbsem.h b/storage/connect/plgdbsem.h index 6a0a8be8f..5446e0d2a 100644 --- a/storage/connect/plgdbsem.h +++ b/storage/connect/plgdbsem.h @@ -362,7 +362,8 @@ enum COLUSE {U_P = 0x01, /* the projection list. */ U_IS_NULL = 0x80, /* The column has a null value */ U_SPECIAL = 0x100, /* The column is special */ U_UNSIGNED = 0x200, /* The column type is unsigned */ - U_ZEROFILL = 0x400}; /* The column is zero filled */ + U_ZEROFILL = 0x400, /* The column is zero filled */ + U_UUID = 0x800}; /* The column is a UUID */ /***********************************************************************/ /* DB description class and block pointer definitions. */ diff --git a/storage/connect/plgdbutl.cpp b/storage/connect/plgdbutl.cpp index f669d6446..e296553d8 100644 --- a/storage/connect/plgdbutl.cpp +++ b/storage/connect/plgdbutl.cpp @@ -1,11 +1,11 @@ /********** PlgDBUtl Fpe C++ Program Source Code File (.CPP) ***********/ /* PROGRAM NAME: PLGDBUTL */ /* ------------- */ -/* Version 4.0 */ +/* Version 4.1 */ /* */ /* COPYRIGHT: */ /* ---------- */ -/* (C) Copyright to the author Olivier BERTRAND 1998-2017 */ +/* (C) Copyright to the author Olivier BERTRAND 1998-2018 */ /* */ /* WHAT THIS PROGRAM DOES: */ /* ----------------------- */ @@ -215,35 +215,13 @@ int global_open(GLOBAL *g, int msgid, const char *path, int flags, int mode) } DllExport void SetTrc(void) - { +{ // If tracing is on, debug must be initialized. debug = pfile; - } // end of SetTrc - -#if 0 -/**************************************************************************/ -/* Tracing output function. */ -/**************************************************************************/ -void ptrc(char const *fmt, ...) - { - va_list ap; - va_start (ap, fmt); - -// if (trace == 0 || (trace == 1 && !pfile) || !fmt) -// printf("In %s wrong trace=%d pfile=%p fmt=%p\n", -// __FILE__, trace, pfile, fmt); - - if (trace == 1) - vfprintf(pfile, fmt, ap); - else - vprintf(fmt, ap); - - va_end (ap); - } // end of ptrc -#endif // 0 +} // end of SetTrc /**************************************************************************/ -/* Allocate the result structure that will contain result data. */ +/* SubAllocate the result structure that will contain result data. */ /**************************************************************************/ PQRYRES PlgAllocResult(PGLOBAL g, int ncol, int maxres, int ids, int *buftyp, XFLD *fldtyp, @@ -307,7 +285,7 @@ PQRYRES PlgAllocResult(PGLOBAL g, int ncol, int maxres, int ids, else crp->Kdata = NULL; - if (trace) + if (trace(1)) htrc("Column(%d) %s type=%d len=%d value=%p\n", crp->Ncol, crp->Name, crp->Type, crp->Length, crp->Kdata); @@ -475,7 +453,7 @@ bool PlugEvalLike(PGLOBAL g, LPCSTR strg, LPCSTR pat, bool ci) char *tp, *sp; bool b; - if (trace) + if (trace(2)) htrc("LIKE: strg='%s' pattern='%s'\n", strg, pat); if (ci) { /* Case insensitive test */ @@ -541,10 +519,10 @@ bool EvalLikePattern(LPCSTR sp, LPCSTR tp) { LPSTR p; char c; - int n; + ssize_t n; bool b, t = false; - if (trace) + if (trace(2)) htrc("Eval Like: sp=%s tp=%s\n", (sp) ? sp : "Null", (tp) ? tp : "Null"); @@ -582,7 +560,7 @@ bool EvalLikePattern(LPCSTR sp, LPCSTR tp) else n = strlen(tp); /* Get length of pattern head */ - if (trace) + if (trace(2)) htrc(" testing: t=%d sp=%s tp=%s p=%p\n", t, sp, tp, p); if (n > (signed)strlen(sp)) /* If head is longer than strg */ @@ -628,7 +606,7 @@ bool EvalLikePattern(LPCSTR sp, LPCSTR tp) b = !strcmp(sp, tp); } /* endif p */ - if (trace) + if (trace(2)) htrc(" done: b=%d n=%d sp=%s tp=%s\n", b, n, (sp) ? sp : "Null", tp); @@ -668,7 +646,7 @@ char *MakeEscape(PGLOBAL g, char* str, char q) /***********************************************************************/ void PlugConvertConstant(PGLOBAL g, void* & value, short& type) { - if (trace) + if (trace(1)) htrc("PlugConvertConstant: value=%p type=%hd\n", value, type); if (type != TYPE_XOBJECT) { @@ -688,7 +666,7 @@ PDTP MakeDateFormat(PGLOBAL g, PCSZ dfmt, bool in, bool out, int flag) int rc; PDTP pdp = (PDTP)PlugSubAlloc(g, NULL, sizeof(DATPAR)); - if (trace) + if (trace(1)) htrc("MakeDateFormat: dfmt=%s\n", dfmt); memset(pdp, 0, sizeof(DATPAR)); @@ -711,7 +689,7 @@ PDTP MakeDateFormat(PGLOBAL g, PCSZ dfmt, bool in, bool out, int flag) rc = fmdflex(pdp); pthread_mutex_unlock(&parmut); - if (trace) + if (trace(1)) htrc("Done: in=%s out=%s rc=%d\n", SVP(pdp->InFmt), SVP(pdp->OutFmt), rc); return pdp; @@ -733,7 +711,7 @@ int ExtractDate(char *dts, PDTP pdp, int defy, int val[6]) else // assume standard MySQL date format fmt = "%4d-%2d-%2d %2d:%2d:%2d"; - if (trace > 1) + if (trace(2)) htrc("ExtractDate: dts=%s fmt=%s defy=%d\n", dts, fmt, defy); // Set default values for time only use @@ -816,7 +794,7 @@ int ExtractDate(char *dts, PDTP pdp, int defy, int val[6]) } // endfor i - if (trace > 1) + if (trace(2)) htrc("numval=%d val=(%d,%d,%d,%d,%d,%d)\n", numval, val[0], val[1], val[2], val[3], val[4], val[5]); @@ -833,18 +811,18 @@ FILE *PlugOpenFile(PGLOBAL g, LPCSTR fname, LPCSTR ftype) PFBLOCK fp; PDBUSER dbuserp = (PDBUSER)g->Activityp->Aptr; - if (trace) { + if (trace(1)) { htrc("PlugOpenFile: fname=%s ftype=%s\n", fname, ftype); htrc("dbuserp=%p\n", dbuserp); } // endif trace if ((fop= global_fopen(g, MSGID_OPEN_MODE_STRERROR, fname, ftype)) != NULL) { - if (trace) + if (trace(1)) htrc(" fop=%p\n", fop); fp = (PFBLOCK)PlugSubAlloc(g, NULL, sizeof(FBLOCK)); - if (trace) + if (trace(1)) htrc(" fp=%p\n", fp); // fname may be in volatile memory such as stack @@ -857,7 +835,7 @@ FILE *PlugOpenFile(PGLOBAL g, LPCSTR fname, LPCSTR ftype) dbuserp->Openlist = fp; } /* endif fop */ - if (trace) + if (trace(1)) htrc(" returning fop=%p\n", fop); return (fop); @@ -888,7 +866,7 @@ int PlugCloseFile(PGLOBAL g, PFBLOCK fp, bool all) { int rc = 0; - if (trace) + if (trace(1)) htrc("PlugCloseFile: fp=%p count=%hd type=%hd\n", fp, ((fp) ? fp->Count : 0), ((fp) ? fp->Type : 0)); @@ -1050,7 +1028,7 @@ int GetIniSize(char *section, char *key, char *def, char *ini) n *= 1024; } // endswitch c - if (trace) + if (trace(1)) htrc("GetIniSize: key=%s buff=%s i=%d n=%d\n", key, buff, i, n); return n; @@ -1086,7 +1064,7 @@ DllExport PSZ GetIniString(PGLOBAL g, void *mp, LPCSTR sec, LPCSTR key, p = (PSZ)PlugSubAlloc(g, mp, n + 1); - if (trace) + if (trace(1)) htrc("GetIniString: sec=%s key=%s buf=%s\n", sec, key, buf); strcpy(p, buf); @@ -1237,7 +1215,7 @@ char *GetExceptionDesc(PGLOBAL g, unsigned int e) /* so it can be freed at the normal or error query completion. */ /***********************************************************************/ void *PlgDBalloc(PGLOBAL g, void *area, MBLOCK& mp) - { +{ //bool b; size_t maxsub, minsub; void *arp = (area) ? area : g->Sarea; @@ -1253,7 +1231,7 @@ void *PlgDBalloc(PGLOBAL g, void *area, MBLOCK& mp) // done to check whether the block is already there. // b = mp.Sub; mp.Sub = false; // Restrict suballocation to one quarter - } // endif Memp + } // endif Memp // Suballoc when possible if mp.Sub is initially true, but leaving // a minimum amount of storage for future operations such as the @@ -1263,35 +1241,40 @@ void *PlgDBalloc(PGLOBAL g, void *area, MBLOCK& mp) maxsub = (pph->FreeBlk < minsub) ? 0 : pph->FreeBlk - minsub; mp.Sub = mp.Size <= ((mp.Sub) ? maxsub : (maxsub >> 2)); - if (trace > 1) - htrc("PlgDBalloc: in %p size=%d used=%d free=%d sub=%d\n", - arp, mp.Size, pph->To_Free, pph->FreeBlk, mp.Sub); + if (trace(2)) + htrc("PlgDBalloc: in %p size=%d used=%d free=%d sub=%d\n", + arp, mp.Size, pph->To_Free, pph->FreeBlk, mp.Sub); - if (!mp.Sub) { + if (!mp.Sub) { // For allocations greater than one fourth of remaining storage // in the area, do allocate from virtual storage. + const char*v = "malloc"; #if defined(__WIN__) - if (mp.Size >= BIGMEM) - mp.Memp = VirtualAlloc(NULL, mp.Size, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE); - else + if (mp.Size >= BIGMEM) { + v = "VirtualAlloc"; + mp.Memp = VirtualAlloc(NULL, mp.Size, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE); + } else #endif mp.Memp = malloc(mp.Size); - if (!mp.Inlist && mp.Memp) { + if (trace(8)) + htrc("PlgDBalloc: %s(%d) at %p\n", v, mp.Size, mp.Memp); + + if (!mp.Inlist && mp.Memp) { // New allocated block, put it in the memory block chain. PDBUSER dbuserp = (PDBUSER)g->Activityp->Aptr; mp.Next = dbuserp->Memlist; dbuserp->Memlist = ∓ mp.Inlist = true; - } // endif mp + } // endif mp } else // Suballocating is Ok. mp.Memp = PlugSubAlloc(g, area, mp.Size); return mp.Memp; - } // end of PlgDBalloc +} // end of PlgDBalloc /***********************************************************************/ /* PlgDBrealloc: reallocates memory conditionally. */ @@ -1306,7 +1289,7 @@ void *PlgDBrealloc(PGLOBAL g, void *area, MBLOCK& mp, size_t newsize) // assert (mp.Memp != NULL); #endif - if (trace > 1) + if (trace(2)) htrc("PlgDBrealloc: %p size=%d sub=%d\n", mp.Memp, mp.Size, mp.Sub); if (newsize == mp.Size) @@ -1326,10 +1309,14 @@ void *PlgDBrealloc(PGLOBAL g, void *area, MBLOCK& mp, size_t newsize) mp.Memp = PlugSubAlloc(g, area, newsize); memcpy(mp.Memp, m.Memp, MY_MIN(m.Size, newsize)); PlgDBfree(m); // Free the old block - } else if (!(mp.Memp = realloc(mp.Memp, newsize))) { - mp = m; // Possible only if newsize > Size - return NULL; // Failed - } // endif's + } else { + if (!(mp.Memp = realloc(mp.Memp, newsize))) { + mp = m; // Possible only if newsize > Size + return NULL; // Failed + } else if (trace(8)) + htrc("PlgDBrealloc: realloc(%ld) at %p\n", newsize, mp.Memp); + + } // endif's mp.Size = newsize; } else if (!mp.Sub || newsize > mp.Size) { @@ -1352,7 +1339,7 @@ void *PlgDBrealloc(PGLOBAL g, void *area, MBLOCK& mp, size_t newsize) } // endif's - if (trace) + if (trace(8)) htrc(" newsize=%d newp=%p sub=%d\n", mp.Size, mp.Memp, mp.Sub); return mp.Memp; @@ -1363,16 +1350,20 @@ void *PlgDBrealloc(PGLOBAL g, void *area, MBLOCK& mp, size_t newsize) /***********************************************************************/ void PlgDBfree(MBLOCK& mp) { - if (trace > 1) - htrc("PlgDBfree: %p sub=%d size=%d\n", mp.Memp, mp.Sub, mp.Size); - - if (!mp.Sub && mp.Memp) + if (!mp.Sub && mp.Memp) { + const char*v = "free"; #if defined(__WIN__) - if (mp.Size >= BIGMEM) - VirtualFree(mp.Memp, 0, MEM_RELEASE); - else + if (mp.Size >= BIGMEM) { + v = "VirtualFree"; + VirtualFree(mp.Memp, 0, MEM_RELEASE); + } else #endif - free(mp.Memp); + free(mp.Memp); + + if (trace(8)) + htrc("PlgDBfree: %s(%p) size=%d\n", v, mp.Memp, mp.Size); + + } // endif mp // Do not reset Next to avoid cutting the Mblock chain mp.Memp = NULL; @@ -1384,7 +1375,7 @@ void PlgDBfree(MBLOCK& mp) /* Program for sub-allocating one item in a storage area. */ /* Note: This function is equivalent to PlugSubAlloc except that in */ /* case of insufficient memory, it returns NULL instead of doing a */ -/* long jump. The caller must test the return value for error. */ +/* throw. The caller must test the return value for error. */ /***********************************************************************/ void *PlgDBSubAlloc(PGLOBAL g, void *memp, size_t size) { @@ -1400,7 +1391,7 @@ void *PlgDBSubAlloc(PGLOBAL g, void *memp, size_t size) size = ((size + 7) / 8) * 8; /* Round up size to multiple of 8 */ pph = (PPOOLHEADER)memp; - if (trace > 1) + if (trace(16)) htrc("PlgDBSubAlloc: memp=%p size=%d used=%d free=%d\n", memp, size, pph->To_Free, pph->FreeBlk); @@ -1409,7 +1400,7 @@ void *PlgDBSubAlloc(PGLOBAL g, void *memp, size_t size) "Not enough memory in Work area for request of %d (used=%d free=%d)", (int) size, pph->To_Free, pph->FreeBlk); - if (trace) + if (trace(1)) htrc("%s\n", g->Message); return NULL; @@ -1422,7 +1413,7 @@ void *PlgDBSubAlloc(PGLOBAL g, void *memp, size_t size) pph->To_Free += size; // New offset of pool free block pph->FreeBlk -= size; // New size of pool free block - if (trace > 1) + if (trace(16)) htrc("Done memp=%p used=%d free=%d\n", memp, pph->To_Free, pph->FreeBlk); @@ -1453,7 +1444,7 @@ void PlugPutOut(PGLOBAL g, FILE *f, short t, void *v, uint n) { char m[64]; - if (trace) + if (trace(1)) htrc("PUTOUT: f=%p t=%d v=%p n=%d\n", f, t, v, n); if (!v) diff --git a/storage/connect/plugutil.cpp b/storage/connect/plugutil.cpp index 7b4088702..887527e38 100644 --- a/storage/connect/plugutil.cpp +++ b/storage/connect/plugutil.cpp @@ -136,7 +136,7 @@ PGLOBAL PlugInit(LPCSTR Language, uint worksize) { PGLOBAL g; - if (trace > 1) + if (trace(2)) htrc("PlugInit: Language='%s'\n", ((!Language) ? "Null" : (char*)Language)); @@ -205,7 +205,7 @@ LPSTR PlugRemoveType(LPSTR pBuff, LPCSTR FileName) _splitpath(FileName, drive, direc, fname, ftype); - if (trace > 1) { + if (trace(2)) { htrc("after _splitpath: FileName=%s\n", FileName); htrc("drive=%s dir=%s fname=%s ext=%s\n", SVP(drive), direc, fname, ftype); @@ -213,7 +213,7 @@ LPSTR PlugRemoveType(LPSTR pBuff, LPCSTR FileName) _makepath(pBuff, drive, direc, fname, ""); - if (trace > 1) + if (trace(2)) htrc("buff='%s'\n", pBuff); return pBuff; @@ -246,7 +246,7 @@ LPCSTR PlugSetPath(LPSTR pBuff, LPCSTR prefix, LPCSTR FileName, LPCSTR defpath) char *drive = NULL, *defdrv = NULL; #endif - if (trace > 1) + if (trace(2)) htrc("prefix=%s fn=%s path=%s\n", prefix, FileName, defpath); if (!strncmp(FileName, "//", 2) || !strncmp(FileName, "\\\\", 2)) { @@ -263,7 +263,7 @@ LPCSTR PlugSetPath(LPSTR pBuff, LPCSTR prefix, LPCSTR FileName, LPCSTR defpath) #if !defined(__WIN__) if (*FileName == '~') { if (_fullpath(pBuff, FileName, _MAX_PATH)) { - if (trace > 1) + if (trace(2)) htrc("pbuff='%s'\n", pBuff); return pBuff; @@ -298,7 +298,7 @@ LPCSTR PlugSetPath(LPSTR pBuff, LPCSTR prefix, LPCSTR FileName, LPCSTR defpath) _splitpath(tmpdir, defdrv, defdir, NULL, NULL); - if (trace > 1) { + if (trace(2)) { htrc("after _splitpath: FileName=%s\n", FileName); #if defined(__WIN__) htrc("drive=%s dir=%s fname=%s ext=%s\n", drive, direc, fname, ftype); @@ -325,11 +325,11 @@ LPCSTR PlugSetPath(LPSTR pBuff, LPCSTR prefix, LPCSTR FileName, LPCSTR defpath) _makepath(newname, drive, direc, fname, ftype); - if (trace > 1) + if (trace(2)) htrc("newname='%s'\n", newname); if (_fullpath(pBuff, newname, _MAX_PATH)) { - if (trace > 1) + if (trace(2)) htrc("pbuff='%s'\n", pBuff); return pBuff; @@ -470,7 +470,7 @@ bool AllocSarea(PGLOBAL g, uint size) #if defined(DEVELOPMENT) if (true) { #else - if (trace) { + if (trace(8)) { #endif if (g->Sarea) htrc("Work area of %u allocated at %p\n", size, g->Sarea); @@ -498,7 +498,7 @@ void FreeSarea(PGLOBAL g) #if defined(DEVELOPMENT) if (true) #else - if (trace) + if (trace(8)) #endif htrc("Freeing Sarea at %p size = %d\n", g->Sarea, g->Sarea_Size); @@ -545,7 +545,7 @@ void *PlugSubAlloc(PGLOBAL g, void *memp, size_t size) size = ((size + 7) / 8) * 8; /* Round up size to multiple of 8 */ pph = (PPOOLHEADER)memp; - if (trace > 3) + if (trace(16)) htrc("SubAlloc in %p size=%d used=%d free=%d\n", memp, size, pph->To_Free, pph->FreeBlk); @@ -556,10 +556,10 @@ void *PlugSubAlloc(PGLOBAL g, void *memp, size_t size) "Not enough memory in %s area for request of %u (used=%d free=%d)", pname, (uint)size, pph->To_Free, pph->FreeBlk); - if (trace) + if (trace(1)) htrc("PlugSubAlloc: %s\n", g->Message); - throw 1234; + throw 1234; } /* endif size OS32 code */ /*********************************************************************/ @@ -569,7 +569,7 @@ void *PlugSubAlloc(PGLOBAL g, void *memp, size_t size) pph->To_Free += (OFFSET)size; /* New offset of pool free block */ pph->FreeBlk -= (uint)size; /* New size of pool free block */ - if (trace > 3) + if (trace(16)) htrc("Done memp=%p used=%d free=%d\n", memp, pph->To_Free, pph->FreeBlk); diff --git a/storage/connect/preparse.h b/storage/connect/preparse.h index f16624548..3db7a2af1 100644 --- a/storage/connect/preparse.h +++ b/storage/connect/preparse.h @@ -8,7 +8,7 @@ /***********************************************************************/ typedef struct _datpar { const char *Format; // Points to format to decode - char *Curp; // Points to current parsing position + const char *Curp; // Points to current parsing position char *InFmt; // Start of input format char *OutFmt; // Start of output format int Index[8]; // Indexes of date values diff --git a/storage/connect/reldef.cpp b/storage/connect/reldef.cpp index 0fb24baa7..e4f169575 100644 --- a/storage/connect/reldef.cpp +++ b/storage/connect/reldef.cpp @@ -450,7 +450,7 @@ int TABDEF::GetColCatInfo(PGLOBAL g) } // endswitch tc // lrecl must be at least recln to avoid buffer overflow - if (trace) + if (trace(1)) htrc("Lrecl: Calculated=%d defined=%d\n", recln, Hc->GetIntegerOption("Lrecl")); diff --git a/storage/connect/tabcol.cpp b/storage/connect/tabcol.cpp index 5065d86ce..93de0598f 100644 --- a/storage/connect/tabcol.cpp +++ b/storage/connect/tabcol.cpp @@ -33,7 +33,7 @@ XTAB::XTAB(LPCSTR name, LPCSTR srcdef) : Name(name) Schema = NULL; Qualifier = NULL; - if (trace) + if (trace(1)) htrc("XTAB: making new TABLE %s %s\n", Name, Srcdef); } // end of XTAB constructor @@ -49,7 +49,7 @@ XTAB::XTAB(PTABLE tp) : Name(tp->Name) Schema = tp->Schema; Qualifier = tp->Qualifier; - if (trace) + if (trace(1)) htrc(" making copy TABLE %s %s\n", Name, SVP(Srcdef)); } // end of XTAB constructor @@ -61,7 +61,7 @@ PTABLE XTAB::Link(PTABLE tab2) { PTABLE tabp; - if (trace) + if (trace(1)) htrc("Linking tables %s... to %s\n", Name, tab2->Name); for (tabp = this; tabp->Next; tabp = tabp->Next) ; @@ -117,7 +117,7 @@ COLUMN::COLUMN(LPCSTR name) : Name(name) To_Col = NULL; Qualifier = NULL; - if (trace) + if (trace(1)) htrc(" making new COLUMN %s\n", Name); } // end of COLUMN constructor diff --git a/storage/connect/tabdos.cpp b/storage/connect/tabdos.cpp index 5b9667a6c..29cbbb357 100644 --- a/storage/connect/tabdos.cpp +++ b/storage/connect/tabdos.cpp @@ -704,7 +704,7 @@ int TDBDOS::MakeBlockValues(PGLOBAL g) // savmin = cdp->GetBmap(); // cdp->SetBmap(PlugSubAlloc(g, NULL, block * sizeof(int))); - if (trace) + if (trace(1)) htrc("Dval(%p) Bmap(%p) col(%d) %s Block=%d lg=%d\n", cdp->GetDval(), cdp->GetBmap(), i, cdp->GetName(), block, lg); @@ -729,7 +729,7 @@ int TDBDOS::MakeBlockValues(PGLOBAL g) memset(cdp->GetMax(), 0, block * lg); } // endif Type - if (trace) + if (trace(1)) htrc("min(%p) max(%p) col(%d) %s Block=%d lg=%d\n", cdp->GetMin(), cdp->GetMax(), i, cdp->GetName(), block, lg); @@ -901,7 +901,7 @@ bool TDBDOS::SaveBlockValues(PGLOBAL g) "wb", (int)errno, filename); strcat(strcat(g->Message, ": "), strerror(errno)); - if (trace) + if (trace(1)) htrc("%s\n", g->Message); return true; @@ -1634,7 +1634,7 @@ int TDBDOS::TestBlock(PGLOBAL g) To_Filter = NULL; // So remove filter } // endswitch Beval - if (trace) + if (trace(1)) htrc("BF Eval Beval=%d\n", Beval); } // endif To_BlkFil @@ -1647,8 +1647,8 @@ int TDBDOS::TestBlock(PGLOBAL g) /***********************************************************************/ int TDBDOS::MakeIndex(PGLOBAL g, PIXDEF pxdf, bool add) { - int k, n, rc = RC_OK; - bool fixed, doit, sep, b = (pxdf != NULL); + int k, n, rc = RC_OK; + bool fixed, doit, sep, b = (pxdf != NULL); PCOL *keycols, colp; PIXDEF xdp, sxp = NULL; PKPDEF kdp; @@ -1694,8 +1694,8 @@ int TDBDOS::MakeIndex(PGLOBAL g, PIXDEF pxdf, bool add) try { // Allocate all columns that will be used by indexes. - // This must be done before opening the table so specific - // column initialization can be done (in particular by TDBVCT) + // This must be done before opening the table so specific + // column initialization can be done (in particular by TDBVCT) for (n = 0, xdp = pxdf; xdp; xdp = xdp->GetNext()) for (kdp = xdp->GetToKeyParts(); kdp; kdp = kdp->GetNext()) { if (!(colp = ColDB(g, kdp->GetName(), 0))) { @@ -1779,7 +1779,7 @@ int TDBDOS::MakeIndex(PGLOBAL g, PIXDEF pxdf, bool add) return RC_INFO; // Error or Physical table does not exist } catch (int n) { - if (trace) + if (trace(1)) htrc("Exception %d: %s\n", n, g->Message); rc = RC_FX; } catch (const char *msg) { @@ -1902,7 +1902,7 @@ bool TDBDOS::InitialyzeIndex(PGLOBAL g, volatile PIXDEF xdp, bool sorted) } // endif brc } catch (int n) { - if (trace) + if (trace(1)) htrc("Exception %d: %s\n", n, g->Message); brc = true; } catch (const char *msg) { @@ -2001,7 +2001,7 @@ int TDBDOS::Cardinality(PGLOBAL g) if (len >= 0) { int rec; - if (trace) + if (trace(1)) htrc("Estimating lines len=%d ending=%d/n", len, ((PDOSDEF)To_Def)->Ending); @@ -2018,7 +2018,7 @@ int TDBDOS::Cardinality(PGLOBAL g) Cardinal = (len + rec - 1) / rec; - if (trace) + if (trace(1)) htrc("avglen=%d MaxSize%d\n", rec, Cardinal); } // endif len @@ -2048,7 +2048,7 @@ int TDBDOS::GetMaxSize(PGLOBAL g) if (len >= 0) { int rec; - if (trace) + if (trace(1)) htrc("Estimating lines len=%d ending=%d/n", len, ((PDOSDEF)To_Def)->Ending); @@ -2059,7 +2059,7 @@ int TDBDOS::GetMaxSize(PGLOBAL g) rec = EstimatedLength() + ((PDOSDEF)To_Def)->Ending; MaxSize = (len + rec - 1) / rec; - if (trace) + if (trace(1)) htrc("avglen=%d MaxSize%d\n", rec, MaxSize); } // endif len @@ -2108,7 +2108,7 @@ bool TDBDOS::IsUsingTemp(PGLOBAL) /***********************************************************************/ bool TDBDOS::OpenDB(PGLOBAL g) { - if (trace) + if (trace(1)) htrc("DOS OpenDB: tdbp=%p tdb=R%d use=%d mode=%d\n", this, Tdb_No, Use, Mode); @@ -2184,7 +2184,7 @@ bool TDBDOS::OpenDB(PGLOBAL g) } else memset(To_Line, 0, linelen); - if (trace) + if (trace(1)) htrc("OpenDos: R%hd mode=%d To_Line=%p\n", Tdb_No, Mode, To_Line); if (SkipHeader(g)) // When called from CSV/FMT files @@ -2202,7 +2202,7 @@ bool TDBDOS::OpenDB(PGLOBAL g) /***********************************************************************/ int TDBDOS::ReadDB(PGLOBAL g) { - if (trace > 1) + if (trace(2)) htrc("DOS ReadDB: R%d Mode=%d key=%p link=%p Kindex=%p To_Line=%p\n", GetTdb_No(), Mode, To_Key_Col, To_Link, To_Kindex, To_Line); @@ -2227,7 +2227,7 @@ int TDBDOS::ReadDB(PGLOBAL g) if (SetRecpos(g, recpos)) return RC_FX; - if (trace > 1) + if (trace(2)) htrc("File position is now %d\n", GetRecpos()); if (Mode == MODE_READ) @@ -2243,7 +2243,7 @@ int TDBDOS::ReadDB(PGLOBAL g) } // endif To_Kindex - if (trace > 1) + if (trace(2)) htrc(" ReadDB: this=%p To_Line=%p\n", this, To_Line); /*********************************************************************/ @@ -2279,14 +2279,14 @@ bool TDBDOS::PrepareWriting(PGLOBAL) /***********************************************************************/ int TDBDOS::WriteDB(PGLOBAL g) { - if (trace > 1) + if (trace(2)) htrc("DOS WriteDB: R%d Mode=%d \n", Tdb_No, Mode); // Make the line to write if (PrepareWriting(g)) return RC_FX; - if (trace > 1) + if (trace(2)) htrc("Write: line is='%s'\n", To_Line); // Now start the writing process @@ -2403,7 +2403,7 @@ DOSCOL::DOSCOL(PGLOBAL g, PCOLDEF cdp, PTDB tp, PCOL cp, int i, PCSZ am) Dcm = (*p) ? atoi(p) : GetScale(); } // endif fmt - if (trace) + if (trace(1)) htrc(" making new %sCOL C%d %s at %p\n", am, Index, Name, this); } // end of DOSCOL constructor @@ -2518,7 +2518,7 @@ void DOSCOL::ReadColumn(PGLOBAL g) double dval; PTDBDOS tdbp = (PTDBDOS)To_Tdb; - if (trace > 1) + if (trace(2)) htrc( "DOS ReadColumn: col %s R%d coluse=%.4X status=%.4X buf_type=%d\n", Name, tdbp->GetTdb_No(), ColUse, Status, Buf_Type); @@ -2607,13 +2607,13 @@ void DOSCOL::WriteColumn(PGLOBAL g) int i, k, len, field; PTDBDOS tdbp = (PTDBDOS)To_Tdb; - if (trace > 1) + if (trace(2)) htrc("DOS WriteColumn: col %s R%d coluse=%.4X status=%.4X\n", Name, tdbp->GetTdb_No(), ColUse, Status); p = tdbp->To_Line + Deplac; - if (trace > 1) + if (trace(2)) htrc("Lrecl=%d deplac=%d int=%d\n", tdbp->Lrecl, Deplac, Long); field = Long; @@ -2630,7 +2630,7 @@ void DOSCOL::WriteColumn(PGLOBAL g) } // endif Ftype - if (trace > 1) + if (trace(2)) htrc("Long=%d field=%d coltype=%d colval=%p\n", Long, field, Buf_Type, Value); @@ -2703,7 +2703,7 @@ void DOSCOL::WriteColumn(PGLOBAL g) } else // Standard CONNECT format p2 = Value->ShowValue(Buf, field); - if (trace) + if (trace(1)) htrc("new length(%p)=%d\n", p2, strlen(p2)); if ((len = strlen(p2)) > field) { @@ -2714,7 +2714,7 @@ void DOSCOL::WriteColumn(PGLOBAL g) if (p2[i] == '.') p2[i] = Dsp; - if (trace > 1) + if (trace(2)) htrc("buffer=%s\n", p2); /*******************************************************************/ @@ -2724,7 +2724,7 @@ void DOSCOL::WriteColumn(PGLOBAL g) memset(p, ' ', field); memcpy(p, p2, len); - if (trace > 1) + if (trace(2)) htrc(" col write: '%.*s'\n", len, p); } // endif Use @@ -2881,4 +2881,3 @@ bool DOSCOL::AddDistinctValue(PGLOBAL g) } // end of AddDistinctValue /* ------------------------------------------------------------------- */ - diff --git a/storage/connect/tabdos.h b/storage/connect/tabdos.h index 948b357dc..bdde37ada 100644 --- a/storage/connect/tabdos.h +++ b/storage/connect/tabdos.h @@ -29,6 +29,7 @@ class DllExport DOSDEF : public TABDEF { /* Logical table description */ friend class TXTFAM; friend class DBFBASE; friend class UNZIPUTL; + friend class JSONCOL; public: // Constructor DOSDEF(void); diff --git a/storage/connect/tabext.cpp b/storage/connect/tabext.cpp index a75b373b5..64d401bef 100644 --- a/storage/connect/tabext.cpp +++ b/storage/connect/tabext.cpp @@ -433,7 +433,7 @@ bool TDBEXT::MakeSQL(PGLOBAL g, bool cnt) } else Query->Resize(len); - if (trace) + if (trace(33)) htrc("Query=%s\n", Query->GetStr()); return false; @@ -527,7 +527,7 @@ bool TDBEXT::MakeCommand(PGLOBAL g) return true; } // endif p - if (trace) + if (trace(33)) htrc("Command=%s\n", stmt); Query = new(g)STRING(g, 0, stmt); @@ -585,7 +585,7 @@ EXTCOL::EXTCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PCSZ am) tdbp->SetColumns(this); } // endif cprec - if (trace) + if (trace(1)) htrc(" making new %sCOL C%d %s at %p\n", am, Index, Name, this); // Set additional remote access method information for column. diff --git a/storage/connect/tabfix.cpp b/storage/connect/tabfix.cpp index a78d5861e..1969fd446 100644 --- a/storage/connect/tabfix.cpp +++ b/storage/connect/tabfix.cpp @@ -291,7 +291,7 @@ bool TDBFIX::IsUsingTemp(PGLOBAL) /***********************************************************************/ bool TDBFIX::OpenDB(PGLOBAL g) { - if (trace) + if (trace(1)) htrc("FIX OpenDB: tdbp=%p tdb=R%d use=%d key=%p mode=%d Ftype=%d\n", this, Tdb_No, Use, To_Key_Col, Mode, Ftype); @@ -345,7 +345,7 @@ bool TDBFIX::OpenDB(PGLOBAL g) /*********************************************************************/ To_BlkFil = InitBlockFilter(g, To_Filter); - if (trace) + if (trace(1)) htrc("OpenFix: R%hd mode=%d BlkFil=%p\n", Tdb_No, Mode, To_BlkFil); /*********************************************************************/ @@ -474,7 +474,7 @@ void BINCOL::ReadColumn(PGLOBAL g) int rc; PTDBFIX tdbp = (PTDBFIX)To_Tdb; - if (trace > 1) + if (trace(2)) htrc("BIN ReadColumn: col %s R%d coluse=%.4X status=%.4X buf_type=%d\n", Name, tdbp->GetTdb_No(), ColUse, Status, Buf_Type); @@ -565,7 +565,7 @@ void BINCOL::WriteColumn(PGLOBAL g) longlong n; PTDBFIX tdbp = (PTDBFIX)To_Tdb; - if (trace) { + if (trace(1)) { htrc("BIN WriteColumn: col %s R%d coluse=%.4X status=%.4X", Name, tdbp->GetTdb_No(), ColUse, Status); htrc(" Lrecl=%d\n", tdbp->Lrecl); diff --git a/storage/connect/tabfmt.cpp b/storage/connect/tabfmt.cpp index 516601a5e..63fa2a636 100644 --- a/storage/connect/tabfmt.cpp +++ b/storage/connect/tabfmt.cpp @@ -185,7 +185,7 @@ PQRYRES CSVColumns(PGLOBAL g, PCSZ dp, PTOS topt, bool info) mxr = MY_MAX(0, tdp->Maxerr); - if (trace) + if (trace(1)) htrc("File %s Sep=%c Qot=%c Header=%d maxerr=%d\n", SVP(tdp->Fn), tdp->Sep, tdp->Qot, tdp->Header, tdp->Maxerr); @@ -379,7 +379,7 @@ PQRYRES CSVColumns(PGLOBAL g, PCSZ dp, PTOS topt, bool info) skip: ; // Skip erroneous line } // endfor num_read - if (trace) { + if (trace(1)) { htrc("imax=%d Lengths:", imax); for (i = 0; i < imax; i++) @@ -391,7 +391,7 @@ PQRYRES CSVColumns(PGLOBAL g, PCSZ dp, PTOS topt, bool info) tdbp->CloseDB(g); skipit: - if (trace) + if (trace(1)) htrc("CSVColumns: imax=%d hmax=%d len=%d\n", imax, hmax, length[0]); @@ -701,7 +701,7 @@ int TDBCSV::EstimatedLength(void) int n = 0; PCOLDEF cdp; - if (trace) + if (trace(1)) htrc("EstimatedLength: Fields=%d Columns=%p\n", Fields, Columns); for (cdp = To_Def->GetCols(); cdp; cdp = cdp->GetNext()) @@ -906,7 +906,7 @@ int TDBCSV::ReadBuffer(PGLOBAL g) int i, n, len, rc = Txfp->ReadBuffer(g); bool bad = false; - if (trace > 1) + if (trace(2)) htrc("CSV: Row is '%s' rc=%d\n", To_Line, rc); if (rc != RC_OK || !Fields) @@ -934,7 +934,7 @@ int TDBCSV::ReadBuffer(PGLOBAL g) if (p) { //len = p++ - p2; - len = p - p2 - 1;; + len = (int)(p - p2 - 1); // if (Sep != ' ') // for (; *p == ' '; p++) ; // Skip blanks @@ -978,7 +978,7 @@ int TDBCSV::ReadBuffer(PGLOBAL g) return RC_NF; } else if ((p = strchr(p2, Sep))) - len = p - p2; + len = (int)(p - p2); else if (i == Fields - 1) len = strlen(p2); else if (Accept && Maxerr == 0) { @@ -996,7 +996,7 @@ int TDBCSV::ReadBuffer(PGLOBAL g) } else len = 0; - Offset[i] = p2 - To_Line; + Offset[i] = (int)(p2 - To_Line); if (Mode != MODE_UPDATE) Fldlen[i] = len; @@ -1024,7 +1024,7 @@ bool TDBCSV::PrepareWriting(PGLOBAL g) char sep[2], qot[2]; int i, nlen, oldlen = strlen(To_Line); - if (trace > 1) + if (trace(2)) htrc("CSV WriteDB: R%d Mode=%d key=%p link=%p\n", Tdb_No, Mode, To_Key_Col, To_Link); @@ -1090,7 +1090,7 @@ bool TDBCSV::PrepareWriting(PGLOBAL g) To_Line[nlen] = '\0'; } // endif - if (trace > 1) + if (trace(2)) htrc("Write: line is=%s", To_Line); return false; @@ -1118,7 +1118,7 @@ int TDBCSV::CheckWrite(PGLOBAL g) { int maxlen, n, nlen = (Fields - 1); - if (trace > 1) + if (trace(2)) htrc("CheckWrite: R%d Mode=%d\n", Tdb_No, Mode); // Before writing the line we must check its length @@ -1290,7 +1290,7 @@ int TDBFMT::ReadBuffer(PGLOBAL g) else ++Linenum; - if (trace > 1) + if (trace(2)) htrc("FMT: Row %d is '%s' rc=%d\n", Linenum, To_Line, rc); // Find the offsets and lengths of the columns for this row @@ -1445,7 +1445,7 @@ void CSVCOL::ReadColumn(PGLOBAL g) Deplac = tdbp->Offset[Fldnum]; // Field offset Long = tdbp->Fldlen[Fldnum]; // Field length - if (trace > 1) + if (trace(2)) htrc("CSV ReadColumn %s Fldnum=%d offset=%d fldlen=%d\n", Name, Fldnum, Deplac, Long); @@ -1489,13 +1489,13 @@ void CSVCOL::WriteColumn(PGLOBAL g) int flen; PTDBCSV tdbp = (PTDBCSV)To_Tdb; - if (trace > 1) + if (trace(2)) htrc("CSV WriteColumn: col %s R%d coluse=%.4X status=%.4X\n", Name, tdbp->GetTdb_No(), ColUse, Status); flen = GetLength(); - if (trace > 1) + if (trace(2)) htrc("Lrecl=%d Long=%d field=%d coltype=%d colval=%p\n", tdbp->Lrecl, Long, flen, Buf_Type, Value); @@ -1510,7 +1510,7 @@ void CSVCOL::WriteColumn(PGLOBAL g) /*********************************************************************/ p = Value->ShowValue(buf); - if (trace > 1) + if (trace(2)) htrc("new length(%p)=%d\n", p, strlen(p)); if ((signed)strlen(p) > flen) { @@ -1522,7 +1522,7 @@ void CSVCOL::WriteColumn(PGLOBAL g) if (p[i] == '.') p[i] = Dsp; - if (trace > 1) + if (trace(2)) htrc("buffer=%s\n", p); /*********************************************************************/ @@ -1536,7 +1536,7 @@ void CSVCOL::WriteColumn(PGLOBAL g) } else strncpy(tdbp->Field[Fldnum], p, flen); - if (trace > 1) + if (trace(2)) htrc(" col written: '%s'\n", p); } // end of WriteColumn diff --git a/storage/connect/tabjdbc.cpp b/storage/connect/tabjdbc.cpp index b6a148795..275b5edae 100644 --- a/storage/connect/tabjdbc.cpp +++ b/storage/connect/tabjdbc.cpp @@ -153,7 +153,7 @@ int JDBCDEF::ParseURL(PGLOBAL g, char *url, bool b) // Tabname = GetStringCatInfo(g, "Tabname", Tabname); } // endif - if (trace) + if (trace(1)) htrc("server: %s Tabname: %s", url, Tabname); // Now make the required URL @@ -470,7 +470,7 @@ bool TDBJDBC::MakeInsert(PGLOBAL g) else Prepared = true; - if (trace) + if (trace(33)) htrc("Insert=%s\n", Query->GetStr()); return false; @@ -553,7 +553,7 @@ bool TDBJDBC::OpenDB(PGLOBAL g) { bool rc = true; - if (trace) + if (trace(1)) htrc("JDBC OpenDB: tdbp=%p tdb=R%d use=%d mode=%d\n", this, Tdb_No, Use, Mode); @@ -572,7 +572,7 @@ bool TDBJDBC::OpenDB(PGLOBAL g) if (Memory < 3) { // Method will depend on cursor type - if ((Rbuf = Jcp->Rewind(Query->GetStr())) < 0) + if ((Rbuf = Query ? Jcp->Rewind(Query->GetStr()) : 0) < 0) if (Mode != MODE_READX) { Jcp->Close(); return true; @@ -605,6 +605,10 @@ bool TDBJDBC::OpenDB(PGLOBAL g) else if (Quoted) Quote = Jcp->GetQuoteChar(); + if (Mode != MODE_READ && Mode != MODE_READX) + if (Jcp->SetUUID(g, this)) + PushWarning(g, this, 1); + Use = USE_OPEN; // Do it now in case we are recursively called /*********************************************************************/ @@ -767,7 +771,7 @@ bool TDBJDBC::ReadKey(PGLOBAL g, OPVAL op, const key_range *kr) Mode = MODE_READ; } // endif's op - if (trace) + if (trace(33)) htrc("JDBC ReadKey: Query=%s\n", Query->GetStr()); rc = Jcp->ExecuteQuery((char*)Query->GetStr()); @@ -783,7 +787,7 @@ int TDBJDBC::ReadDB(PGLOBAL g) { int rc; - if (trace > 1) + if (trace(2)) htrc("JDBC ReadDB: R%d Mode=%d\n", GetTdb_No(), Mode); if (Mode == MODE_UPDATE || Mode == MODE_DELETE) { @@ -836,7 +840,7 @@ int TDBJDBC::ReadDB(PGLOBAL g) } // endif placed - if (trace > 1) + if (trace(2)) htrc(" Read: Rbuf=%d rc=%d\n", Rbuf, rc); return rc; @@ -897,7 +901,7 @@ int TDBJDBC::WriteDB(PGLOBAL g) Query->RepLast(')'); - if (trace > 1) + if (trace(2)) htrc("Inserting: %s\n", Query->GetStr()); rc = Jcp->ExecuteUpdate(Query->GetStr()); @@ -925,7 +929,7 @@ int TDBJDBC::DeleteDB(PGLOBAL g, int irc) AftRows = Jcp->m_Aff; sprintf(g->Message, "%s: %d affected rows", TableName, AftRows); - if (trace) + if (trace(1)) htrc("%s\n", g->Message); PushWarning(g, this, 0); // 0 means a Note @@ -946,14 +950,14 @@ void TDBJDBC::CloseDB(PGLOBAL g) if (Jcp) Jcp->Close(); - if (trace) + if (trace(1)) htrc("JDBC CloseDB: closing %s\n", Name); if (!Werr && (Mode == MODE_INSERT || Mode == MODE_UPDATE || Mode == MODE_DELETE)) { sprintf(g->Message, "%s: %d affected rows", TableName, AftRows); - if (trace) + if (trace(1)) htrc("%s\n", g->Message); PushWarning(g, this, 0); // 0 means a Note @@ -970,6 +974,7 @@ void TDBJDBC::CloseDB(PGLOBAL g) JDBCCOL::JDBCCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PCSZ am) : EXTCOL(cdp, tdbp, cprec, i, am) { + uuid = false; } // end of JDBCCOL constructor /***********************************************************************/ @@ -977,6 +982,7 @@ JDBCCOL::JDBCCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PCSZ am) /***********************************************************************/ JDBCCOL::JDBCCOL(void) : EXTCOL() { + uuid = false; } // end of JDBCCOL constructor /***********************************************************************/ @@ -985,12 +991,11 @@ JDBCCOL::JDBCCOL(void) : EXTCOL() /***********************************************************************/ JDBCCOL::JDBCCOL(JDBCCOL *col1, PTDB tdbp) : EXTCOL(col1, tdbp) { + uuid = col1->uuid; } // end of JDBCCOL copy constructor /***********************************************************************/ -/* ReadColumn: when SQLFetch is used there is nothing to do as the */ -/* column buffer was bind to the record set. This is also the case */ -/* when calculating MaxSize (Bufp is NULL even when Rows is not). */ +/* ReadColumn: retrieve the column value via the JDBC driver. */ /***********************************************************************/ void JDBCCOL::ReadColumn(PGLOBAL g) { @@ -1117,7 +1122,7 @@ bool TDBXJDC::OpenDB(PGLOBAL g) { bool rc = false; - if (trace) + if (trace(1)) htrc("JDBC OpenDB: tdbp=%p tdb=R%d use=%d mode=%d\n", this, Tdb_No, Use, Mode); diff --git a/storage/connect/tabjdbc.h b/storage/connect/tabjdbc.h index d422ed26e..078129a14 100644 --- a/storage/connect/tabjdbc.h +++ b/storage/connect/tabjdbc.h @@ -101,6 +101,7 @@ class TDBJDBC : public TDBEXT { /***********************************************************************/ class JDBCCOL : public EXTCOL { friend class TDBJDBC; + friend class JDBConn; public: // Constructors JDBCCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PCSZ am = "JDBC"); @@ -119,6 +120,7 @@ class JDBCCOL : public EXTCOL { JDBCCOL(void); // Members + bool uuid; // For PostgreSQL }; // end of class JDBCCOL /***********************************************************************/ diff --git a/storage/connect/tabjson.cpp b/storage/connect/tabjson.cpp index 8778b7d4b..9e4f5ab98 100644 --- a/storage/connect/tabjson.cpp +++ b/storage/connect/tabjson.cpp @@ -54,16 +54,16 @@ USETEMP UseTemp(void); char *GetJsonNull(void); -typedef struct _jncol { - struct _jncol *Next; - char *Name; - char *Fmt; - int Type; - int Len; - int Scale; - bool Cbn; - bool Found; -} JCOL, *PJCL; +//typedef struct _jncol { +// struct _jncol *Next; +// char *Name; +// char *Fmt; +// int Type; +// int Len; +// int Scale; +// bool Cbn; +// bool Found; +//} JCOL, *PJCL; /***********************************************************************/ /* JSONColumns: construct the result blocks containing the description */ @@ -76,26 +76,13 @@ PQRYRES JSONColumns(PGLOBAL g, PCSZ db, PCSZ dsn, PTOS topt, bool info) static XFLD fldtyp[] = {FLD_NAME, FLD_TYPE, FLD_TYPENAME, FLD_PREC, FLD_LENGTH, FLD_SCALE, FLD_NULL, FLD_FORMAT}; static unsigned int length[] = {0, 6, 8, 10, 10, 6, 6, 0}; - char *p, colname[65], fmt[129]; - int i, j, lvl, n = 0; + int i, n = 0; int ncol = sizeof(buftyp) / sizeof(int); - bool mgo = (GetTypeID(topt->type) == TAB_MONGO); - PCSZ sep, level; - PVAL valp; - JCOL jcol; - PJCL jcp, fjcp = NULL, pjcp = NULL; - PJPR *jrp, jpp; - PJSON jsp; - PJVAL jvp; - PJOB row; - PJDEF tdp; - TDBJSN *tjnp = NULL; - PJTDB tjsp = NULL; + PJCL jcp; + JSONDISC *pjdc = NULL; PQRYRES qrp; PCOLRES crp; - jcol.Name = jcol.Fmt = NULL; - if (info) { length[0] = 128; length[7] = 256; @@ -107,20 +94,100 @@ PQRYRES JSONColumns(PGLOBAL g, PCSZ db, PCSZ dsn, PTOS topt, bool info) return NULL; } // endif Multiple - /*********************************************************************/ - /* Open the input file. */ + pjdc = new(g) JSONDISC(g, length); + + if (!(n = pjdc->GetColumns(g, db, dsn, topt))) + return NULL; + + skipit: + if (trace(1)) + htrc("JSONColumns: n=%d len=%d\n", n, length[0]); + + /*********************************************************************/ + /* Allocate the structures used to refer to the result set. */ + /*********************************************************************/ + qrp = PlgAllocResult(g, ncol, n, IDS_COLUMNS + 3, + buftyp, fldtyp, length, false, false); + + crp = qrp->Colresp->Next->Next->Next->Next->Next->Next; + crp->Name = "Nullable"; + crp->Next->Name = "Jpath"; + + if (info || !qrp) + return qrp; + + qrp->Nblin = n; + /*********************************************************************/ - level = GetStringTableOption(g, topt, "Level", NULL); + /* Now get the results into blocks. */ + /*********************************************************************/ + for (i = 0, jcp = pjdc->fjcp; jcp; i++, jcp = jcp->Next) { + if (jcp->Type == TYPE_UNKNOWN) + jcp->Type = TYPE_STRING; // Void column + + crp = qrp->Colresp; // Column Name + crp->Kdata->SetValue(jcp->Name, i); + crp = crp->Next; // Data Type + crp->Kdata->SetValue(jcp->Type, i); + crp = crp->Next; // Type Name + crp->Kdata->SetValue(GetTypeName(jcp->Type), i); + crp = crp->Next; // Precision + crp->Kdata->SetValue(jcp->Len, i); + crp = crp->Next; // Length + crp->Kdata->SetValue(jcp->Len, i); + crp = crp->Next; // Scale (precision) + crp->Kdata->SetValue(jcp->Scale, i); + crp = crp->Next; // Nullable + crp->Kdata->SetValue(jcp->Cbn ? 1 : 0, i); + crp = crp->Next; // Field format + + if (crp->Kdata) + crp->Kdata->SetValue(jcp->Fmt, i); + + } // endfor i + + /*********************************************************************/ + /* Return the result pointer. */ + /*********************************************************************/ + return qrp; + } // end of JSONColumns + +/* -------------------------- Class JSONDISC ------------------------- */ + +/***********************************************************************/ +/* Class used to get the columns of a JSON table. */ +/***********************************************************************/ +JSONDISC::JSONDISC(PGLOBAL g, uint *lg) +{ + length = lg; + jcp = fjcp = pjcp = NULL; + tjnp = NULL; + jpp = NULL; + tjsp = NULL; + jsp = NULL; + row = NULL; + sep = NULL; + i = n = bf = ncol = lvl = 0; + all = false; +} // end of JSONDISC constructor + +int JSONDISC::GetColumns(PGLOBAL g, PCSZ db, PCSZ dsn, PTOS topt) +{ + bool mgo = (GetTypeID(topt->type) == TAB_MONGO); + PCSZ level = GetStringTableOption(g, topt, "Level", NULL); if (level) { lvl = atoi(level); lvl = (lvl > 16) ? 16 : lvl; - } else + } else lvl = 0; sep = GetStringTableOption(g, topt, "Separator", "."); - tdp = new(g) JSONDEF; + /*********************************************************************/ + /* Open the input file. */ + /*********************************************************************/ + tdp = new(g) JSONDEF; #if defined(ZIP_SUPPORT) tdp->Entry = GetStringTableOption(g, topt, "Entry", NULL); tdp->Zipped = GetBooleanTableOption(g, topt, "Zipped", false); @@ -128,23 +195,23 @@ PQRYRES JSONColumns(PGLOBAL g, PCSZ db, PCSZ dsn, PTOS topt, bool info) tdp->Fn = GetStringTableOption(g, topt, "Filename", NULL); if (!(tdp->Database = SetPath(g, db))) - return NULL; + return 0; - tdp->Objname = GetStringTableOption(g, topt, "Object", NULL); - tdp->Base = GetIntegerTableOption(g, topt, "Base", 0) ? 1 : 0; - tdp->Pretty = GetIntegerTableOption(g, topt, "Pretty", 2); + tdp->Objname = GetStringTableOption(g, topt, "Object", NULL); + tdp->Base = GetIntegerTableOption(g, topt, "Base", 0) ? 1 : 0; + tdp->Pretty = GetIntegerTableOption(g, topt, "Pretty", 2); tdp->Xcol = GetStringTableOption(g, topt, "Expand", NULL); tdp->Accept = GetBooleanTableOption(g, topt, "Accept", false); tdp->Uri = (dsn && *dsn ? dsn : NULL); if (!tdp->Fn && !tdp->Uri) { strcpy(g->Message, MSG(MISSING_FNAME)); - return NULL; + return 0; } // endif Fn - if (trace) - htrc("File %s objname=%s pretty=%d lvl=%d\n", - tdp->Fn, tdp->Objname, tdp->Pretty, lvl); + if (trace(1)) + htrc("File %s objname=%s pretty=%d lvl=%d\n", + tdp->Fn, tdp->Objname, tdp->Pretty, lvl); if (tdp->Uri) { #if defined(JAVA_SUPPORT) || defined(CMGO_SUPPORT) @@ -160,34 +227,34 @@ PQRYRES JSONColumns(PGLOBAL g, PCSZ db, PCSZ dsn, PTOS topt, bool info) tdp->Pretty = 0; #else // !MONGO_SUPPORT sprintf(g->Message, MSG(NO_FEAT_SUPPORT), "MONGO"); - return NULL; + return 0; #endif // !MONGO_SUPPORT } // endif Uri - if (tdp->Pretty == 2) { + if (tdp->Pretty == 2) { if (tdp->Zipped) { #if defined(ZIP_SUPPORT) tjsp = new(g) TDBJSON(tdp, new(g) UNZFAM(tdp)); #else // !ZIP_SUPPORT sprintf(g->Message, MSG(NO_FEAT_SUPPORT), "ZIP"); - return NULL; + return 0; #endif // !ZIP_SUPPORT - } else - tjsp = new(g) TDBJSON(tdp, new(g) MAPFAM(tdp)); + } else + tjsp = new(g) TDBJSON(tdp, new(g) MAPFAM(tdp)); - if (tjsp->MakeDocument(g)) - return NULL; + if (tjsp->MakeDocument(g)) + return 0; - jsp = (tjsp->GetDoc()) ? tjsp->GetDoc()->GetValue(0) : NULL; - } else { - if (!(tdp->Lrecl = GetIntegerTableOption(g, topt, "Lrecl", 0))) + jsp = (tjsp->GetDoc()) ? tjsp->GetDoc()->GetValue(0) : NULL; + } else { + if (!(tdp->Lrecl = GetIntegerTableOption(g, topt, "Lrecl", 0))) if (!mgo) { sprintf(g->Message, "LRECL must be specified for pretty=%d", tdp->Pretty); - return NULL; - } else + return 0; + } else tdp->Lrecl = 8192; // Should be enough - tdp->Ending = GetIntegerTableOption(g, topt, "Ending", CRLF); + tdp->Ending = GetIntegerTableOption(g, topt, "Ending", CRLF); if (tdp->Zipped) { #if defined(ZIP_SUPPORT) @@ -196,36 +263,36 @@ PQRYRES JSONColumns(PGLOBAL g, PCSZ db, PCSZ dsn, PTOS topt, bool info) sprintf(g->Message, MSG(NO_FEAT_SUPPORT), "ZIP"); return NULL; #endif // !ZIP_SUPPORT - } else if (tdp->Uri) { + } else if (tdp->Uri) { if (tdp->Driver && toupper(*tdp->Driver) == 'C') { #if defined(CMGO_SUPPORT) tjnp = new(g) TDBJSN(tdp, new(g) CMGFAM(tdp)); #else sprintf(g->Message, "Mongo %s Driver not available", "C"); - return NULL; + return 0; #endif - } else if (tdp->Driver && toupper(*tdp->Driver) == 'J') { + } else if (tdp->Driver && toupper(*tdp->Driver) == 'J') { #if defined(JAVA_SUPPORT) tjnp = new(g) TDBJSN(tdp, new(g) JMGFAM(tdp)); #else sprintf(g->Message, "Mongo %s Driver not available", "Java"); - return NULL; + return 0; #endif - } else { // Driver not specified + } else { // Driver not specified #if defined(CMGO_SUPPORT) tjnp = new(g) TDBJSN(tdp, new(g) CMGFAM(tdp)); #elif defined(JAVA_SUPPORT) tjnp = new(g) TDBJSN(tdp, new(g) JMGFAM(tdp)); #else sprintf(g->Message, MSG(NO_FEAT_SUPPORT), "MONGO"); - return NULL; + return 0; #endif } // endif Driver - } else + } else tjnp = new(g) TDBJSN(tdp, new(g) DOSFAM(tdp)); - tjnp->SetMode(MODE_READ); + tjnp->SetMode(MODE_READ); // Allocate the parse work memory PGLOBAL G = (PGLOBAL)PlugSubAlloc(g, NULL, sizeof(GLOBAL)); @@ -237,248 +304,227 @@ PQRYRES JSONColumns(PGLOBAL g, PCSZ db, PCSZ dsn, PTOS topt, bool info) tjnp->SetG(G); if (tjnp->OpenDB(g)) - return NULL; + return 0; - switch (tjnp->ReadDB(g)) { - case RC_EF: - strcpy(g->Message, "Void json table"); - case RC_FX: - goto err; - default: - jsp = tjnp->GetRow(); - } // endswitch ReadDB + switch (tjnp->ReadDB(g)) { + case RC_EF: + strcpy(g->Message, "Void json table"); + case RC_FX: + goto err; + default: + jsp = tjnp->GetRow(); + } // endswitch ReadDB - } // endif pretty + } // endif pretty - if (!(row = (jsp) ? jsp->GetObject() : NULL)) { - strcpy(g->Message, "Can only retrieve columns from object rows"); - goto err; - } // endif row + if (!(row = (jsp) ? jsp->GetObject() : NULL)) { + strcpy(g->Message, "Can only retrieve columns from object rows"); + goto err; + } // endif row - jcol.Next = NULL; - jcol.Found = true; - colname[64] = 0; - fmt[128] = 0; + all = GetBooleanTableOption(g, topt, "Fullarray", false); + jcol.Name = jcol.Fmt = NULL; + jcol.Next = NULL; + jcol.Found = true; + colname[0] = 0; if (!tdp->Uri) { - *fmt = '$'; + fmt[0] = '$'; fmt[1] = '.'; - p = fmt + 2; - } else - p = fmt; - - jrp = (PJPR*)PlugSubAlloc(g, NULL, sizeof(PJPR) * MY_MAX(lvl, 0)); - - /*********************************************************************/ - /* Analyse the JSON tree and define columns. */ - /*********************************************************************/ - for (i = 1; ; i++) { - for (jpp = row->GetFirst(); jpp; jpp = jpp->GetNext()) { - for (j = 0; j < lvl; j++) - jrp[j] = NULL; - - more: - strncpy(colname, jpp->GetKey(), 64); - *p = 0; - j = 0; - jvp = jpp->GetVal(); - - retry: - if ((valp = jvp ? jvp->GetValue() : NULL)) { - jcol.Type = valp->GetType(); - jcol.Len = valp->GetValLen(); - jcol.Scale = valp->GetValPrec(); - jcol.Cbn = valp->IsNull(); - } else if (!jvp || jvp->IsNull()) { - jcol.Type = TYPE_UNKNOWN; - jcol.Len = jcol.Scale = 0; - jcol.Cbn = true; - } else if (j < lvl) { - if (!*p) - strcat(fmt, colname); - - jsp = jvp->GetJson(); - - switch (jsp->GetType()) { - case TYPE_JOB: - if (!jrp[j]) - jrp[j] = jsp->GetFirst(); - - if (*jrp[j]->GetKey() != '$') { - strncat(strncat(fmt, sep, 128), jrp[j]->GetKey(), 128); - strncat(strncat(colname, "_", 64), jrp[j]->GetKey(), 64); - } // endif Key - - jvp = jrp[j]->GetVal(); - j++; - break; - case TYPE_JAR: - if (!tdp->Xcol || stricmp(tdp->Xcol, colname)) { - if (tdp->Uri) - strncat(strncat(fmt, sep, 128), "0", 128); - else - strncat(fmt, "[0]", 128); - - } else - strncat(fmt, (tdp->Uri ? sep : "[]"), 128); - - jvp = jsp->GetValue(0); - break; - default: - sprintf(g->Message, "Logical error after %s", fmt); - goto err; - } // endswitch jsp - - goto retry; - } else if (lvl >= 0) { - jcol.Type = TYPE_STRING; - jcol.Len = 256; - jcol.Scale = 0; - jcol.Cbn = true; - } else - continue; + bf = 2; + } // endif Uri - // Check whether this column was already found - for (jcp = fjcp; jcp; jcp = jcp->Next) - if (!strcmp(colname, jcp->Name)) - break; - - if (jcp) { - if (jcp->Type != jcol.Type) { - if (jcp->Type == TYPE_UNKNOWN) - jcp->Type = jcol.Type; - else if (jcol.Type != TYPE_UNKNOWN) - jcp->Type = TYPE_STRING; + /*********************************************************************/ + /* Analyse the JSON tree and define columns. */ + /*********************************************************************/ + for (i = 1; ; i++) { + for (jpp = row->GetFirst(); jpp; jpp = jpp->GetNext()) { + strncpy(colname, jpp->GetKey(), 64); + fmt[bf] = 0; + + if (Find(g, jpp->GetVal(), MY_MIN(lvl, 0))) + goto err; + + } // endfor jpp + + // Missing column can be null + for (jcp = fjcp; jcp; jcp = jcp->Next) { + jcp->Cbn |= !jcp->Found; + jcp->Found = false; + } // endfor jcp + + if (tdp->Pretty != 2) { + // Read next record + switch (tjnp->ReadDB(g)) { + case RC_EF: + jsp = NULL; + break; + case RC_FX: + goto err; + default: + jsp = tjnp->GetRow(); + } // endswitch ReadDB - } // endif Type + } else + jsp = tjsp->GetDoc()->GetValue(i); - if (*p && (!jcp->Fmt || strlen(jcp->Fmt) < strlen(fmt))) { - jcp->Fmt = PlugDup(g, fmt); - length[7] = MY_MAX(length[7], strlen(fmt)); - } // endif fmt - - jcp->Len = MY_MAX(jcp->Len, jcol.Len); - jcp->Scale = MY_MAX(jcp->Scale, jcol.Scale); - jcp->Cbn |= jcol.Cbn; - jcp->Found = true; - } else if (jcol.Type != TYPE_UNKNOWN || tdp->Accept) { - // New column - jcp = (PJCL)PlugSubAlloc(g, NULL, sizeof(JCOL)); - *jcp = jcol; - jcp->Cbn |= (i > 1); - jcp->Name = PlugDup(g, colname); - length[0] = MY_MAX(length[0], strlen(colname)); - - if (*p) { - jcp->Fmt = PlugDup(g, fmt); - length[7] = MY_MAX(length[7], strlen(fmt)); - } else - jcp->Fmt = NULL; - - if (pjcp) { - jcp->Next = pjcp->Next; - pjcp->Next = jcp; - } else - fjcp = jcp; + if (!(row = (jsp) ? jsp->GetObject() : NULL)) + break; - n++; - } // endif jcp + } // endfor i - pjcp = jcp; + if (tdp->Pretty != 2) + tjnp->CloseDB(g); - for (j = lvl - 1; j >= 0; j--) - if (jrp[j] && (jrp[j] = jrp[j]->GetNext())) - goto more; + return n; - } // endfor jpp +err: + if (tdp->Pretty != 2) + tjnp->CloseDB(g); - // Missing column can be null - for (jcp = fjcp; jcp; jcp = jcp->Next) { - jcp->Cbn |= !jcp->Found; - jcp->Found = false; - } // endfor jcp + return 0; +} // end of GetColumns - if (tdp->Pretty != 2) { - // Read next record - switch (tjnp->ReadDB(g)) { - case RC_EF: - jsp = NULL; - break; - case RC_FX: - goto err; - default: - jsp = tjnp->GetRow(); - } // endswitch ReadDB +bool JSONDISC::Find(PGLOBAL g, PJVAL jvp, int j) +{ + char *p, *pc = colname + strlen(colname); + int ars; + PJOB job; + PJAR jar; + + if ((valp = jvp ? jvp->GetValue() : NULL)) { + jcol.Type = valp->GetType(); + jcol.Len = valp->GetValLen(); + jcol.Scale = valp->GetValPrec(); + jcol.Cbn = valp->IsNull(); + } else if (!jvp || jvp->IsNull()) { + jcol.Type = TYPE_UNKNOWN; + jcol.Len = jcol.Scale = 0; + jcol.Cbn = true; + } else if (j < lvl) { + if (!fmt[bf]) + strcat(fmt, colname); + + p = fmt + strlen(fmt); + jsp = jvp->GetJson(); + + switch (jsp->GetType()) { + case TYPE_JOB: + job = (PJOB)jsp; + + for (PJPR jrp = job->GetFirst(); jrp; jrp = jrp->GetNext()) { + if (*jrp->GetKey() != '$') { + strncat(strncat(fmt, sep, 128), jrp->GetKey(), 128); + strncat(strncat(colname, "_", 64), jrp->GetKey(), 64); + } // endif Key + + if (Find(g, jrp->GetVal(), j + 1)) + return true; + + *p = *pc = 0; + } // endfor jrp + + return false; + case TYPE_JAR: + jar = (PJAR)jsp; + + if (all || (tdp->Xcol && !stricmp(tdp->Xcol, colname))) + ars = jar->GetSize(false); + else + ars = MY_MIN(jar->GetSize(false), 1); - } else - jsp = tjsp->GetDoc()->GetValue(i); + for (int k = 0; k < ars; k++) { + if (!tdp->Xcol || stricmp(tdp->Xcol, colname)) { + sprintf(buf, "%d", k); - if (!(row = (jsp) ? jsp->GetObject() : NULL)) - break; + if (tdp->Uri) + strncat(strncat(fmt, sep, 128), buf, 128); + else + strncat(strncat(strncat(fmt, "[", 128), buf, 128), "]", 128); - } // endor i + if (all) + strncat(strncat(colname, "_", 64), buf, 64); - if (tdp->Pretty != 2) - tjnp->CloseDB(g); + } else + strncat(fmt, (tdp->Uri ? sep : "[*]"), 128); - skipit: - if (trace) - htrc("JSONColumns: n=%d len=%d\n", n, length[0]); + if (Find(g, jar->GetValue(k), j)) + return true; - /*********************************************************************/ - /* Allocate the structures used to refer to the result set. */ - /*********************************************************************/ - qrp = PlgAllocResult(g, ncol, n, IDS_COLUMNS + 3, - buftyp, fldtyp, length, false, false); + *p = *pc = 0; + } // endfor k - crp = qrp->Colresp->Next->Next->Next->Next->Next->Next; - crp->Name = "Nullable"; - crp->Next->Name = "Jpath"; + return false; + default: + sprintf(g->Message, "Logical error after %s", fmt); + return true; + } // endswitch Type - if (info || !qrp) - return qrp; + } else if (lvl >= 0) { + jcol.Type = TYPE_STRING; + jcol.Len = 256; + jcol.Scale = 0; + jcol.Cbn = true; + } else + return false; - qrp->Nblin = n; + AddColumn(g); + return false; +} // end of Find - /*********************************************************************/ - /* Now get the results into blocks. */ - /*********************************************************************/ - for (i = 0, jcp = fjcp; jcp; i++, jcp = jcp->Next) { - if (jcp->Type == TYPE_UNKNOWN) - jcp->Type = TYPE_STRING; // Void column +void JSONDISC::AddColumn(PGLOBAL g) +{ + bool b = fmt[bf] != 0; // True if formatted - crp = qrp->Colresp; // Column Name - crp->Kdata->SetValue(jcp->Name, i); - crp = crp->Next; // Data Type - crp->Kdata->SetValue(jcp->Type, i); - crp = crp->Next; // Type Name - crp->Kdata->SetValue(GetTypeName(jcp->Type), i); - crp = crp->Next; // Precision - crp->Kdata->SetValue(jcp->Len, i); - crp = crp->Next; // Length - crp->Kdata->SetValue(jcp->Len, i); - crp = crp->Next; // Scale (precision) - crp->Kdata->SetValue(jcp->Scale, i); - crp = crp->Next; // Nullable - crp->Kdata->SetValue(jcp->Cbn ? 1 : 0, i); - crp = crp->Next; // Field format + // Check whether this column was already found + for (jcp = fjcp; jcp; jcp = jcp->Next) + if (!strcmp(colname, jcp->Name)) + break; - if (crp->Kdata) - crp->Kdata->SetValue(jcp->Fmt, i); + if (jcp) { + if (jcp->Type != jcol.Type) { + if (jcp->Type == TYPE_UNKNOWN) + jcp->Type = jcol.Type; + else if (jcol.Type != TYPE_UNKNOWN) + jcp->Type = TYPE_STRING; + + } // endif Type + + if (b && (!jcp->Fmt || strlen(jcp->Fmt) < strlen(fmt))) { + jcp->Fmt = PlugDup(g, fmt); + length[7] = MY_MAX(length[7], strlen(fmt)); + } // endif fmt + + jcp->Len = MY_MAX(jcp->Len, jcol.Len); + jcp->Scale = MY_MAX(jcp->Scale, jcol.Scale); + jcp->Cbn |= jcol.Cbn; + jcp->Found = true; + } else if (jcol.Type != TYPE_UNKNOWN || tdp->Accept) { + // New column + jcp = (PJCL)PlugSubAlloc(g, NULL, sizeof(JCOL)); + *jcp = jcol; + jcp->Cbn |= (i > 1); + jcp->Name = PlugDup(g, colname); + length[0] = MY_MAX(length[0], strlen(colname)); + + if (b) { + jcp->Fmt = PlugDup(g, fmt); + length[7] = MY_MAX(length[7], strlen(fmt)); + } else + jcp->Fmt = NULL; - } // endfor i + if (pjcp) { + jcp->Next = pjcp->Next; + pjcp->Next = jcp; + } else + fjcp = jcp; - /*********************************************************************/ - /* Return the result pointer. */ - /*********************************************************************/ - return qrp; + n++; + } // endif jcp -err: - if (tdp->Pretty != 2) - tjnp->CloseDB(g); + pjcp = jcp; +} // end of AddColumn - return NULL; - } // end of JSONColumns /* -------------------------- Class JSONDEF -------------------------- */ @@ -513,6 +559,7 @@ bool JSONDEF::DefineAM(PGLOBAL g, LPCSTR, int poff) Limit = GetIntCatInfo("Limit", 10); Base = GetIntCatInfo("Base", 0) ? 1 : 0; Sep = *GetStringCatInfo(g, "Separator", "."); + Accept = GetBoolCatInfo("Accept", false); if (Uri = GetStringCatInfo(g, "Connect", NULL)) { #if defined(JAVA_SUPPORT) || defined(CMGO_SUPPORT) @@ -1471,6 +1518,9 @@ void JSONCOL::ReadColumn(PGLOBAL g) if (!Tjp->SameRow || Xnod >= Tjp->SameRow) Value->SetValue_pval(GetColumnValue(g, Tjp->Row, 0)); + if (Xpd && Value->IsNull() && !((PJDEF)Tjp->To_Def)->Accept) + throw("Null expandable JSON value"); + // Set null when applicable if (!Nullable) Value->SetNull(false); @@ -1546,11 +1596,16 @@ PVAL JSONCOL::GetColumnValue(PGLOBAL g, PJSON row, int i) /***********************************************************************/ PVAL JSONCOL::ExpandArray(PGLOBAL g, PJAR arp, int n) { - int ars; + int ars = MY_MIN(Tjp->Limit, arp->size()); PJVAL jvp; JVALUE jval; - ars = MY_MIN(Tjp->Limit, arp->size()); + if (!ars) { + Value->Reset(); + Value->SetNull(true); + Tjp->NextSame = 0; + return Value; + } // endif ars if (!(jvp = arp->GetValue((Nodes[n].Rx = Nodes[n].Nx)))) { strcpy(g->Message, "Logical error expanding array"); @@ -1591,14 +1646,14 @@ PVAL JSONCOL::CalculateArray(PGLOBAL g, PJAR arp, int n) vp->Reset(); ars = MY_MIN(Tjp->Limit, arp->size()); - if (trace) + if (trace(1)) htrc("CalculateArray: size=%d op=%d nextsame=%d\n", ars, op, nextsame); for (i = 0; i < ars; i++) { jvrp = arp->GetValue(i); - if (trace) + if (trace(1)) htrc("i=%d nv=%d\n", i, nv); if (!jvrp->IsNull() || (op == OP_CNC && GetJsonNull())) do { @@ -1612,7 +1667,7 @@ PVAL JSONCOL::CalculateArray(PGLOBAL g, PJAR arp, int n) } else jvp = jvrp; - if (trace) + if (trace(1)) htrc("jvp=%s null=%d\n", jvp->GetString(g), jvp->IsNull() ? 1 : 0); @@ -1648,7 +1703,7 @@ PVAL JSONCOL::CalculateArray(PGLOBAL g, PJAR arp, int n) if (err) vp->Reset(); - if (trace) { + if (trace(1)) { char buf(32); htrc("vp='%s' err=%d\n", diff --git a/storage/connect/tabjson.h b/storage/connect/tabjson.h index 17583cba3..0341c0f8a 100644 --- a/storage/connect/tabjson.h +++ b/storage/connect/tabjson.h @@ -15,6 +15,7 @@ enum JMODE {MODE_OBJECT, MODE_ARRAY, MODE_VALUE}; typedef class JSONDEF *PJDEF; typedef class TDBJSON *PJTDB; typedef class JSONCOL *PJCOL; +class TDBJSN; /***********************************************************************/ /* The JSON tree node. Can be an Object or an Array. */ @@ -29,6 +30,47 @@ typedef struct _jnode { int Nx; // Next to read row number } JNODE, *PJNODE; +typedef struct _jncol { + struct _jncol *Next; + char *Name; + char *Fmt; + int Type; + int Len; + int Scale; + bool Cbn; + bool Found; +} JCOL, *PJCL; + +/***********************************************************************/ +/* Class used to get the columns of a mongo collection. */ +/***********************************************************************/ +class JSONDISC : public BLOCK { +public: + // Constructor + JSONDISC(PGLOBAL g, uint *lg); + + // Functions + int GetColumns(PGLOBAL g, PCSZ db, PCSZ dsn, PTOS topt); + bool Find(PGLOBAL g, PJVAL jvp, int j); + void AddColumn(PGLOBAL g); + + // Members + JCOL jcol; + PJCL jcp, fjcp, pjcp; + PVAL valp; + PJDEF tdp; + TDBJSN *tjnp; + PJTDB tjsp; + PJPR jpp; + PJSON jsp; + PJOB row; + PCSZ sep; + char colname[65], fmt[129], buf[16]; + uint *length; + int i, n, bf, ncol, lvl; + bool all; +}; // end of JSONDISC + /***********************************************************************/ /* JSON table. */ /***********************************************************************/ @@ -36,13 +78,13 @@ class DllExport JSONDEF : public DOSDEF { /* Table description */ friend class TDBJSON; friend class TDBJSN; friend class TDBJCL; + friend class JSONDISC; #if defined(CMGO_SUPPORT) friend class CMGFAM; #endif // CMGO_SUPPORT #if defined(JAVA_SUPPORT) friend class JMGFAM; #endif // JAVA_SUPPORT - friend PQRYRES JSONColumns(PGLOBAL, PCSZ, PCSZ, PTOS, bool); public: // Constructor JSONDEF(void); diff --git a/storage/connect/table.cpp b/storage/connect/table.cpp index 61aefc930..d4d3a34d6 100644 --- a/storage/connect/table.cpp +++ b/storage/connect/table.cpp @@ -128,7 +128,7 @@ PCOL TDB::ColDB(PGLOBAL g, PSZ name, int num) PCOLDEF cdp; PCOL cp, colp = NULL, cprec = NULL; - if (trace) + if (trace(1)) htrc("ColDB: am=%d colname=%s tabname=%s num=%d\n", GetAmType(), SVP(name), Name, num); @@ -146,7 +146,7 @@ PCOL TDB::ColDB(PGLOBAL g, PSZ name, int num) else if (cp->GetIndex() < i) cprec = cp; - if (trace) + if (trace(1)) htrc("cdp(%d).Name=%s cp=%p\n", i, cdp->GetName(), cp); /*****************************************************************/ @@ -159,7 +159,7 @@ PCOL TDB::ColDB(PGLOBAL g, PSZ name, int num) else if (Mode != MODE_INSERT) colp = InsertSpcBlk(g, cdp); - if (trace) + if (trace(1)) htrc("colp=%p\n", colp); if (name || num) @@ -256,7 +256,7 @@ PCOL TDB::InsertSpcBlk(PGLOBAL g, PCOLDEF cdp) /***********************************************************************/ void TDB::MarkDB(PGLOBAL, PTDB tdb2) { - if (trace) + if (trace(1)) htrc("DOS MarkDB: tdbp=%p tdb2=%p\n", this, tdb2); } // end of MarkDB @@ -416,7 +416,7 @@ PCOL TDBASE::ColDB(PGLOBAL g, PSZ name, int num) PCOLDEF cdp; PCOL cp, colp = NULL, cprec = NULL; - if (trace) + if (trace(1)) htrc("ColDB: am=%d colname=%s tabname=%s num=%d\n", GetAmType(), SVP(name), Name, num); @@ -434,7 +434,7 @@ PCOL TDBASE::ColDB(PGLOBAL g, PSZ name, int num) else if (cp->GetIndex() < i) cprec = cp; - if (trace) + if (trace(1)) htrc("cdp(%d).Name=%s cp=%p\n", i, cdp->GetName(), cp); /*****************************************************************/ @@ -447,7 +447,7 @@ PCOL TDBASE::ColDB(PGLOBAL g, PSZ name, int num) else if (Mode != MODE_INSERT) colp = InsertSpcBlk(g, cdp); - if (trace) + if (trace(1)) htrc("colp=%p\n", colp); if (name || num) @@ -592,7 +592,7 @@ void TDBASE::PrintAM(FILE *f, char *m) /***********************************************************************/ void TDBASE::MarkDB(PGLOBAL, PTDB tdb2) { - if (trace) + if (trace(1)) htrc("DOS MarkDB: tdbp=%p tdb2=%p\n", this, tdb2); } // end of MarkDB diff --git a/storage/connect/tabmac.cpp b/storage/connect/tabmac.cpp index a28b5d710..8260ab653 100644 --- a/storage/connect/tabmac.cpp +++ b/storage/connect/tabmac.cpp @@ -367,13 +367,13 @@ void MACCOL::ReadColumn(PGLOBAL g) case 11: // Description if ((p = strstr(adp->Description, " - Packet Scheduler Miniport"))) { strncpy(buf, adp->Description, p - adp->Description); - i = p - adp->Description; + i = (int)(p - adp->Description); strncpy(buf, adp->Description, i); buf[i] = 0; p = buf; } else if ((p = strstr(adp->Description, " - Miniport d'ordonnancement de paquets"))) { - i = p - adp->Description; + i = (int)(p - adp->Description); strncpy(buf, adp->Description, i); buf[i] = 0; p = buf; diff --git a/storage/connect/tabmul.cpp b/storage/connect/tabmul.cpp index 0967afca6..649fc6706 100644 --- a/storage/connect/tabmul.cpp +++ b/storage/connect/tabmul.cpp @@ -134,7 +134,7 @@ bool TDBMUL::InitFileNames(PGLOBAL g) PSZ filename; int rc, n = 0; - if (trace) + if (trace(1)) htrc("in InitFileName: fn[]=%d\n", FNSZ); filename = (char*)PlugSubAlloc(g, NULL, FNSZ); @@ -144,7 +144,7 @@ bool TDBMUL::InitFileNames(PGLOBAL g) PlugSetPath(filename, Tdbp->GetFile(g), Tdbp->GetPath()); - if (trace) + if (trace(1)) htrc("InitFileName: fn='%s'\n", filename); if (Mul != 2) { @@ -159,7 +159,7 @@ bool TDBMUL::InitFileNames(PGLOBAL g) if (dirp->OpenDB(g)) return true; - if (trace && Mul == 3) { + if (trace(1) && Mul == 3) { int nf = ((PTDBSDR)dirp)->FindInDir(g); htrc("Number of files = %d\n", nf); } // endif trace @@ -319,7 +319,7 @@ int TDBMUL::GetMaxSize(PGLOBAL g) int i; int mxsz; - if (trace) + if (trace(1)) htrc("TDBMUL::GetMaxSize: Filenames=%p\n", Filenames); if (!Filenames && InitFileNames(g)) @@ -375,7 +375,7 @@ int TDBMUL::RowNumber(PGLOBAL g, bool b) /***********************************************************************/ bool TDBMUL::OpenDB(PGLOBAL g) { - if (trace) + if (trace(1)) htrc("MUL OpenDB: tdbp=%p tdb=R%d use=%d key=%p mode=%d\n", this, Tdb_No, Use, To_Key_Col, Mode); @@ -546,7 +546,7 @@ bool TDBMSD::InitFileNames(PGLOBAL g) PSZ filename; int rc, n = 0; - if (trace) + if (trace(1)) htrc("in InitFileName: fn[]=%d\n", FNSZ); filename = (char*)PlugSubAlloc(g, NULL, FNSZ); @@ -556,7 +556,7 @@ bool TDBMSD::InitFileNames(PGLOBAL g) PlugSetPath(filename, Tdbp->GetFile(g), Tdbp->GetPath()); - if (trace) + if (trace(1)) htrc("InitFileName: fn='%s'\n", filename); dirp = new(g) TDBSDR(filename); @@ -787,7 +787,7 @@ int TDBDIR::GetMaxSize(PGLOBAL g) /***********************************************************************/ bool TDBDIR::OpenDB(PGLOBAL g) { - if (trace) + if (trace(1)) htrc("DIR OpenDB: tdbp=%p tdb=R%d use=%d mode=%d\n", this, Tdb_No, Use, Mode); @@ -985,7 +985,7 @@ void DIRCOL::SetTimeValue(PGLOBAL g, FILETIME& ftime) /***********************************************************************/ void DIRCOL::ReadColumn(PGLOBAL g) { - if (trace) + if (trace(1)) htrc("DIR ReadColumn: col %s R%d use=%.4X status=%.4X type=%d N=%d\n", Name, Tdbp->GetTdb_No(), ColUse, Status, Buf_Type, N); @@ -1452,7 +1452,7 @@ int TDBDHR::GetMaxSize(PGLOBAL g) /***********************************************************************/ bool TDBDHR::OpenDB(PGLOBAL g) { - if (trace) + if (trace(1)) htrc("DHR OpenDB: tdbp=%p tdb=R%d use=%d mode=%d\n", this, Tdb_No, Use, Mode); @@ -1589,7 +1589,7 @@ void DHRCOL::ReadColumn(PGLOBAL g) int rc; PTDBDHR tdbp = (PTDBDHR)To_Tdb; - if (trace) + if (trace(1)) htrc("DHR ReadColumn: col %s R%d use=%.4X status=%.4X type=%d N=%d\n", Name, tdbp->GetTdb_No(), ColUse, Status, Buf_Type, N); diff --git a/storage/connect/tabmysql.cpp b/storage/connect/tabmysql.cpp index d1e2ae696..605b38224 100644 --- a/storage/connect/tabmysql.cpp +++ b/storage/connect/tabmysql.cpp @@ -124,8 +124,8 @@ bool MYSQLDEF::GetServerInfo(PGLOBAL g, const char *server_name) DBUG_RETURN(true); } // endif server - DBUG_PRINT("info", ("get_server_by_name returned server at %lx", - (size_t) server)); + DBUG_PRINT("info", ("get_server_by_name returned server at %p", + server)); // TODO: We need to examine which of these can really be NULL Hostname = PlugDup(g, server->host); @@ -203,7 +203,7 @@ bool MYSQLDEF::ParseURL(PGLOBAL g, char *url, bool b) // Otherwise, straight server name, Tabname = (b) ? GetStringCatInfo(g, "Tabname", Name) : NULL; - if (trace) + if (trace(1)) htrc("server: %s TableName: %s", url, Tabname); Server = url; @@ -567,7 +567,7 @@ bool TDBMYSQL::MakeSelect(PGLOBAL g, bool mx) return true; } // endif Query - if (trace) + if (trace(33)) htrc("Query=%s\n", Query->GetStr()); return false; @@ -681,7 +681,7 @@ bool TDBMYSQL::MakeCommand(PGLOBAL g) strlwr(strcpy(name, Name)); // Not a keyword if ((p = strstr(qrystr, name))) { - Query->Set(Qrystr, p - qrystr); + Query->Set(Qrystr, (uint)(p - qrystr)); if (qtd && *(p-1) == ' ') { Query->Append('`'); @@ -1042,7 +1042,7 @@ int TDBMYSQL::SendCommand(PGLOBAL g) sprintf(g->Message, "%s: %d affected rows", TableName, AftRows); PushWarning(g, this, 0); // 0 means a Note - if (trace) + if (trace(1)) htrc("%s\n", g->Message); if (w && Myc.ExecSQL(g, "SHOW WARNINGS") == RC_OK) { @@ -1109,7 +1109,7 @@ bool TDBMYSQL::ReadKey(PGLOBAL g, OPVAL op, const key_range *kr) Mode = MODE_READ; } // endif's op - if (trace) + if (trace(33)) htrc("MYSQL ReadKey: Query=%s\n", Query->GetStr()); m_Rc = Myc.ExecSQL(g, Query->GetStr()); @@ -1124,7 +1124,7 @@ int TDBMYSQL::ReadDB(PGLOBAL g) { int rc; - if (trace > 1) + if (trace(2)) htrc("MySQL ReadDB: R%d Mode=%d\n", GetTdb_No(), Mode); if (Mode == MODE_UPDATE || Mode == MODE_DELETE) @@ -1137,7 +1137,7 @@ int TDBMYSQL::ReadDB(PGLOBAL g) N++; Fetched = ((rc = Myc.Fetch(g, -1)) == RC_OK); - if (trace > 1) + if (trace(2)) htrc(" Read: rc=%d\n", rc); return rc; @@ -1220,7 +1220,7 @@ void TDBMYSQL::CloseDB(PGLOBAL g) Myc.Close(); } // endif Myc - if (trace) + if (trace(1)) htrc("MySQL CloseDB: closing %s rc=%d\n", Name, m_Rc); } // end of CloseDB @@ -1248,7 +1248,7 @@ MYSQLCOL::MYSQLCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PCSZ am) Slen = 0; Rank = -1; // Not known yet - if (trace) + if (trace(1)) htrc(" making new %sCOL C%d %s at %p\n", am, Index, Name, this); } // end of MYSQLCOL constructor @@ -1279,7 +1279,7 @@ MYSQLCOL::MYSQLCOL(MYSQL_FIELD *fld, PTDB tdbp, int i, PCSZ am) Slen = 0; Rank = i; - if (trace) + if (trace(1)) htrc(" making new %sCOL C%d %s at %p\n", am, Index, Name, this); } // end of MYSQLCOL constructor @@ -1409,7 +1409,7 @@ void MYSQLCOL::ReadColumn(PGLOBAL g) tdbp->Fetched = true; if ((buf = ((PTDBMY)To_Tdb)->Myc.GetCharField(Rank))) { - if (trace > 1) + if (trace(2)) htrc("MySQL ReadColumn: name=%s buf=%s\n", Name, buf); // TODO: have a true way to differenciate temporal values @@ -1679,7 +1679,7 @@ MYXCOL::MYXCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PCSZ am) MYXCOL::MYXCOL(MYSQL_FIELD *fld, PTDB tdbp, int i, PCSZ am) : MYSQLCOL(fld, tdbp, i, am) { - if (trace) + if (trace(1)) htrc(" making new %sCOL C%d %s at %p\n", am, Index, Name, this); } // end of MYSQLCOL constructor diff --git a/storage/connect/tabodbc.cpp b/storage/connect/tabodbc.cpp index 56e5e72ef..f7bc3934f 100644 --- a/storage/connect/tabodbc.cpp +++ b/storage/connect/tabodbc.cpp @@ -289,7 +289,7 @@ void TDBODBC::SetFile(PGLOBAL g, PCSZ fn) sprintf(Connect, MulConn, fn); } // endif MultConn - DBQ = (PSZ)fn; + DBQ = PlugDup(g, fn); } // end of SetFile /***********************************************************************/ @@ -538,7 +538,7 @@ bool TDBODBC::OpenDB(PGLOBAL g) { bool rc = true; - if (trace) + if (trace(1)) htrc("ODBC OpenDB: tdbp=%p tdb=R%d use=%dmode=%d\n", this, Tdb_No, Use, Mode); @@ -750,7 +750,7 @@ bool TDBODBC::ReadKey(PGLOBAL g, OPVAL op, const key_range *kr) Mode = MODE_READ; } // endif's op - if (trace) + if (trace(33)) htrc("ODBC ReadKey: Query=%s\n", Query->GetStr()); Rows = Ocp->ExecDirectSQL((char*)Query->GetStr(), (PODBCCOL)Columns); @@ -765,7 +765,7 @@ int TDBODBC::ReadDB(PGLOBAL g) { int rc; - if (trace > 1) + if (trace(2)) htrc("ODBC ReadDB: R%d Mode=%d\n", GetTdb_No(), Mode); if (Mode == MODE_UPDATE || Mode == MODE_DELETE) { @@ -776,7 +776,7 @@ int TDBODBC::ReadDB(PGLOBAL g) if (!Ocp->ExecSQLcommand(Query->GetStr())) { sprintf(g->Message, "%s: %d affected rows", TableName, AftRows); - if (trace) + if (trace(1)) htrc("%s\n", g->Message); PushWarning(g, this, 0); // 0 means a Note @@ -817,7 +817,7 @@ int TDBODBC::ReadDB(PGLOBAL g) } // endif Placed - if (trace > 1) + if (trace(2)) htrc(" Read: Rbuf=%d rc=%d\n", Rbuf, rc); return rc; @@ -852,7 +852,7 @@ int TDBODBC::DeleteDB(PGLOBAL g, int irc) if (!Ocp->ExecSQLcommand(Query->GetStr())) { sprintf(g->Message, "%s: %d affected rows", TableName, AftRows); - if (trace) + if (trace(1)) htrc("%s\n", g->Message); PushWarning(g, this, 0); // 0 means a Note @@ -874,7 +874,7 @@ void TDBODBC::CloseDB(PGLOBAL g) Ocp->Close(); - if (trace) + if (trace(1)) htrc("ODBC CloseDB: closing %s\n", Name); } // end of CloseDB @@ -975,7 +975,7 @@ void ODBCCOL::ReadColumn(PGLOBAL g) } // endif Buf_Type - if (trace > 1) { + if (trace(2)) { char buf[64]; htrc("ODBC Column %s: rows=%d buf=%p type=%d value=%s\n", @@ -1214,7 +1214,7 @@ bool TDBXDBC::OpenDB(PGLOBAL g) { bool rc = false; - if (trace) + if (trace(1)) htrc("ODBC OpenDB: tdbp=%p tdb=R%d use=%dmode=%d\n", this, Tdb_No, Use, Mode); diff --git a/storage/connect/tabpivot.cpp b/storage/connect/tabpivot.cpp index 76a46e689..da5d134f3 100644 --- a/storage/connect/tabpivot.cpp +++ b/storage/connect/tabpivot.cpp @@ -299,7 +299,7 @@ PQRYRES PIVAID::MakePivotColumns(PGLOBAL g) Qryp->Nbcol += (ndif - 2); return Qryp; } catch (int n) { - if (trace) + if (trace(1)) htrc("Exception %d: %s\n", n, g->Message); } catch (const char *msg) { strcpy(g->Message, msg); diff --git a/storage/connect/tabsys.cpp b/storage/connect/tabsys.cpp index 7f0d98812..f73a2b657 100644 --- a/storage/connect/tabsys.cpp +++ b/storage/connect/tabsys.cpp @@ -180,7 +180,7 @@ PTDB TDBINI::Clone(PTABS t) /***********************************************************************/ char *TDBINI::GetSeclist(PGLOBAL g) { - if (trace) + if (trace(1)) htrc("GetSeclist: Seclist=%p\n", Seclist); if (!Seclist) { @@ -267,7 +267,7 @@ bool TDBINI::OpenDB(PGLOBAL g) if (!colp->IsSpecial()) // Not a pseudo column colp->AllocBuf(g); - if (trace) + if (trace(1)) htrc("INI OpenDB: seclist=%s seclen=%d ifile=%s\n", Seclist, Seclen, Ifile); @@ -287,7 +287,7 @@ int TDBINI::ReadDB(PGLOBAL) else Section += (strlen(Section) + 1); - if (trace > 1) + if (trace(2)) htrc("INI ReadDB: section=%s N=%d\n", Section, N); N++; @@ -453,7 +453,7 @@ void INICOL::ReadColumn(PGLOBAL) { PTDBINI tdbp = (PTDBINI)To_Tdb; - if (trace > 1) + if (trace(2)) htrc("INI ReadColumn: col %s R%d flag=%d\n", Name, tdbp->GetTdb_No(), Flag); @@ -493,7 +493,7 @@ void INICOL::WriteColumn(PGLOBAL g) bool rc; PTDBINI tdbp = (PTDBINI)To_Tdb; - if (trace > 1) + if (trace(2)) htrc("INI WriteColumn: col %s R%d coluse=%.4X status=%.4X\n", Name, tdbp->GetTdb_No(), ColUse, Status); @@ -823,7 +823,7 @@ void XINCOL::WriteColumn(PGLOBAL g) bool rc; PTDBXIN tdbp = (PTDBXIN)To_Tdb; - if (trace > 1) + if (trace(2)) htrc("XIN WriteColumn: col %s R%d coluse=%.4X status=%.4X\n", Name, tdbp->GetTdb_No(), ColUse, Status); diff --git a/storage/connect/tabtbl.cpp b/storage/connect/tabtbl.cpp index 7925e8f29..e194568cc 100644 --- a/storage/connect/tabtbl.cpp +++ b/storage/connect/tabtbl.cpp @@ -132,7 +132,7 @@ bool TBLDEF::DefineAM(PGLOBAL g, LPCSTR, int) tbl = new(g) XTAB(pn, def); tbl->SetSchema(pdb); - if (trace) + if (trace(1)) htrc("TBL: Name=%s db=%s\n", tbl->GetName(), tbl->GetSchema()); // Link the blocks @@ -436,7 +436,7 @@ int TDBTBL::RowNumber(PGLOBAL g, bool b) /***********************************************************************/ bool TDBTBL::OpenDB(PGLOBAL g) { - if (trace) + if (trace(1)) htrc("TBL OpenDB: tdbp=%p tdb=R%d use=%d key=%p mode=%d\n", this, Tdb_No, Use, To_Key_Col, Mode); @@ -475,7 +475,7 @@ bool TDBTBL::OpenDB(PGLOBAL g) else if (((PPRXCOL)cp)->Init(g, NULL) && !Accept) return TRUE; - if (trace) + if (trace(1)) htrc("Opening subtable %s\n", Tdbp->GetName()); // Now we can safely open the table @@ -530,7 +530,7 @@ int TDBTBL::ReadDB(PGLOBAL g) else if (((PPRXCOL)cp)->Init(g, NULL) && !Accept) return RC_FX; - if (trace) + if (trace(1)) htrc("Opening subtable %s\n", Tdbp->GetName()); // Now we can safely open the table @@ -555,7 +555,7 @@ int TDBTBL::ReadDB(PGLOBAL g) /***********************************************************************/ void TBTBLK::ReadColumn(PGLOBAL) { - if (trace) + if (trace(1)) htrc("TBT ReadColumn: name=%s\n", Name); Value->SetValue_psz((char*)((PTDBTBL)To_Tdb)->Tdbp->GetName()); @@ -575,27 +575,30 @@ pthread_handler_t ThreadOpen(void *p) if (!my_thread_init()) { set_current_thd(cmp->Thd); - if (trace) + if (trace(1)) htrc("ThreadOpen: Thd=%d\n", cmp->Thd); // Try to open the connection - if (!cmp->Tap->GetTo_Tdb()->OpenDB(cmp->G)) { - pthread_mutex_lock(&tblmut); - if (trace) + pthread_mutex_lock(&tblmut); + + if (!cmp->Tap->GetTo_Tdb()->OpenDB(cmp->G)) { +// pthread_mutex_lock(&tblmut); + if (trace(1)) htrc("Table %s ready\n", cmp->Tap->GetName()); cmp->Ready = true; - pthread_mutex_unlock(&tblmut); +// pthread_mutex_unlock(&tblmut); } else { - pthread_mutex_lock(&tblmut); - if (trace) +// pthread_mutex_lock(&tblmut); + if (trace(1)) htrc("Opening %s failed\n", cmp->Tap->GetName()); cmp->Rc = RC_FX; - pthread_mutex_unlock(&tblmut); +// pthread_mutex_unlock(&tblmut); } // endif OpenDB - my_thread_end(); + pthread_mutex_unlock(&tblmut); + my_thread_end(); } else cmp->Rc = RC_FX; @@ -672,7 +675,7 @@ bool TDBTBM::OpenTables(PGLOBAL g) // Remove remote table from the local list *ptabp = tabp->Next; - if (trace) + if (trace(1)) htrc("=====> New remote table %s\n", tabp->GetName()); // Make the remote table block @@ -698,7 +701,7 @@ bool TDBTBM::OpenTables(PGLOBAL g) ptp = &tp->Next; Nrc++; // Number of remote connections } else { - if (trace) + if (trace(1)) htrc("=====> Local table %s\n", tabp->GetName()); ptabp = &tabp->Next; @@ -714,7 +717,7 @@ bool TDBTBM::OpenTables(PGLOBAL g) /***********************************************************************/ bool TDBTBM::OpenDB(PGLOBAL g) { - if (trace) + if (trace(1)) htrc("TBM OpenDB: tdbp=%p tdb=R%d use=%d key=%p mode=%d\n", this, Tdb_No, Use, To_Key_Col, Mode); @@ -762,7 +765,7 @@ bool TDBTBM::OpenDB(PGLOBAL g) else if (((PPRXCOL)cp)->Init(g, NULL) && !Accept) return TRUE; - if (trace) + if (trace(1)) htrc("Opening subtable %s\n", Tdbp->GetName()); // Now we can safely open the table @@ -863,7 +866,7 @@ int TDBTBM::ReadNextRemote(PGLOBAL g) else if (((PPRXCOL)cp)->Init(g, NULL) && !Accept) return RC_FX; - if (trace) + if (trace(1)) htrc("Reading subtable %s\n", Tdbp->GetName()); return RC_OK; diff --git a/storage/connect/tabutil.cpp b/storage/connect/tabutil.cpp index 5d8d7c1b9..68b66aec3 100644 --- a/storage/connect/tabutil.cpp +++ b/storage/connect/tabutil.cpp @@ -457,7 +457,7 @@ PTDB TDBPRX::GetSubTable(PGLOBAL g, PTABLE tabp, bool b) hc->get_table()->s->option_struct->srcdef = sp; } // endif s - if (trace && tdbp) + if (trace(1) && tdbp) htrc("Subtable %s in %s\n", name, SVP(tdbp->GetDef()->GetDB())); @@ -647,7 +647,7 @@ PRXCOL::PRXCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PCSZ am) Pseudo = false; Colnum = cdp->GetOffset(); // If columns are retrieved by number - if (trace) + if (trace(1)) htrc(" making new %sCOL C%d %s at %p\n", am, Index, Name, this); } // end of PRXCOL constructor @@ -732,7 +732,7 @@ void PRXCOL::Reset(void) /***********************************************************************/ void PRXCOL::ReadColumn(PGLOBAL g) { - if (trace > 1) + if (trace(2)) htrc("PRX ReadColumn: name=%s\n", Name); if (Colp) { @@ -759,7 +759,7 @@ void PRXCOL::ReadColumn(PGLOBAL g) /***********************************************************************/ void PRXCOL::WriteColumn(PGLOBAL g) { - if (trace > 1) + if (trace(2)) htrc("PRX WriteColumn: name=%s\n", Name); if (Colp) { diff --git a/storage/connect/tabvct.cpp b/storage/connect/tabvct.cpp index 533986e44..11b344ef6 100644 --- a/storage/connect/tabvct.cpp +++ b/storage/connect/tabvct.cpp @@ -304,7 +304,7 @@ bool TDBVCT::IsUsingTemp(PGLOBAL) /***********************************************************************/ bool TDBVCT::OpenDB(PGLOBAL g) { - if (trace) + if (trace(1)) htrc("VCT OpenDB: tdbp=%p tdb=R%d use=%d key=%p mode=%d\n", this, Tdb_No, Use, To_Key_Col, Mode); @@ -364,7 +364,7 @@ bool TDBVCT::OpenDB(PGLOBAL g) /***********************************************************************/ int TDBVCT::ReadDB(PGLOBAL g) { - if (trace) + if (trace(1)) htrc("VCT ReadDB: R%d Mode=%d CurBlk=%d CurNum=%d key=%p link=%p Kindex=%p\n", GetTdb_No(), Mode, Txfp->CurBlk, Txfp->CurNum, To_Key_Col, To_Link, To_Kindex); @@ -546,7 +546,7 @@ void VCTCOL::ReadColumn(PGLOBAL g) assert (!To_Kcol); #endif - if (trace > 1) + if (trace(2)) htrc("VCT ReadColumn: col %s R%d coluse=%.4X status=%.4X buf_type=%d\n", Name, To_Tdb->GetTdb_No(), ColUse, Status, Buf_Type); @@ -574,7 +574,7 @@ void VCTCOL::WriteColumn(PGLOBAL) { PTXF txfp = ((PTDBVCT)To_Tdb)->Txfp;; - if (trace > 1) + if (trace(2)) htrc("VCT WriteColumn: col %s R%d coluse=%.4X status=%.4X buf_type=%d\n", Name, To_Tdb->GetTdb_No(), ColUse, Status, Buf_Type); diff --git a/storage/connect/tabwmi.cpp b/storage/connect/tabwmi.cpp index 335ffce5d..8a8e1bcbc 100644 --- a/storage/connect/tabwmi.cpp +++ b/storage/connect/tabwmi.cpp @@ -34,7 +34,7 @@ PWMIUT InitWMI(PGLOBAL g, PCSZ nsp, PCSZ classname) HRESULT res; PWMIUT wp = (PWMIUT)PlugSubAlloc(g, NULL, sizeof(WMIUTIL)); - if (trace) + if (trace(1)) htrc("WMIColumns class %s space %s\n", SVP(classname), SVP(nsp)); /*********************************************************************/ @@ -103,7 +103,7 @@ PWMIUT InitWMI(PGLOBAL g, PCSZ nsp, PCSZ classname) loc->Release(); - if (trace) + if (trace(1)) htrc("Successfully connected to namespace.\n"); /*********************************************************************/ diff --git a/storage/connect/tabxml.cpp b/storage/connect/tabxml.cpp index 6402f48e0..c96e08444 100644 --- a/storage/connect/tabxml.cpp +++ b/storage/connect/tabxml.cpp @@ -153,7 +153,7 @@ PQRYRES XMLColumns(PGLOBAL g, char *db, char *tab, PTOS topt, bool info) lvl = (lvl < 0) ? 0 : (lvl > 16) ? 16 : lvl; } // endif fn - if (trace) + if (trace(1)) htrc("File %s lvl=%d\n", topt->filename, lvl); tdp = new(g) XMLDEF; @@ -362,7 +362,7 @@ PQRYRES XMLColumns(PGLOBAL g, char *db, char *tab, PTOS topt, bool info) txmp->CloseDB(g); skipit: - if (trace) + if (trace(1)) htrc("XMLColumns: n=%d len=%d\n", n, length[0]); /*********************************************************************/ @@ -686,7 +686,7 @@ PTDB TDBXML::Clone(PTABS t) /***********************************************************************/ PCOL TDBXML::MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n) { - if (trace) + if (trace(1)) htrc("TDBXML: MakeCol %s n=%d\n", (cdp) ? cdp->GetName() : "", n); return new(g) XMLCOL(cdp, this, cprec, n); @@ -720,7 +720,7 @@ int TDBXML::LoadTableFile(PGLOBAL g, char *filename) if (Docp) return rc; // Already done - if (trace) + if (trace(1)) htrc("TDBXML: loading %s\n", filename); /*********************************************************************/ @@ -753,7 +753,7 @@ int TDBXML::LoadTableFile(PGLOBAL g, char *filename) return RC_FX; } // endif init - if (trace) + if (trace(1)) htrc("TDBXML: parsing %s rc=%d\n", filename, rc); // Parse the XML file @@ -1182,7 +1182,7 @@ int TDBXML::ReadDB(PGLOBAL g) } // endswitch recpos } else { - if (trace) + if (trace(1)) htrc("TDBXML ReadDB: Irow=%d Nrow=%d\n", Irow, Nrow); // This is to force the table to be expanded when constructing @@ -1209,7 +1209,7 @@ int TDBXML::ReadDB(PGLOBAL g) } // endif To_Kindex if (!same) { - if (trace > 1) + if (trace(2)) htrc("TDBXML ReadDB: Irow=%d RowNode=%p\n", Irow, RowNode); // Get the new row node @@ -1319,7 +1319,7 @@ void TDBXML::CloseDB(PGLOBAL g) Docp->CloseDoc(g, To_Xb); // This causes a crash in Diagnostics_area::set_error_status -// throw (int)TYPE_AM_XML; +// throw (int)TYPE_AM_XML; } // endif DumpDoc } // endif Changed @@ -1472,7 +1472,7 @@ bool XMLCOL::ParseXpath(PGLOBAL g, bool mode) } else strcat(pbuf, Xname); - if (trace) + if (trace(1)) htrc("XMLCOL: pbuf=%s\n", pbuf); // For Update or Insert the Xpath must be analyzed @@ -1555,7 +1555,7 @@ bool XMLCOL::ParseXpath(PGLOBAL g, bool mode) if (Type || Nod) Tdbp->Hasnod = true; - if (trace) + if (trace(1)) htrc("XMLCOL: Xname=%s\n", pbuf); // Save the calculated Xpath @@ -1679,7 +1679,7 @@ void XMLCOL::WriteColumn(PGLOBAL g) int i, n, k = 0; PXNODE TopNode = NULL; - if (trace > 1) + if (trace(2)) htrc("XML WriteColumn: col %s R%d coluse=%.4X status=%.4X\n", Name, Tdbp->GetTdb_No(), ColUse, Status); @@ -1913,7 +1913,7 @@ void XMULCOL::WriteColumn(PGLOBAL g) int i, n, len, k = 0; PXNODE TopNode = NULL; - if (trace) + if (trace(1)) htrc("XML WriteColumn: col %s R%d coluse=%.4X status=%.4X\n", Name, Tdbp->GetTdb_No(), ColUse, Status); @@ -2129,7 +2129,7 @@ void XPOSCOL::WriteColumn(PGLOBAL g) char *p, buf[16]; int i, k, n; - if (trace) + if (trace(1)) htrc("XML WriteColumn: col %s R%d coluse=%.4X status=%.4X\n", Name, Tdbp->GetTdb_No(), ColUse, Status); diff --git a/storage/connect/user_connect.cc b/storage/connect/user_connect.cc index cb62667c0..9532d7c2a 100644 --- a/storage/connect/user_connect.cc +++ b/storage/connect/user_connect.cc @@ -178,7 +178,7 @@ bool user_connect::CheckCleanup(bool force) g->Mrr = 0; last_query_id= thdp->query_id; - if (trace && !force) + if (trace(65) && !force) printf("=====> Begin new query %llu\n", last_query_id); return true; diff --git a/storage/connect/valblk.cpp b/storage/connect/valblk.cpp index 018c7ee3f..73ca13569 100644 --- a/storage/connect/valblk.cpp +++ b/storage/connect/valblk.cpp @@ -53,7 +53,7 @@ PVBLK AllocValBlock(PGLOBAL g, void *mp, int type, int nval, int len, { PVBLK blkp; - if (trace) + if (trace(1)) htrc("AVB: mp=%p type=%d nval=%d len=%d check=%u blank=%u\n", mp, type, nval, len, check, blank); diff --git a/storage/connect/value.cpp b/storage/connect/value.cpp index 74a3a1f80..e159efaa9 100644 --- a/storage/connect/value.cpp +++ b/storage/connect/value.cpp @@ -337,7 +337,7 @@ PVAL AllocateValue(PGLOBAL g, void *value, short type, short prec) { PVAL valp; - if (trace) + if (trace(1)) htrc("AllocateConstant: value=%p type=%hd\n", value, type); switch (type) { @@ -727,7 +727,7 @@ bool TYPVAL::SetValue_char(const char *p, int n) else Tval = (TYPE)val; - if (trace > 1) { + if (trace(2)) { char buf[64]; htrc(strcat(strcat(strcpy(buf, " setting %s to: "), Fmt), "\n"), GetTypeName(Type), Tval); @@ -750,7 +750,7 @@ bool TYPVAL::SetValue_char(const char *p, int n) buf[n] = '\0'; Tval = atof(buf); - if (trace > 1) + if (trace(2)) htrc(" setting double: '%s' -> %lf\n", buf, Tval); Null = false; @@ -996,7 +996,7 @@ int TYPVAL::CompareValue(PVAL vp) // Process filtering on numeric values. TYPE n = GetTypedValue(vp); -//if (trace) +//if (trace(1)) // htrc(" Comparing: val=%d,%d\n", Tval, n); return (Tval > n) ? 1 : (Tval < n) ? (-1) : 0; @@ -1384,7 +1384,7 @@ bool TYPVAL::SetValue_char(const char *cp, int n) strncpy(Strp, cp, n); Strp[n] = '\0'; - if (trace > 1) + if (trace(2)) htrc(" Setting string to: '%s'\n", Strp); } else @@ -1631,7 +1631,7 @@ int TYPVAL::CompareValue(PVAL vp) int n; //assert(vp->GetType() == Type); - if (trace) + if (trace(1)) htrc(" Comparing: val='%s','%s'\n", Strp, vp->GetCharValue()); // Process filtering on character strings. @@ -1656,14 +1656,14 @@ bool TYPVAL::Compute(PGLOBAL g, PVAL *vp, int np, OPVAL op) char *p[2], val[2][32]; int i; - if (trace) + if (trace(1)) htrc("Compute: np=%d op=%d\n", np, op); for (i = 0; i < np; i++) if (!vp[i]->IsNull()) { p[i] = vp[i]->GetCharString(val[i]); - if (trace) + if (trace(1)) htrc("p[%d]=%s\n", i, p[i]); } else @@ -1679,7 +1679,7 @@ bool TYPVAL::Compute(PGLOBAL g, PVAL *vp, int np, OPVAL op) if ((i = Len - (signed)strlen(Strp)) > 0) strncat(Strp, p[np - 1], i); - if (trace) + if (trace(1)) htrc("Strp=%s\n", Strp); break; @@ -1747,7 +1747,7 @@ DECVAL::DECVAL(PSZ s) : TYPVAL(s) if (s) { char *p = strchr(Strp, '.'); - Prec = (p) ? Len - (p - Strp) : 0; + Prec = (p) ? (int)(Len - (p - Strp)) : 0; } // endif s Type = TYPE_DECIM; @@ -1854,7 +1854,7 @@ int DECVAL::CompareValue(PVAL vp) // Process filtering on numeric values. double f = atof(Strp), n = vp->GetFloatValue(); -//if (trace) +//if (trace(1)) // htrc(" Comparing: val=%d,%d\n", f, n); return (f > n) ? 1 : (f < n) ? (-1) : 0; @@ -2410,7 +2410,7 @@ void DTVAL::SetTimeShift(void) Shift = (int)mktime(&dtm) - 86400; - if (trace) + if (trace(1)) htrc("DTVAL Shift=%d\n", Shift); } // end of SetTimeShift @@ -2485,7 +2485,7 @@ bool DTVAL::MakeTime(struct tm *ptm) int n, y = ptm->tm_year; time_t t = mktime_mysql(ptm); - if (trace > 1) + if (trace(2)) htrc("MakeTime from (%d,%d,%d,%d,%d,%d)\n", ptm->tm_year, ptm->tm_mon, ptm->tm_mday, ptm->tm_hour, ptm->tm_min, ptm->tm_sec); @@ -2508,7 +2508,7 @@ bool DTVAL::MakeTime(struct tm *ptm) } Tval= (int) t; - if (trace > 1) + if (trace(2)) htrc("MakeTime Ival=%d\n", Tval); return false; @@ -2528,14 +2528,14 @@ bool DTVAL::MakeDate(PGLOBAL g, int *val, int nval) datm.tm_mon=0; datm.tm_year=70; - if (trace > 1) + if (trace(2)) htrc("MakeDate from(%d,%d,%d,%d,%d,%d) nval=%d\n", val[0], val[1], val[2], val[3], val[4], val[5], nval); for (i = 0; i < nval; i++) { n = val[i]; -// if (trace > 1) +// if (trace(2)) // htrc("i=%d n=%d\n", i, n); switch (i) { @@ -2545,7 +2545,7 @@ bool DTVAL::MakeDate(PGLOBAL g, int *val, int nval) datm.tm_year = n; -// if (trace > 1) +// if (trace(2)) // htrc("n=%d tm_year=%d\n", n, datm.tm_year); break; @@ -2564,7 +2564,7 @@ bool DTVAL::MakeDate(PGLOBAL g, int *val, int nval) datm.tm_mon = m; datm.tm_year += n; -// if (trace > 1) +// if (trace(2)) // htrc("n=%d m=%d tm_year=%d tm_mon=%d\n", n, m, datm.tm_year, datm.tm_mon); break; @@ -2581,7 +2581,7 @@ bool DTVAL::MakeDate(PGLOBAL g, int *val, int nval) datm.tm_mday = m; datm.tm_year += n; -// if (trace > 1) +// if (trace(2)) // htrc("n=%d m=%d tm_year=%d tm_mon=%d\n", n, m, datm.tm_year, datm.tm_mon); break; @@ -2592,7 +2592,7 @@ bool DTVAL::MakeDate(PGLOBAL g, int *val, int nval) } // endfor i - if (trace > 1) + if (trace(2)) htrc("MakeDate datm=(%d,%d,%d,%d,%d,%d)\n", datm.tm_year, datm.tm_mon, datm.tm_mday, datm.tm_hour, datm.tm_min, datm.tm_sec); @@ -2656,7 +2656,7 @@ bool DTVAL::SetValue_char(const char *p, int n) // Trim trailing blanks for (p2 = p + n -1; p < p2 && *p2 == ' '; p2--); - if ((rc = (n = p2 - p + 1) > Len)) + if ((rc = (n = (int)(p2 - p + 1)) > Len)) n = Len; memcpy(Sdate, p, n); @@ -2667,7 +2667,7 @@ bool DTVAL::SetValue_char(const char *p, int n) ndv = ExtractDate(Sdate, Pdtp, DefYear, dval); MakeDate(NULL, dval, ndv); - if (trace > 1) + if (trace(2)) htrc(" setting date: '%s' -> %d\n", Sdate, Tval); Null = (Nullable && ndv == 0); @@ -2694,7 +2694,7 @@ void DTVAL::SetValue_psz(PCSZ p) ndv = ExtractDate(Sdate, Pdtp, DefYear, dval); MakeDate(NULL, dval, ndv); - if (trace > 1) + if (trace(2)) htrc(" setting date: '%s' -> %d\n", Sdate, Tval); Null = (Nullable && ndv == 0); @@ -2849,13 +2849,13 @@ bool DTVAL::FormatValue(PVAL vp, PCSZ fmt) char *buf = (char*)vp->GetTo_Val(); // Should be big enough struct tm tm, *ptm = GetGmTime(&tm); - if (trace > 1) + if (trace(2)) htrc("FormatValue: ptm=%p len=%d\n", ptm, vp->GetValLen()); if (ptm) { size_t n = strftime(buf, vp->GetValLen(), fmt, ptm); - if (trace > 1) + if (trace(2)) htrc("strftime: n=%d buf=%s\n", n, (n) ? buf : "???"); return (n == 0); diff --git a/storage/connect/xindex.cpp b/storage/connect/xindex.cpp index 30dce3b7f..efefc17b5 100755 --- a/storage/connect/xindex.cpp +++ b/storage/connect/xindex.cpp @@ -344,7 +344,7 @@ bool XINDEX::Make(PGLOBAL g, PIXDEF sxp) } // endif n - if (trace) + if (trace(1)) htrc("XINDEX Make: n=%d\n", n); // File position must be stored @@ -417,7 +417,7 @@ bool XINDEX::Make(PGLOBAL g, PIXDEF sxp) if (kcp->Init(g, colp, n, true, 0)) return true; - if (trace) + if (trace(1)) htrc("Adding colp=%p Buf_Type=%d size=%d\n", colp, colp->GetResultType(), n); @@ -484,7 +484,7 @@ bool XINDEX::Make(PGLOBAL g, PIXDEF sxp) } else To_Rec[nkey] = Tdbp->GetRecpos(); - if (trace > 1) + if (trace(2)) htrc("Make: To_Rec[%d]=%d\n", nkey, To_Rec[nkey]); /*******************************************************************/ @@ -553,7 +553,7 @@ bool XINDEX::Make(PGLOBAL g, PIXDEF sxp) if ((Ndif = Qsort(g, Num_K)) < 0) goto err; // Error during sort - if (trace) + if (trace(1)) htrc("Make: Nk=%d n=%d Num_K=%d Ndif=%d addcolp=%p BlkFil=%p X=%p\n", Nk, n, Num_K, Ndif, addcolp, Tdbp->To_BlkFil, X); @@ -883,7 +883,7 @@ bool XINDEX::SaveIndex(PGLOBAL g, PIXDEF sxp) n[5] = Nblk; n[6] = Sblk; n[7] = Srtd ? 1 : 0; // Values are sorted in the file - if (trace) { + if (trace(1)) { htrc("Saving index %s\n", Xdp->GetName()); htrc("ID=%d Nk=%d nof=%d Num_K=%d Incr=%d Nblk=%d Sblk=%d Srtd=%d\n", ID, Nk, nof, Num_K, Incr, Nblk, Sblk, Srtd); @@ -926,7 +926,7 @@ bool XINDEX::SaveIndex(PGLOBAL g, PIXDEF sxp) // dup->ProgCur += 5; } // endfor kcp - if (trace) + if (trace(1)) htrc("Index %s saved, Size=%d\n", Xdp->GetName(), size); end: @@ -1016,7 +1016,7 @@ bool XINDEX::Init(PGLOBAL g) PlugSetPath(fn, fn, Tdbp->GetPath()); - if (trace) + if (trace(1)) htrc("Index %s file: %s\n", Xdp->GetName(), fn); /*********************************************************************/ @@ -1039,7 +1039,7 @@ bool XINDEX::Init(PGLOBAL g) } else Srtd = false; - if (trace) + if (trace(1)) htrc("nv=%d %d %d %d %d %d %d (%d)\n", nv[0], nv[1], nv[2], nv[3], nv[4], nv[5], nv[6], Srtd); @@ -1048,7 +1048,7 @@ bool XINDEX::Init(PGLOBAL g) if (/*nv[0] != ID ||*/ nv[1] != Nk) { sprintf(g->Message, MSG(BAD_INDEX_FILE), fn); - if (trace) + if (trace(1)) htrc("nv[0]=%d ID=%d nv[1]=%d Nk=%d\n", nv[0], ID, nv[1], Nk); goto err; @@ -1269,7 +1269,7 @@ bool XINDEX::MapInit(PGLOBAL g) PlugSetPath(fn, fn, Tdbp->GetPath()); - if (trace) + if (trace(1)) htrc("Index %s file: %s\n", Xdp->GetName(), fn); /*********************************************************************/ @@ -1300,7 +1300,7 @@ bool XINDEX::MapInit(PGLOBAL g) nv0 = nv[0]; } // endif nv - if (trace) + if (trace(1)) htrc("nv=%d %d %d %d %d %d %d %d\n", nv0, nv[1], nv[2], nv[3], nv[4], nv[5], nv[6], Srtd); @@ -1310,7 +1310,7 @@ bool XINDEX::MapInit(PGLOBAL g) // Not this index sprintf(g->Message, MSG(BAD_INDEX_FILE), fn); - if (trace) + if (trace(1)) htrc("nv0=%d ID=%d nv[1]=%d Nk=%d\n", nv0, ID, nv[1], Nk); goto err; @@ -1483,7 +1483,7 @@ bool XINDEX::GetAllSizes(PGLOBAL g,/* int &ndif,*/ int &numk) PlugSetPath(fn, fn, Tdbp->GetPath()); - if (trace) + if (trace(1)) htrc("Index %s file: %s\n", Xdp->GetName(), fn); /*********************************************************************/ @@ -1500,7 +1500,7 @@ bool XINDEX::GetAllSizes(PGLOBAL g,/* int &ndif,*/ int &numk) if (X->Read(g, nv, NZ, sizeof(int))) goto err; - if (trace) + if (trace(1)) htrc("nv=%d %d %d %d\n", nv[0], nv[1], nv[2], nv[3]); // The test on ID was suppressed because MariaDB can change an index ID @@ -1508,7 +1508,7 @@ bool XINDEX::GetAllSizes(PGLOBAL g,/* int &ndif,*/ int &numk) if (/*nv[0] != ID ||*/ nv[1] != Nk) { sprintf(g->Message, MSG(BAD_INDEX_FILE), fn); - if (trace) + if (trace(1)) htrc("nv[0]=%d ID=%d nv[1]=%d Nk=%d\n", nv[0], ID, nv[1], Nk); goto err; @@ -1770,7 +1770,7 @@ int XINDEX::Fetch(PGLOBAL g) if (Num_K == 0) return -1; // means end of file - if (trace > 1) + if (trace(2)) htrc("XINDEX Fetch: Op=%d\n", Op); /*********************************************************************/ @@ -1834,7 +1834,7 @@ int XINDEX::Fetch(PGLOBAL g) Nth++; - if (trace > 1) + if (trace(2)) htrc("Fetch: Looking for new value Nth=%d\n", Nth); Cur_K = FastFind(); @@ -1907,7 +1907,7 @@ int XINDEX::FastFind(void) sup = To_KeyCol->Ndf; } // endif Nblk - if (trace > 2) + if (trace(4)) htrc("XINDEX FastFind: Nblk=%d Op=%d inf=%d sup=%d\n", Nblk, Op, inf, sup); @@ -1985,7 +1985,7 @@ int XINDEX::FastFind(void) curk = (kcp->Kof) ? kcp->Kof[kcp->Val_K] : kcp->Val_K; } // endfor kcp - if (trace > 2) + if (trace(4)) htrc("XINDEX FastFind: curk=%d\n", curk); return curk; @@ -2123,7 +2123,7 @@ int XINDXS::Fetch(PGLOBAL g) if (Num_K == 0) return -1; // means end of file - if (trace > 1) + if (trace(2)) htrc("XINDXS Fetch: Op=%d\n", Op); /*********************************************************************/ @@ -2176,7 +2176,7 @@ int XINDXS::Fetch(PGLOBAL g) else Nth++; - if (trace > 1) + if (trace(2)) htrc("Fetch: Looking for new value Nth=%d\n", Nth); Cur_K = FastFind(); @@ -2243,7 +2243,7 @@ int XINDXS::FastFind(void) sup = Ndif; } // endif Nblk - if (trace > 2) + if (trace(4)) htrc("XINDXS FastFind: Nblk=%d Op=%d inf=%d sup=%d\n", Nblk, Op, inf, sup); @@ -2269,7 +2269,7 @@ int XINDXS::FastFind(void) n = 0; } // endif sup - if (trace > 2) + if (trace(4)) htrc("XINDXS FastFind: n=%d i=%d\n", n, i); // Loop on kcp because of dynamic indexing @@ -2337,7 +2337,7 @@ bool XFILE::Open(PGLOBAL g, char *filename, int id, MODE mode) } // endswitch mode if (!(Xfile= global_fopen(g, MSGID_OPEN_ERROR_AND_STRERROR, filename, pmod))) { - if (trace) + if (trace(1)) htrc("Open: %s\n", g->Message); return true; @@ -2354,7 +2354,7 @@ bool XFILE::Open(PGLOBAL g, char *filename, int id, MODE mode) NewOff.v.Low = (int)ftell(Xfile); - if (trace) + if (trace(1)) htrc("XFILE Open: NewOff.v.Low=%d\n", NewOff.v.Low); } else if (mode == MODE_WRITE) { @@ -2365,7 +2365,7 @@ bool XFILE::Open(PGLOBAL g, char *filename, int id, MODE mode) fseek(Xfile, 0, SEEK_END); NewOff.v.Low = (int)ftell(Xfile); - if (trace) + if (trace(1)) htrc("XFILE Open: NewOff.v.Low=%d\n", NewOff.v.Low); } // endif id @@ -2377,7 +2377,7 @@ bool XFILE::Open(PGLOBAL g, char *filename, int id, MODE mode) return true; } // endif MAX_INDX - if (trace) + if (trace(1)) htrc("XFILE Open: noff[%d].v.Low=%d\n", id, noff[id].v.Low); // Position the cursor at the offset of this index @@ -2510,7 +2510,7 @@ bool XHUGE::Open(PGLOBAL g, char *filename, int id, MODE mode) return true; } // endif - if (trace) + if (trace(1)) htrc(" Xopen: filename=%s id=%d mode=%d\n", filename, id, mode); #if defined(__WIN__) @@ -2554,7 +2554,7 @@ bool XHUGE::Open(PGLOBAL g, char *filename, int id, MODE mode) return true; } // endif Hfile - if (trace) + if (trace(1)) htrc(" access=%p share=%p creation=%d handle=%p fn=%s\n", access, share, creation, Hfile, filename); @@ -2628,13 +2628,13 @@ bool XHUGE::Open(PGLOBAL g, char *filename, int id, MODE mode) if (Hfile == INVALID_HANDLE_VALUE) { /*rc = errno;*/ - if (trace) + if (trace(1)) htrc("Open: %s\n", g->Message); return true; } // endif Hfile - if (trace) + if (trace(1)) htrc(" oflag=%p mode=%d handle=%d fn=%s\n", oflag, mode, Hfile, filename); @@ -2647,7 +2647,7 @@ bool XHUGE::Open(PGLOBAL g, char *filename, int id, MODE mode) return true; } // endif - if (trace) + if (trace(1)) htrc("INSERT: NewOff=%lld\n", NewOff.Val); } else if (mode == MODE_WRITE) { @@ -2657,7 +2657,7 @@ bool XHUGE::Open(PGLOBAL g, char *filename, int id, MODE mode) NewOff.v.Low = write(Hfile, &noff, sizeof(noff)); } // endif id - if (trace) + if (trace(1)) htrc("WRITE: NewOff=%lld\n", NewOff.Val); } else if (mode == MODE_READ && id >= 0) { @@ -2667,7 +2667,7 @@ bool XHUGE::Open(PGLOBAL g, char *filename, int id, MODE mode) return true; } // endif read - if (trace) + if (trace(1)) htrc("noff[%d]=%lld\n", id, noff[id].Val); // Position the cursor at the offset of this index @@ -2705,13 +2705,13 @@ bool XHUGE::Seek(PGLOBAL g, int low, int high, int origin) if (lseek64(Hfile, pos, origin) < 0) { sprintf(g->Message, MSG(ERROR_IN_LSK), errno); - if (trace) + if (trace(1)) htrc("lseek64 error %d\n", errno); return true; } // endif lseek64 - if (trace) + if (trace(1)) htrc("Seek: low=%d high=%d\n", low, high); #endif // UNIX @@ -2750,13 +2750,13 @@ bool XHUGE::Read(PGLOBAL g, void *buf, int n, int size) #else // UNIX ssize_t count = (ssize_t)(n * size); - if (trace) + if (trace(1)) htrc("Hfile=%d n=%d size=%d count=%d\n", Hfile, n, size, count); if (read(Hfile, buf, count) != count) { sprintf(g->Message, MSG(READ_ERROR), "Index file", strerror(errno)); - if (trace) + if (trace(1)) htrc("read error %d\n", errno); rc = true; @@ -2810,7 +2810,7 @@ int XHUGE::Write(PGLOBAL g, void *buf, int n, int size, bool& rc) /***********************************************************************/ void XHUGE::Close(char *fn, int id) { - if (trace) + if (trace(1)) htrc("XHUGE::Close: fn=%s id=%d NewOff=%lld\n", fn, id, NewOff.Val); #if defined(__WIN__) @@ -3022,7 +3022,7 @@ bool KXYCOL::Init(PGLOBAL g, PCOL colp, int n, bool sm, int kln) Prefix = true; } // endif kln - if (trace) + if (trace(1)) htrc("KCOL(%p) Init: col=%s n=%d type=%d sm=%d\n", this, colp->GetName(), n, colp->GetResultType(), sm); @@ -3076,7 +3076,7 @@ BYTE* KXYCOL::MapInit(PGLOBAL g, PCOL colp, int *n, BYTE *m) Type = colp->GetResultType(); - if (trace) + if (trace(1)) htrc("MapInit(%p): colp=%p type=%d n=%d len=%d m=%p\n", this, colp, Type, n[0], len, m); @@ -3196,7 +3196,7 @@ bool KXYCOL::InitFind(PGLOBAL g, PXOB xp) Valp->SetValue_pval(xp->GetValue(), false); } // endif Type - if (trace > 1) { + if (trace(2)) { char buf[32]; htrc("KCOL InitFind: value=%s\n", Valp->GetCharString(buf)); @@ -3237,7 +3237,7 @@ int KXYCOL::Compare(int i1, int i2) // Do the actual comparison between values. register int k = Kblp->CompVal(i1, i2); - if (trace > 2) + if (trace(4)) htrc("Compare done result=%d\n", k); return (Asc) ? k : -k; @@ -3249,7 +3249,7 @@ int KXYCOL::Compare(int i1, int i2) int KXYCOL::CompVal(int i) { // Do the actual comparison between numerical values. - if (trace > 2) { + if (trace(4)) { register int k = (int)Kblp->CompVal(Valp, (int)i); htrc("Compare done result=%d\n", k); diff --git a/storage/connect/xobject.cpp b/storage/connect/xobject.cpp index 02d3e974d..c595ce5d6 100644 --- a/storage/connect/xobject.cpp +++ b/storage/connect/xobject.cpp @@ -204,7 +204,7 @@ STRING::STRING(PGLOBAL g, uint n, PCSZ str) *Strp = 0; Next = GetNext(); - Size = Next - Strp; + Size = (int)(Next - Strp); Trc = false; } else { // This should normally never happen @@ -239,7 +239,7 @@ char *STRING::Realloc(uint len) p = Strp; Next = GetNext(); - Size = Next - p; + Size = (int)(Next - p); return p; } // end of Realloc @@ -439,4 +439,3 @@ bool STRING::Resize(uint newsize) return newsize > Size; } // end of Resize - diff --git a/storage/csv/ha_tina.cc b/storage/csv/ha_tina.cc index 7e0c61ff6..6659e529e 100644 --- a/storage/csv/ha_tina.cc +++ b/storage/csv/ha_tina.cc @@ -1788,7 +1788,7 @@ maria_declare_plugin(csv) &csv_storage_engine, "CSV", "Brian Aker, MySQL AB", - "CSV storage engine", + "Stores tables as CSV files", PLUGIN_LICENSE_GPL, tina_init_func, /* Plugin Init */ tina_done_func, /* Plugin Deinit */ diff --git a/storage/federated/ha_federated.cc b/storage/federated/ha_federated.cc index 0e8454676..d234aa03e 100644 --- a/storage/federated/ha_federated.cc +++ b/storage/federated/ha_federated.cc @@ -3472,7 +3472,7 @@ maria_declare_plugin(federated) &federated_storage_engine, "FEDERATED", "Patrick Galbraith and Brian Aker, MySQL AB", - "Federated MySQL storage engine", + "Allows to access tables on other MariaDB servers", PLUGIN_LICENSE_GPL, federated_db_init, /* Plugin Init */ federated_done, /* Plugin Deinit */ diff --git a/storage/federatedx/ha_federatedx.cc b/storage/federatedx/ha_federatedx.cc index 6c9185753..50be6575a 100644 --- a/storage/federatedx/ha_federatedx.cc +++ b/storage/federatedx/ha_federatedx.cc @@ -3647,7 +3647,7 @@ maria_declare_plugin(federatedx) &federatedx_storage_engine, "FEDERATED", "Patrick Galbraith", - "FederatedX pluggable storage engine", + "Allows to access tables on other MariaDB servers, supports transactions and more", PLUGIN_LICENSE_GPL, federatedx_db_init, /* Plugin Init */ federatedx_done, /* Plugin Deinit */ diff --git a/storage/heap/_check.c b/storage/heap/_check.c index 910a0d202..fd8652d6a 100644 --- a/storage/heap/_check.c +++ b/storage/heap/_check.c @@ -79,7 +79,7 @@ int heap_check_heap(HP_INFO *info, my_bool print_status) } hp_find_record(info,pos); - if (!info->current_ptr[share->reclength]) + if (!info->current_ptr[share->visible]) deleted++; else records++; diff --git a/storage/heap/ha_heap.cc b/storage/heap/ha_heap.cc index 3513ddb4c..0298104c8 100644 --- a/storage/heap/ha_heap.cc +++ b/storage/heap/ha_heap.cc @@ -91,15 +91,6 @@ ha_heap::ha_heap(handlerton *hton, TABLE_SHARE *table_arg) int ha_heap::open(const char *name, int mode, uint test_if_locked) { - if (table->s->reclength < sizeof (char*)) - { - MEM_UNDEFINED(table->s->default_values + table->s->reclength, - sizeof(char*) - table->s->reclength); - table->s->reclength= sizeof(char*); - MEM_UNDEFINED(table->record[0], table->s->reclength); - MEM_UNDEFINED(table->record[1], table->s->reclength); - } - internal_table= MY_TEST(test_if_locked & HA_OPEN_INTERNAL_TABLE); if (internal_table || (!(file= heap_open(name, mode)) && my_errno == ENOENT)) { @@ -714,7 +705,7 @@ heap_prepare_hp_create_info(TABLE *table_arg, bool internal_table, } } } - mem_per_row+= MY_ALIGN(share->reclength + 1, sizeof(char*)); + mem_per_row+= MY_ALIGN(MY_MAX(share->reclength, sizeof(char*)) + 1, sizeof(char*)); if (table_arg->found_next_number_field) { keydef[share->next_number_index].flag|= HA_AUTO_KEY; diff --git a/storage/heap/hp_create.c b/storage/heap/hp_create.c index 431e992e7..ed669069b 100644 --- a/storage/heap/hp_create.c +++ b/storage/heap/hp_create.c @@ -33,6 +33,7 @@ int heap_create(const char *name, HP_CREATE_INFO *create_info, uint keys= create_info->keys; ulong min_records= create_info->min_records; ulong max_records= create_info->max_records; + uint visible_offset; DBUG_ENTER("heap_create"); if (!create_info->internal_table) @@ -58,9 +59,9 @@ int heap_create(const char *name, HP_CREATE_INFO *create_info, /* We have to store sometimes uchar* del_link in records, - so the record length should be at least sizeof(uchar*) + so the visible_offset must be least at sizeof(uchar*) */ - set_if_bigger(reclength, sizeof (uchar*)); + visible_offset= MY_MAX(reclength, sizeof (char*)); for (i= key_segs= max_length= 0, keyinfo= keydef; i < keys; i++, keyinfo++) { @@ -154,7 +155,7 @@ int heap_create(const char *name, HP_CREATE_INFO *create_info, share->keydef= (HP_KEYDEF*) (share + 1); share->key_stat_version= 1; keyseg= (HA_KEYSEG*) (share->keydef + keys); - init_block(&share->block, reclength + 1, min_records, max_records); + init_block(&share->block, visible_offset + 1, min_records, max_records); /* Fix keys */ memcpy(share->keydef, keydef, (size_t) (sizeof(keydef[0]) * keys)); for (i= 0, keyinfo= share->keydef; i < keys; i++, keyinfo++) @@ -196,6 +197,7 @@ int heap_create(const char *name, HP_CREATE_INFO *create_info, share->max_table_size= create_info->max_table_size; share->data_length= share->index_length= 0; share->reclength= reclength; + share->visible= visible_offset; share->blength= 1; share->keys= keys; share->max_key_length= max_length; diff --git a/storage/heap/hp_delete.c b/storage/heap/hp_delete.c index 0c1c2c4c8..3f02e28a3 100644 --- a/storage/heap/hp_delete.c +++ b/storage/heap/hp_delete.c @@ -45,7 +45,7 @@ int heap_delete(HP_INFO *info, const uchar *record) info->update=HA_STATE_DELETED; *((uchar**) pos)=share->del_link; share->del_link=pos; - pos[share->reclength]=0; /* Record deleted */ + pos[share->visible]=0; /* Record deleted */ share->deleted++; share->key_version++; #if !defined(DBUG_OFF) && defined(EXTRA_HEAP_DEBUG) diff --git a/storage/heap/hp_rrnd.c b/storage/heap/hp_rrnd.c index 6bf188827..1f2a26cb3 100644 --- a/storage/heap/hp_rrnd.c +++ b/storage/heap/hp_rrnd.c @@ -37,7 +37,7 @@ int heap_rrnd(register HP_INFO *info, uchar *record, uchar *pos) info->update= 0; DBUG_RETURN(my_errno= HA_ERR_END_OF_FILE); } - if (!info->current_ptr[share->reclength]) + if (!info->current_ptr[share->visible]) { info->update= HA_STATE_PREV_FOUND | HA_STATE_NEXT_FOUND; DBUG_RETURN(my_errno=HA_ERR_RECORD_DELETED); diff --git a/storage/heap/hp_rsame.c b/storage/heap/hp_rsame.c index 40c5a18f9..19767fd75 100644 --- a/storage/heap/hp_rsame.c +++ b/storage/heap/hp_rsame.c @@ -32,7 +32,7 @@ int heap_rsame(register HP_INFO *info, uchar *record, int inx) DBUG_ENTER("heap_rsame"); test_active(info); - if (info->current_ptr[share->reclength]) + if (info->current_ptr[share->visible]) { if (inx < -1 || inx >= (int) share->keys) { diff --git a/storage/heap/hp_scan.c b/storage/heap/hp_scan.c index 39a6f2082..65726c37e 100644 --- a/storage/heap/hp_scan.c +++ b/storage/heap/hp_scan.c @@ -62,7 +62,7 @@ int heap_scan(register HP_INFO *info, uchar *record) } hp_find_record(info, pos); } - if (!info->current_ptr[share->reclength]) + if (!info->current_ptr[share->visible]) { DBUG_PRINT("warning",("Found deleted record")); info->update= HA_STATE_PREV_FOUND | HA_STATE_NEXT_FOUND; diff --git a/storage/heap/hp_write.c b/storage/heap/hp_write.c index a1d81fd80..fc1e82bab 100644 --- a/storage/heap/hp_write.c +++ b/storage/heap/hp_write.c @@ -54,7 +54,7 @@ int heap_write(HP_INFO *info, const uchar *record) } memcpy(pos,record,(size_t) share->reclength); - pos[share->reclength]=1; /* Mark record as not deleted */ + pos[share->visible]= 1; /* Mark record as not deleted */ if (++share->records == share->blength) share->blength+= share->blength; info->s->key_version++; @@ -92,7 +92,7 @@ int heap_write(HP_INFO *info, const uchar *record) share->deleted++; *((uchar**) pos)=share->del_link; share->del_link=pos; - pos[share->reclength]=0; /* Record deleted */ + pos[share->visible]= 0; /* Record deleted */ DBUG_RETURN(my_errno); } /* heap_write */ diff --git a/storage/innobase/CMakeLists.txt b/storage/innobase/CMakeLists.txt index 7eecefc90..2a45f05c4 100644 --- a/storage/innobase/CMakeLists.txt +++ b/storage/innobase/CMakeLists.txt @@ -520,4 +520,6 @@ MYSQL_ADD_PLUGIN(innobase ${INNOBASE_SOURCES} STORAGE_ENGINE MODULE_OUTPUT_NAME ha_innodb LINK_LIBRARIES ${ZLIB_LIBRARY} ${LIBSYSTEMD} ${LINKER_SCRIPT}) -ADD_DEPENDENCIES(innobase GenError) +IF(TARGET innobase) + ADD_DEPENDENCIES(innobase GenError) +ENDIF() diff --git a/storage/innobase/btr/btr0defragment.cc b/storage/innobase/btr/btr0defragment.cc index ca4c90eef..9f17815cd 100644 --- a/storage/innobase/btr/btr0defragment.cc +++ b/storage/innobase/btr/btr0defragment.cc @@ -39,57 +39,6 @@ Modified 30/07/2014 Jan Lindström jan.lindstrom@mariadb.com #include -/**************************************************//** -Custom nullptr implementation for under g++ 4.6 -*******************************************************/ -// #pragma once -/* -namespace std -{ - // based on SC22/WG21/N2431 = J16/07-0301 - struct nullptr_t - { - template operator any * () const - { - return 0; - } - template operator T any:: * () const - { - return 0; - } - -#ifdef _MSC_VER - struct pad {}; - pad __[sizeof(void*)/sizeof(pad)]; -#else - char __[sizeof(void*)]; -#endif -private: - // nullptr_t();// {} - // nullptr_t(const nullptr_t&); - // void operator = (const nullptr_t&); - void operator &() const; - template void operator +(any) const - { - // I Love MSVC 2005! - } - template void operator -(any) const - { - // I Love MSVC 2005! - } - }; -static const nullptr_t __nullptr = {}; -} - -#ifndef nullptr -#define nullptr std::__nullptr -#endif -*/ - -/**************************************************//** -End of Custom nullptr implementation for under g++ 4.6 -*******************************************************/ - /* When there's no work, either because defragment is disabled, or because no query is submitted, thread checks state every BTR_DEFRAGMENT_SLEEP_IN_USECS.*/ #define BTR_DEFRAGMENT_SLEEP_IN_USECS 1000000 diff --git a/storage/innobase/btr/btr0sea.cc b/storage/innobase/btr/btr0sea.cc index e36e6d619..bd5cd02aa 100644 --- a/storage/innobase/btr/btr0sea.cc +++ b/storage/innobase/btr/btr0sea.cc @@ -2,6 +2,7 @@ Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2008, Google Inc. +Copyright (c) 2018, MariaDB Corporation. Portions of this file contain modifications contributed and copyrighted by Google, Inc. Those modifications are gratefully acknowledged and are described @@ -1250,17 +1251,11 @@ btr_search_drop_page_hash_index( mem_free(folds); } -/********************************************************************//** -Drops a possible page hash index when a page is evicted from the buffer pool -or freed in a file segment. */ +/** Drop possible adaptive hash index entries when a page is evicted +from the buffer pool or freed in a file, or the index is being dropped. */ UNIV_INTERN void -btr_search_drop_page_hash_when_freed( -/*=================================*/ - ulint space, /*!< in: space id */ - ulint zip_size, /*!< in: compressed page size in bytes - or 0 for uncompressed pages */ - ulint page_no) /*!< in: page number */ +btr_search_drop_page_hash_when_freed(ulint space, ulint page_no) { buf_block_t* block; mtr_t mtr; @@ -1273,7 +1268,7 @@ btr_search_drop_page_hash_when_freed( are possibly holding, we cannot s-latch the page, but must (recursively) x-latch it, even though we are only reading. */ - block = buf_page_get_gen(space, zip_size, page_no, RW_X_LATCH, NULL, + block = buf_page_get_gen(space, 0, page_no, RW_X_LATCH, NULL, BUF_PEEK_IF_IN_POOL, __FILE__, __LINE__, &mtr); diff --git a/storage/innobase/buf/buf0buf.cc b/storage/innobase/buf/buf0buf.cc index 369f62d64..1386fd63c 100644 --- a/storage/innobase/buf/buf0buf.cc +++ b/storage/innobase/buf/buf0buf.cc @@ -2,7 +2,7 @@ Copyright (c) 1995, 2016, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2008, Google Inc. -Copyright (c) 2013, 2017, MariaDB Corporation. +Copyright (c) 2013, 2018, MariaDB Corporation. Portions of this file contain modifications contributed and copyrighted by Google, Inc. Those modifications are gratefully acknowledged and are described @@ -354,14 +354,142 @@ on the io_type */ ? (counter##_READ) \ : (counter##_WRITTEN)) + +/** Reserve a buffer slot for encryption, decryption or page compression. +@param[in,out] buf_pool buffer pool +@return reserved buffer slot */ +static buf_tmp_buffer_t* buf_pool_reserve_tmp_slot(buf_pool_t* buf_pool) +{ + for (ulint i = 0; i < buf_pool->tmp_arr->n_slots; i++) { + buf_tmp_buffer_t* slot = &buf_pool->tmp_arr->slots[i]; + if (slot->acquire()) { + return slot; + } + } + + /* We assume that free slot is found */ + ut_error; + return NULL; +} + +/** Reserve a buffer for encryption, decryption or decompression. +@param[in,out] slot reserved slot */ +static void buf_tmp_reserve_crypt_buf(buf_tmp_buffer_t* slot) +{ + if (!slot->crypt_buf) { + slot->crypt_buf = static_cast( + aligned_malloc(srv_page_size, srv_page_size)); + } +} + +/** Reserve a buffer for compression. +@param[in,out] slot reserved slot */ +static void buf_tmp_reserve_compression_buf(buf_tmp_buffer_t* slot) +{ + if (!slot->comp_buf) { + /* Both snappy and lzo compression methods require that + output buffer used for compression is bigger than input + buffer. Increase the allocated buffer size accordingly. */ + ulint size = srv_page_size; +#ifdef HAVE_LZO + size += LZO1X_1_15_MEM_COMPRESS; +#elif defined HAVE_SNAPPY + size = snappy_max_compressed_length(size); +#endif + slot->comp_buf = static_cast( + aligned_malloc(size, srv_page_size)); + } +} + /** Decrypt a page. @param[in,out] bpage Page control block @param[in,out] space tablespace @return whether the operation was successful */ -static -bool -buf_page_decrypt_after_read(buf_page_t* bpage, fil_space_t* space) - MY_ATTRIBUTE((nonnull)); +static bool buf_page_decrypt_after_read(buf_page_t* bpage, fil_space_t* space) +{ + ut_ad(space->n_pending_ios > 0); + ut_ad(space->id == bpage->space); + + byte* dst_frame = bpage->zip.data ? bpage->zip.data : + ((buf_block_t*) bpage)->frame; + bool page_compressed = fil_page_is_compressed(dst_frame); + buf_pool_t* buf_pool = buf_pool_from_bpage(bpage); + + if (bpage->offset == 0) { + /* File header pages are not encrypted/compressed */ + return true; + } + + /* Page is encrypted if encryption information is found from + tablespace and page contains used key_version. This is true + also for pages first compressed and then encrypted. */ + + buf_tmp_buffer_t* slot; + + if (page_compressed) { + /* the page we read is unencrypted */ + /* Find free slot from temporary memory array */ +decompress: + slot = buf_pool_reserve_tmp_slot(buf_pool); + /* For decompression, use crypt_buf. */ + buf_tmp_reserve_crypt_buf(slot); +decompress_with_slot: + ut_d(fil_page_type_validate(dst_frame)); + + bpage->write_size = fil_page_decompress(slot->crypt_buf, + dst_frame); + slot->release(); + + ut_ad(!bpage->write_size || fil_page_type_validate(dst_frame)); + ut_ad(space->n_pending_ios > 0); + return bpage->write_size != 0; + } + + if (space->crypt_data + && mach_read_from_4(FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION + + dst_frame)) { + /* Verify encryption checksum before we even try to + decrypt. */ + if (!fil_space_verify_crypt_checksum( + dst_frame, buf_page_get_zip_size(bpage), NULL, + bpage->offset)) { +decrypt_failed: + /* Mark page encrypted in case it should be. */ + if (space->crypt_data->type + != CRYPT_SCHEME_UNENCRYPTED) { + bpage->encrypted = true; + } + + return false; + } + + /* Find free slot from temporary memory array */ + slot = buf_pool_reserve_tmp_slot(buf_pool); + buf_tmp_reserve_crypt_buf(slot); + + ut_d(fil_page_type_validate(dst_frame)); + + /* decrypt using crypt_buf to dst_frame */ + if (!fil_space_decrypt(space, slot->crypt_buf, + dst_frame, &bpage->encrypted)) { + slot->release(); + goto decrypt_failed; + } + + ut_d(fil_page_type_validate(dst_frame)); + + if (fil_page_is_compressed_encrypted(dst_frame)) { + goto decompress_with_slot; + } + + slot->release(); + } else if (fil_page_is_compressed_encrypted(dst_frame)) { + goto decompress; + } + + ut_ad(space->n_pending_ios > 0); + return true; +} /********************************************************************//** Mark a table with the specified space pointed by bpage->space corrupted. @@ -3075,17 +3203,18 @@ buf_page_get_gen( #ifdef UNIV_DEBUG switch (mode) { case BUF_EVICT_IF_IN_POOL: + case BUF_PEEK_IF_IN_POOL: /* After DISCARD TABLESPACE, the tablespace would not exist, but in IMPORT TABLESPACE, PageConverter::operator() must replace any old pages, which were not evicted during DISCARD. - Skip the assertion on zip_size. */ + Similarly, btr_search_drop_page_hash_when_freed() must + remove any old pages. Skip the assertion on zip_size. */ break; case BUF_GET_NO_LATCH: ut_ad(rw_latch == RW_NO_LATCH); /* fall through */ case BUF_GET: case BUF_GET_IF_IN_POOL: - case BUF_PEEK_IF_IN_POOL: case BUF_GET_IF_IN_POOL_OR_WATCH: case BUF_GET_POSSIBLY_FREED: ut_ad(zip_size == fil_space_get_zip_size(space)); @@ -3189,6 +3318,11 @@ buf_page_get_gen( ibuf_inside(mtr)); retries = 0; + } else if (mode == BUF_GET_POSSIBLY_FREED) { + if (err) { + *err = local_err; + } + return NULL; } else if (retries < BUF_PAGE_READ_MAX_RETRIES) { ++retries; @@ -3252,7 +3386,8 @@ buf_page_get_gen( fix_mutex = buf_page_get_mutex(&fix_block->page); - ut_ad(page_zip_get_size(&block->page.zip) == zip_size); + ut_ad(page_zip_get_size(&block->page.zip) == zip_size + || mode == BUF_PEEK_IF_IN_POOL); switch (mode) { case BUF_GET_IF_IN_POOL: @@ -3453,6 +3588,8 @@ buf_page_get_gen( buf_block_unfix(fix_block); buf_pool_mutex_exit(buf_pool); rw_lock_x_unlock(&fix_block->lock); + + *err = DB_PAGE_CORRUPTED; return NULL; } } @@ -4737,9 +4874,9 @@ buf_page_check_corrupt(buf_page_t* bpage, fil_space_t* space) ib_logf(IB_LOG_LEVEL_ERROR, "The page [page id: space=%u" ", page number=%u]" - " in file %s cannot be decrypted.", + " in file '%s' cannot be decrypted.", bpage->space, bpage->offset, - space->name); + space->chain.start->name); ib_logf(IB_LOG_LEVEL_INFO, "However key management plugin or used key_version " ULINTPF @@ -4775,7 +4912,6 @@ buf_page_io_complete(buf_page_t* bpage, bool evict) buf_pool_t* buf_pool = buf_pool_from_bpage(bpage); const ibool uncompressed = (buf_page_get_state(bpage) == BUF_BLOCK_FILE_PAGE); - byte* frame = NULL; dberr_t err = DB_SUCCESS; ut_a(buf_page_in_file(bpage)); @@ -4793,19 +4929,18 @@ buf_page_io_complete(buf_page_t* bpage, bool evict) ulint read_page_no = 0; ulint read_space_id = 0; uint key_version = 0; - - ut_ad(bpage->zip.data || ((buf_block_t*)bpage)->frame); + byte* frame = bpage->zip.data + ? bpage->zip.data + : reinterpret_cast(bpage)->frame; + ut_ad(frame); fil_space_t* space = fil_space_acquire_for_io(bpage->space); if (!space) { return(DB_TABLESPACE_DELETED); } - buf_page_decrypt_after_read(bpage, space); - - if (buf_page_get_zip_size(bpage)) { - frame = bpage->zip.data; - } else { - frame = ((buf_block_t*) bpage)->frame; + if (!buf_page_decrypt_after_read(bpage, space)) { + err = DB_DECRYPTION_FAILED; + goto database_corrupted; } if (buf_page_get_zip_size(bpage)) { @@ -4969,7 +5104,7 @@ buf_page_io_complete(buf_page_t* bpage, bool evict) /* io_type == BUF_IO_WRITE */ if (bpage->slot) { /* Mark slot free */ - bpage->slot->reserved = false; + bpage->slot->release(); bpage->slot = NULL; } } @@ -6224,66 +6359,6 @@ buf_page_init_for_backup_restore( } #endif /* !UNIV_HOTBACKUP */ -/********************************************************************//** -Reserve unused slot from temporary memory array and allocate necessary -temporary memory if not yet allocated. -@return reserved slot */ -UNIV_INTERN -buf_tmp_buffer_t* -buf_pool_reserve_tmp_slot( -/*======================*/ - buf_pool_t* buf_pool, /*!< in: buffer pool where to - reserve */ - bool compressed) /*!< in: is file space compressed */ -{ - buf_tmp_buffer_t *free_slot=NULL; - - /* Array is protected by buf_pool mutex */ - buf_pool_mutex_enter(buf_pool); - - for(ulint i = 0; i < buf_pool->tmp_arr->n_slots; i++) { - buf_tmp_buffer_t *slot = &buf_pool->tmp_arr->slots[i]; - - if(slot->reserved == false) { - free_slot = slot; - break; - } - } - - /* We assume that free slot is found */ - ut_a(free_slot != NULL); - free_slot->reserved = true; - /* Now that we have reserved this slot we can release - buf_pool mutex */ - buf_pool_mutex_exit(buf_pool); - - /* Allocate temporary memory for encryption/decryption */ - if (free_slot->crypt_buf == NULL) { - free_slot->crypt_buf = static_cast(aligned_malloc(UNIV_PAGE_SIZE, UNIV_PAGE_SIZE)); - memset(free_slot->crypt_buf, 0, UNIV_PAGE_SIZE); - } - - /* For page compressed tables allocate temporary memory for - compression/decompression */ - if (compressed && free_slot->comp_buf == NULL) { - ulint size = UNIV_PAGE_SIZE; - - /* Both snappy and lzo compression methods require that - output buffer used for compression is bigger than input - buffer. Increase the allocated buffer size accordingly. */ -#if HAVE_SNAPPY - size = snappy_max_compressed_length(size); -#endif -#if HAVE_LZO - size += LZO1X_1_15_MEM_COMPRESS; -#endif - free_slot->comp_buf = static_cast(aligned_malloc(size, UNIV_PAGE_SIZE)); - memset(free_slot->comp_buf, 0, size); - } - - return (free_slot); -} - /** Encryption and page_compression hook that is called just before a page is written to disk. @param[in,out] space tablespace @@ -6333,16 +6408,18 @@ buf_page_encrypt_before_write( } ulint zip_size = buf_page_get_zip_size(bpage); - ulint page_size = (zip_size) ? zip_size : UNIV_PAGE_SIZE; + ut_ad(!zip_size || !page_compressed); buf_pool_t* buf_pool = buf_pool_from_bpage(bpage); /* Find free slot from temporary memory array */ - buf_tmp_buffer_t* slot = buf_pool_reserve_tmp_slot(buf_pool, page_compressed); + buf_tmp_buffer_t* slot = buf_pool_reserve_tmp_slot(buf_pool); slot->out_buf = NULL; bpage->slot = slot; + buf_tmp_reserve_crypt_buf(slot); byte *dst_frame = slot->crypt_buf; if (!page_compressed) { +not_compressed: /* Encrypt page content */ byte* tmp = fil_space_encrypt(space, bpage->offset, @@ -6350,32 +6427,28 @@ buf_page_encrypt_before_write( src_frame, dst_frame); - bpage->real_size = page_size; + bpage->real_size = UNIV_PAGE_SIZE; slot->out_buf = dst_frame = tmp; ut_d(fil_page_type_validate(tmp)); } else { /* First we compress the page content */ - ulint out_len = 0; - - byte *tmp = fil_compress_page( - space, - (byte *)src_frame, - slot->comp_buf, - page_size, + buf_tmp_reserve_compression_buf(slot); + byte* tmp = slot->comp_buf; + ulint out_len = fil_page_compress( + src_frame, tmp, fsp_flags_get_page_compression_level(space->flags), fil_space_get_block_size(space, bpage->offset), - encrypted, - &out_len); + encrypted); + if (!out_len) { + goto not_compressed; + } bpage->real_size = out_len; -#ifdef UNIV_DEBUG - fil_page_type_validate(tmp); -#endif - - if(encrypted) { + ut_d(fil_page_type_validate(tmp)); + if (encrypted) { /* And then we encrypt the page content */ tmp = fil_space_encrypt(space, bpage->offset, @@ -6387,131 +6460,9 @@ buf_page_encrypt_before_write( slot->out_buf = dst_frame = tmp; } -#ifdef UNIV_DEBUG - fil_page_type_validate(dst_frame); -#endif + ut_d(fil_page_type_validate(dst_frame)); // return dst_frame which will be written return dst_frame; } - -/** Decrypt a page. -@param[in,out] bpage Page control block -@param[in,out] space tablespace -@return whether the operation was successful */ -static -bool -buf_page_decrypt_after_read(buf_page_t* bpage, fil_space_t* space) -{ - ut_ad(space->n_pending_ios > 0); - ut_ad(space->id == bpage->space); - - ulint zip_size = buf_page_get_zip_size(bpage); - ulint size = (zip_size) ? zip_size : UNIV_PAGE_SIZE; - - byte* dst_frame = (zip_size) ? bpage->zip.data : - ((buf_block_t*) bpage)->frame; - unsigned key_version = - mach_read_from_4(dst_frame + FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION); - bool page_compressed = fil_page_is_compressed(dst_frame); - bool page_compressed_encrypted = fil_page_is_compressed_encrypted(dst_frame); - buf_pool_t* buf_pool = buf_pool_from_bpage(bpage); - bool success = true; - - if (bpage->offset == 0) { - /* File header pages are not encrypted/compressed */ - return (true); - } - - /* Page is encrypted if encryption information is found from - tablespace and page contains used key_version. This is true - also for pages first compressed and then encrypted. */ - if (!space->crypt_data) { - key_version = 0; - } - - if (page_compressed) { - /* the page we read is unencrypted */ - /* Find free slot from temporary memory array */ - buf_tmp_buffer_t* slot = buf_pool_reserve_tmp_slot(buf_pool, page_compressed); - -#ifdef UNIV_DEBUG - fil_page_type_validate(dst_frame); -#endif - - /* decompress using comp_buf to dst_frame */ - fil_decompress_page(slot->comp_buf, - dst_frame, - ulong(size), - &bpage->write_size); - - /* Mark this slot as free */ - slot->reserved = false; - key_version = 0; - -#ifdef UNIV_DEBUG - fil_page_type_validate(dst_frame); -#endif - } else { - buf_tmp_buffer_t* slot = NULL; - - if (key_version) { - /* Verify encryption checksum before we even try to - decrypt. */ - if (!fil_space_verify_crypt_checksum(dst_frame, - zip_size, NULL, bpage->offset)) { - - /* Mark page encrypted in case it should - be. */ - if (space->crypt_data->type - != CRYPT_SCHEME_UNENCRYPTED) { - bpage->encrypted = true; - } - - return (false); - } - - /* Find free slot from temporary memory array */ - slot = buf_pool_reserve_tmp_slot(buf_pool, page_compressed); - -#ifdef UNIV_DEBUG - fil_page_type_validate(dst_frame); -#endif - - /* decrypt using crypt_buf to dst_frame */ - if (!fil_space_decrypt(space, slot->crypt_buf, - dst_frame, &bpage->encrypted)) { - success = false; - } - -#ifdef UNIV_DEBUG - fil_page_type_validate(dst_frame); -#endif - } - - if (page_compressed_encrypted && success) { - if (!slot) { - slot = buf_pool_reserve_tmp_slot(buf_pool, page_compressed); - } - -#ifdef UNIV_DEBUG - fil_page_type_validate(dst_frame); -#endif - /* decompress using comp_buf to dst_frame */ - fil_decompress_page(slot->comp_buf, - dst_frame, - ulong(size), - &bpage->write_size); - ut_d(fil_page_type_validate(dst_frame)); - } - - /* Mark this slot as free */ - if (slot) { - slot->reserved = false; - } - } - - ut_ad(space->n_pending_ios > 0); - return (success); -} #endif /* !UNIV_INNOCHECKSUM */ diff --git a/storage/innobase/buf/buf0dblwr.cc b/storage/innobase/buf/buf0dblwr.cc index 704226711..5f126ebb2 100644 --- a/storage/innobase/buf/buf0dblwr.cc +++ b/storage/innobase/buf/buf0dblwr.cc @@ -510,10 +510,11 @@ buf_dblwr_process() "Restoring possible half-written data pages " "from the doublewrite buffer..."); - unaligned_read_buf = static_cast(ut_malloc(2 * UNIV_PAGE_SIZE)); + unaligned_read_buf = static_cast(ut_malloc(3 * UNIV_PAGE_SIZE)); read_buf = static_cast( ut_align(unaligned_read_buf, UNIV_PAGE_SIZE)); + byte* const buf = read_buf + UNIV_PAGE_SIZE; for (std::list::iterator i = recv_dblwr.pages.begin(); i != recv_dblwr.pages.end(); ++i, ++page_no_dblwr ) { @@ -562,24 +563,23 @@ buf_dblwr_process() ignore this page (there should be redo log records to initialize it). */ } else { - if (fil_page_is_compressed_encrypted(read_buf) || - fil_page_is_compressed(read_buf)) { - /* Decompress the page before - validating the checksum. */ - fil_decompress_page( - NULL, read_buf, srv_page_size, - NULL, true); + /* Decompress the page before + validating the checksum. */ + ulint decomp = fil_page_decompress(buf, read_buf); + if (!decomp || (decomp != srv_page_size && zip_size)) { + goto bad; } if (fil_space_verify_crypt_checksum( - read_buf, zip_size, NULL, page_no) - || !buf_page_is_corrupted( - true, read_buf, zip_size, space())) { + read_buf, zip_size, NULL, page_no) + || !buf_page_is_corrupted( + true, read_buf, zip_size, space())) { /* The page is good; there is no need to consult the doublewrite buffer. */ continue; } +bad: /* We intentionally skip this message for is_all_zero pages. */ ib_logf(IB_LOG_LEVEL_INFO, @@ -588,18 +588,15 @@ buf_dblwr_process() space_id, page_no); } - /* Next, validate the doublewrite page. */ - if (fil_page_is_compressed_encrypted(page) || - fil_page_is_compressed(page)) { - /* Decompress the page before - validating the checksum. */ - fil_decompress_page( - NULL, page, srv_page_size, NULL, true); + ulint decomp = fil_page_decompress(buf, page); + if (!decomp || (decomp != srv_page_size && zip_size)) { + goto bad_doublewrite; } - - if (!fil_space_verify_crypt_checksum(page, zip_size, NULL, page_no) + if (!fil_space_verify_crypt_checksum(page, zip_size, NULL, + page_no) && buf_page_is_corrupted(true, page, zip_size, space)) { if (!is_all_zero) { +bad_doublewrite: ib_logf(IB_LOG_LEVEL_WARN, "A doublewrite copy of page " ULINTPF ":" ULINTPF " is corrupted.", diff --git a/storage/innobase/buf/buf0dump.cc b/storage/innobase/buf/buf0dump.cc index 793d6cdd6..7d9dbc749 100644 --- a/storage/innobase/buf/buf0dump.cc +++ b/storage/innobase/buf/buf0dump.cc @@ -42,6 +42,7 @@ Created April 08, 2011 Vasil Dimov #include "ut0byte.h" /* ut_ull_create() */ #include "ut0sort.h" /* UT_SORT_FUNCTION_BODY */ #include "mysql/service_wsrep.h" /* wsrep_recovery */ +#include enum status_severity { STATUS_INFO, @@ -216,7 +217,20 @@ buf_dump( buf_dump_status(STATUS_NOTICE, "Dumping buffer pool(s) to %s", full_filename); - f = fopen(tmp_filename, "w"); +#if defined(__GLIBC__) || defined(__WIN__) || O_CLOEXEC == 0 + f = fopen(tmp_filename, "w" STR_O_CLOEXEC); +#else + { + int fd; + fd = open(tmp_filename, O_CREAT | O_TRUNC | O_CLOEXEC | O_WRONLY, 0640); + if (fd >= 0) { + f = fdopen(fd, "w"); + } + else { + f = NULL; + } + } +#endif if (f == NULL) { buf_dump_status(STATUS_ERR, "Cannot open '%s' for writing: %s", @@ -320,6 +334,14 @@ buf_dump( i + 1, srv_buf_pool_instances, j + 1, n_pages); } + if ( (j % 1024) == 0) { + service_manager_extend_timeout(INNODB_EXTEND_TIMEOUT_INTERVAL, + "Dumping buffer pool " + ULINTPF "/" ULINTPF ", " + "page " ULINTPF "/" ULINTPF, + i + 1, srv_buf_pool_instances, + j + 1, n_pages); + } } ut_free(dump); diff --git a/storage/innobase/buf/buf0flu.cc b/storage/innobase/buf/buf0flu.cc index dacddfca3..66704ac13 100644 --- a/storage/innobase/buf/buf0flu.cc +++ b/storage/innobase/buf/buf0flu.cc @@ -54,6 +54,8 @@ Created 11/11/1995 Heikki Tuuri #include "mysql/service_thd_wait.h" #include "fil0pagecompress.h" +#include + /** Number of pages flushed through non flush_list flushes. */ static ulint buf_lru_flush_page_count = 0; @@ -528,6 +530,17 @@ buf_flush_remove( buf_pool_t* buf_pool = buf_pool_from_bpage(bpage); ulint zip_size; +#if 0 // FIXME: Rate-limit the output. Move this to the page cleaner? + if (UNIV_UNLIKELY(srv_shutdown_state == SRV_SHUTDOWN_FLUSH_PHASE)) { + service_manager_extend_timeout( + INNODB_EXTEND_TIMEOUT_INTERVAL, + "Flush and remove page with tablespace id %u" + ", Poolid " ULINTPF ", flush list length " ULINTPF, + bpage->space, buf_pool->instance_no, + UT_LIST_GET_LEN(buf_pool->flush_list)); + } +#endif + ut_ad(buf_pool_mutex_own(buf_pool)); ut_ad(mutex_own(buf_page_get_mutex(bpage))); ut_ad(bpage->in_flush_list); diff --git a/storage/innobase/buf/buf0lru.cc b/storage/innobase/buf/buf0lru.cc index 9e89a291c..7039ecdf4 100644 --- a/storage/innobase/buf/buf0lru.cc +++ b/storage/innobase/buf/buf0lru.cc @@ -241,8 +241,6 @@ void buf_LRU_drop_page_hash_batch( /*=========================*/ ulint space_id, /*!< in: space id */ - ulint zip_size, /*!< in: compressed page size in bytes - or 0 for uncompressed pages */ const ulint* arr, /*!< in: array of page_no */ ulint count) /*!< in: number of entries in array */ { @@ -252,8 +250,7 @@ buf_LRU_drop_page_hash_batch( ut_ad(count <= BUF_LRU_DROP_SEARCH_SIZE); for (i = 0; i < count; ++i) { - btr_search_drop_page_hash_when_freed(space_id, zip_size, - arr[i]); + btr_search_drop_page_hash_when_freed(space_id, arr[i]); } } @@ -272,15 +269,6 @@ buf_LRU_drop_page_hash_for_tablespace( buf_page_t* bpage; ulint* page_arr; ulint num_entries; - ulint zip_size; - - zip_size = fil_space_get_zip_size(id); - - if (UNIV_UNLIKELY(zip_size == ULINT_UNDEFINED)) { - /* Somehow, the tablespace does not exist. Nothing to drop. */ - ut_ad(0); - return; - } page_arr = static_cast(ut_malloc( sizeof(ulint) * BUF_LRU_DROP_SEARCH_SIZE)); @@ -333,8 +321,7 @@ buf_LRU_drop_page_hash_for_tablespace( the latching order. */ buf_pool_mutex_exit(buf_pool); - buf_LRU_drop_page_hash_batch( - id, zip_size, page_arr, num_entries); + buf_LRU_drop_page_hash_batch(id, page_arr, num_entries); num_entries = 0; @@ -365,10 +352,32 @@ buf_LRU_drop_page_hash_for_tablespace( buf_pool_mutex_exit(buf_pool); /* Drop any remaining batch of search hashed pages. */ - buf_LRU_drop_page_hash_batch(id, zip_size, page_arr, num_entries); + buf_LRU_drop_page_hash_batch(id, page_arr, num_entries); ut_free(page_arr); } +/** Drop the adaptive hash index for a tablespace. +@param[in,out] table table */ +UNIV_INTERN void buf_LRU_drop_page_hash_for_tablespace(dict_table_t* table) +{ + for (dict_index_t* index = dict_table_get_first_index(table); + index != NULL; + index = dict_table_get_next_index(index)) { + if (btr_search_info_get_ref_count( + btr_search_get_info(index))) { + goto drop_ahi; + } + } + + return; +drop_ahi: + ulint id = table->space; + for (ulint i = 0; i < srv_buf_pool_instances; i++) { + buf_LRU_drop_page_hash_for_tablespace(buf_pool_from_array(i), + id); + } +} + /******************************************************************//** While flushing (or removing dirty) pages from a tablespace we don't want to hog the CPU and resources. Release the buffer pool and block @@ -675,18 +684,11 @@ buf_flush_dirty_pages(buf_pool_t* buf_pool, ulint id, const trx_t* trx) /** Empty the flush list for all pages belonging to a tablespace. @param[in] id tablespace identifier @param[in] trx transaction, for checking for user interrupt; - or NULL if nothing is to be written -@param[in] drop_ahi whether to drop the adaptive hash index */ -UNIV_INTERN -void -buf_LRU_flush_or_remove_pages(ulint id, const trx_t* trx, bool drop_ahi) + or NULL if nothing is to be written */ +UNIV_INTERN void buf_LRU_flush_or_remove_pages(ulint id, const trx_t* trx) { for (ulint i = 0; i < srv_buf_pool_instances; i++) { - buf_pool_t* buf_pool = buf_pool_from_array(i); - if (drop_ahi) { - buf_LRU_drop_page_hash_for_tablespace(buf_pool, id); - } - buf_flush_dirty_pages(buf_pool, id, trx); + buf_flush_dirty_pages(buf_pool_from_array(i), id, trx); } if (trx && !trx_is_interrupted(trx)) { diff --git a/storage/innobase/dict/dict0crea.cc b/storage/innobase/dict/dict0crea.cc index a2f79a400..057e2684e 100644 --- a/storage/innobase/dict/dict0crea.cc +++ b/storage/innobase/dict/dict0crea.cc @@ -1,6 +1,7 @@ /***************************************************************************** Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 2018, MariaDB Corporation. 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 @@ -326,10 +327,8 @@ dict_build_table_def_step( mtr_commit(&mtr); } else { - /* Create in the system tablespace: disallow Barracuda - features by keeping only the first bit which says whether - the row format is redundant or compact */ - table->flags &= DICT_TF_COMPACT; + /* Create in the system tablespace */ + ut_ad(table->space == TRX_SYS_SPACE); } row = dict_create_sys_tables_tuple(table, node->heap); diff --git a/storage/innobase/dict/dict0dict.cc b/storage/innobase/dict/dict0dict.cc index 7ec4364be..9609ef963 100644 --- a/storage/innobase/dict/dict0dict.cc +++ b/storage/innobase/dict/dict0dict.cc @@ -2,7 +2,7 @@ Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2012, Facebook Inc. -Copyright (c) 2013, 2017, MariaDB Corporation. +Copyright (c) 2013, 2018, MariaDB Corporation. 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 @@ -507,7 +507,8 @@ dict_table_try_drop_aborted( ut_ad(table->id == table_id); } - if (table && table->n_ref_count == ref_count && table->drop_aborted) { + if (table && table->n_ref_count == ref_count && table->drop_aborted + && !UT_LIST_GET_FIRST(table->locks)) { /* Silence a debug assertion in row_merge_drop_indexes(). */ ut_d(table->n_ref_count++); row_merge_drop_indexes(trx, table, TRUE); @@ -1673,7 +1674,7 @@ dict_table_rename_in_cache( filepath = fil_make_ibd_name(table->name, false); } - fil_delete_tablespace(table->space, true); + fil_delete_tablespace(table->space); /* Delete any temp file hanging around. */ if (os_file_status(filepath, &exists, &ftype) @@ -2718,35 +2719,13 @@ dict_index_remove_from_cache_low( zero. See also: dict_table_can_be_evicted() */ do { - ulint ref_count = btr_search_info_get_ref_count(info); - - if (ref_count == 0) { + if (!btr_search_info_get_ref_count(info)) { break; } - /* Sleep for 10ms before trying again. */ - os_thread_sleep(10000); - ++retries; - - if (retries % 500 == 0) { - /* No luck after 5 seconds of wait. */ - fprintf(stderr, "InnoDB: Error: Waited for" - " %lu secs for hash index" - " ref_count (%lu) to drop" - " to 0.\n" - "index: \"%s\"" - " table: \"%s\"\n", - retries/100, - ref_count, - index->name, - table->name); - } + buf_LRU_drop_page_hash_for_tablespace(table); - /* To avoid a hang here we commit suicide if the - ref_count doesn't drop to zero in 600 seconds. */ - if (retries >= 60000) { - ut_error; - } + ut_a(++retries < 10000); } while (srv_shutdown_state == SRV_SHUTDOWN_NONE || !lru_evict); rw_lock_free(&index->lock); diff --git a/storage/innobase/dict/dict0load.cc b/storage/innobase/dict/dict0load.cc index 4a2b6d43b..b2065c7c4 100644 --- a/storage/innobase/dict/dict0load.cc +++ b/storage/innobase/dict/dict0load.cc @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2016, MariaDB Corporation. +Copyright (c) 2016, 2018, MariaDB Corporation. 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 @@ -2067,10 +2067,12 @@ dict_load_table_low( ulint flags2; if (rec_get_deleted_flag(rec, 0)) { + *table = NULL; return("delete-marked record in SYS_TABLES"); } if (rec_get_n_fields_old(rec) != DICT_NUM_FIELDS__SYS_TABLES) { + *table = NULL; return("wrong number of columns in SYS_TABLES record"); } @@ -2078,6 +2080,7 @@ dict_load_table_low( rec, DICT_FLD__SYS_TABLES__NAME, &len); if (len == 0 || len == UNIV_SQL_NULL) { err_len: + *table = NULL; return("incorrect column length in SYS_TABLES"); } rec_get_nth_field_offs_old( @@ -2157,6 +2160,7 @@ dict_load_table_low( "InnoDB: in InnoDB data dictionary" " has unknown type %lx.\n", (ulong) flags); + *table = NULL; return("incorrect flags in SYS_TABLES"); } diff --git a/storage/innobase/fil/fil0crypt.cc b/storage/innobase/fil/fil0crypt.cc index 3095503cf..932d7b9e3 100644 --- a/storage/innobase/fil/fil0crypt.cc +++ b/storage/innobase/fil/fil0crypt.cc @@ -1,6 +1,6 @@ /***************************************************************************** Copyright (C) 2013, 2015, Google Inc. All Rights Reserved. -Copyright (c) 2014, 2017, MariaDB Corporation. All Rights Reserved. +Copyright (c) 2014, 2018, MariaDB Corporation. All Rights Reserved. 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 @@ -114,17 +114,17 @@ extern my_bool srv_background_scrub_data_compressed; /*********************************************************************** Check if a key needs rotation given a key_state -@param[in] encrypt_mode Encryption mode +@param[in] crypt_data Encryption information @param[in] key_version Current key version @param[in] latest_key_version Latest key version @param[in] rotate_key_age when to rotate @return true if key needs rotation, false if not */ static bool fil_crypt_needs_rotation( - fil_encryption_t encrypt_mode, - uint key_version, - uint latest_key_version, - uint rotate_key_age) + const fil_space_crypt_t* crypt_data, + uint key_version, + uint latest_key_version, + uint rotate_key_age) MY_ATTRIBUTE((warn_unused_result)); /********************************************************************* @@ -187,7 +187,8 @@ fil_crypt_get_latest_key_version( if (crypt_data->is_key_found()) { - if (fil_crypt_needs_rotation(crypt_data->encryption, + if (fil_crypt_needs_rotation( + crypt_data, crypt_data->min_key_version, key_version, srv_fil_crypt_rotate_key_age)) { @@ -707,60 +708,39 @@ fil_space_encrypt( #ifdef UNIV_DEBUG if (tmp) { /* Verify that encrypted buffer is not corrupted */ - byte* tmp_mem = (byte *)malloc(UNIV_PAGE_SIZE); dberr_t err = DB_SUCCESS; byte* src = src_frame; bool page_compressed_encrypted = (mach_read_from_2(tmp+FIL_PAGE_TYPE) == FIL_PAGE_PAGE_COMPRESSED_ENCRYPTED); - byte* comp_mem = NULL; - byte* uncomp_mem = NULL; + byte uncomp_mem[UNIV_PAGE_SIZE_MAX]; + byte tmp_mem[UNIV_PAGE_SIZE_MAX]; ulint size = (zip_size) ? zip_size : UNIV_PAGE_SIZE; if (page_compressed_encrypted) { - comp_mem = (byte *)malloc(UNIV_PAGE_SIZE); - uncomp_mem = (byte *)malloc(UNIV_PAGE_SIZE); - memcpy(comp_mem, src_frame, UNIV_PAGE_SIZE); - fil_decompress_page(uncomp_mem, comp_mem, - srv_page_size, NULL); - src = uncomp_mem; + memcpy(uncomp_mem, src, srv_page_size); + ulint unzipped1 = fil_page_decompress( + tmp_mem, uncomp_mem); + ut_ad(unzipped1); + if (unzipped1 != srv_page_size) { + src = uncomp_mem; + } } - bool corrupted1 = buf_page_is_corrupted(true, src, zip_size, space); - bool ok = fil_space_decrypt(crypt_data, tmp_mem, size, tmp, &err); + ut_ad(!buf_page_is_corrupted(true, src, zip_size, space)); + ut_ad(fil_space_decrypt(crypt_data, tmp_mem, size, tmp, &err)); + ut_ad(err == DB_SUCCESS); /* Need to decompress the page if it was also compressed */ if (page_compressed_encrypted) { - memcpy(comp_mem, tmp_mem, UNIV_PAGE_SIZE); - fil_decompress_page(tmp_mem, comp_mem, - srv_page_size, NULL); - } - - bool corrupted = buf_page_is_corrupted(true, tmp_mem, zip_size, space); - memcpy(tmp_mem+FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION, src+FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION, 8); - bool different = memcmp(src, tmp_mem, size); - - if (!ok || corrupted || corrupted1 || err != DB_SUCCESS || different) { - fprintf(stderr, "ok %d corrupted %d corrupted1 %d err %d different %d\n", - ok , corrupted, corrupted1, err, different); - fprintf(stderr, "src_frame\n"); - buf_page_print(src_frame, zip_size); - fprintf(stderr, "encrypted_frame\n"); - buf_page_print(tmp, zip_size); - fprintf(stderr, "decrypted_frame\n"); - buf_page_print(tmp_mem, zip_size); - ut_ad(0); - } - - free(tmp_mem); - - if (comp_mem) { - free(comp_mem); + byte buf[UNIV_PAGE_SIZE_MAX]; + memcpy(buf, tmp_mem, srv_page_size); + ulint unzipped2 = fil_page_decompress(tmp_mem, buf); + ut_ad(unzipped2); } - if (uncomp_mem) { - free(uncomp_mem); - } + memcpy(tmp_mem + FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION, + src + FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION, 8); + ut_ad(!memcmp(src, tmp_mem, size)); } - #endif /* UNIV_DEBUG */ return tmp; @@ -963,17 +943,17 @@ fil_crypt_get_key_state( /*********************************************************************** Check if a key needs rotation given a key_state -@param[in] encrypt_mode Encryption mode +@param[in] crypt_data Encryption information @param[in] key_version Current key version @param[in] latest_key_version Latest key version @param[in] rotate_key_age when to rotate @return true if key needs rotation, false if not */ static bool fil_crypt_needs_rotation( - fil_encryption_t encrypt_mode, - uint key_version, - uint latest_key_version, - uint rotate_key_age) + const fil_space_crypt_t* crypt_data, + uint key_version, + uint latest_key_version, + uint rotate_key_age) { if (key_version == ENCRYPTION_KEY_VERSION_INVALID) { return false; @@ -986,13 +966,20 @@ fil_crypt_needs_rotation( } if (latest_key_version == 0 && key_version != 0) { - if (encrypt_mode == FIL_ENCRYPTION_DEFAULT) { + if (crypt_data->encryption == FIL_ENCRYPTION_DEFAULT) { /* this is rotation encrypted => unencrypted */ return true; } return false; } + if (crypt_data->encryption == FIL_ENCRYPTION_DEFAULT + && crypt_data->type == CRYPT_SCHEME_1 + && srv_encrypt_tables == 0 ) { + /* This is rotation encrypted => unencrypted */ + return true; + } + /* this is rotation encrypted => encrypted, * only reencrypt if key is sufficiently old */ if (key_version + rotate_key_age < latest_key_version) { @@ -1008,10 +995,17 @@ static inline void fil_crypt_read_crypt_data(fil_space_t* space) { - if (space->crypt_data || space->size) { + if (space->crypt_data || space->size + || !fil_space_get_size(space->id)) { /* The encryption metadata has already been read, or the tablespace is not encrypted and the file has been - opened already. */ + opened already, or the file cannot be accessed, + likely due to a concurrent TRUNCATE or + RENAME or DROP (possibly as part of ALTER TABLE). + FIXME: The file can become unaccessible any time + after this check! We should really remove this + function and instead make crypt_data an integral + part of fil_space_t. */ return; } @@ -1272,9 +1266,10 @@ fil_crypt_space_needs_rotation( } bool need_key_rotation = fil_crypt_needs_rotation( - crypt_data->encryption, + crypt_data, crypt_data->min_key_version, - key_state->key_version, key_state->rotate_key_age); + key_state->key_version, + key_state->rotate_key_age); crypt_data->rotate_state.scrubbing.is_active = btr_scrub_start_space(space->id, &state->scrub_data); @@ -1862,9 +1857,10 @@ fil_crypt_rotate_page( ut_ad(kv == 0); ut_ad(page_get_space_id(frame) == 0); } else if (fil_crypt_needs_rotation( - crypt_data->encryption, - kv, key_state->key_version, - key_state->rotate_key_age)) { + crypt_data, + kv, + key_state->key_version, + key_state->rotate_key_age)) { modified = true; @@ -2002,6 +1998,12 @@ fil_crypt_rotate_pages( continue; } + /* If space is marked as stopping, stop rotating + pages. */ + if (state->space->is_stopping()) { + break; + } + fil_crypt_rotate_page(key_state, state); } } @@ -2050,20 +2052,22 @@ fil_crypt_flush_space( crypt_data->type = CRYPT_SCHEME_UNENCRYPTED; } - /* update page 0 */ - mtr_t mtr; - mtr_start(&mtr); + if (!space->is_stopping()) { + /* update page 0 */ + mtr_t mtr; + mtr_start(&mtr); - const uint zip_size = fsp_flags_get_zip_size(state->space->flags); + const uint zip_size = fsp_flags_get_zip_size(state->space->flags); - buf_block_t* block = buf_page_get_gen(space->id, zip_size, 0, + buf_block_t* block = buf_page_get_gen(space->id, zip_size, 0, RW_X_LATCH, NULL, BUF_GET, __FILE__, __LINE__, &mtr); - byte* frame = buf_block_get_frame(block); + byte* frame = buf_block_get_frame(block); - crypt_data->write_page0(frame, &mtr); + crypt_data->write_page0(frame, &mtr); - mtr_commit(&mtr); + mtr_commit(&mtr); + } } /*********************************************************************** diff --git a/storage/innobase/fil/fil0fil.cc b/storage/innobase/fil/fil0fil.cc index b4102e486..5891db627 100644 --- a/storage/innobase/fil/fil0fil.cc +++ b/storage/innobase/fil/fil0fil.cc @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 1995, 2017, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2014, 2017, MariaDB Corporation. +Copyright (c) 2014, 2018, MariaDB Corporation. 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 @@ -25,8 +25,6 @@ Created 10/25/1995 Heikki Tuuri *******************************************************/ #include "fil0fil.h" -#include "fil0pagecompress.h" -#include "fsp0pagecompress.h" #include "fil0crypt.h" #include @@ -49,12 +47,10 @@ Created 10/25/1995 Heikki Tuuri #include "page0zip.h" #include "trx0sys.h" #include "row0mysql.h" -#include "os0file.h" #ifndef UNIV_HOTBACKUP # include "buf0lru.h" # include "ibuf0ibuf.h" # include "sync0sync.h" -# include "os0sync.h" #else /* !UNIV_HOTBACKUP */ # include "srv0srv.h" static ulint srv_data_read, srv_data_written; @@ -346,19 +342,6 @@ fil_space_get_by_id( return(space); } -/****************************************************************//** -Get space id from fil node */ -ulint -fil_node_get_space_id( -/*==================*/ - fil_node_t* node) /*!< in: Compressed node*/ -{ - ut_ad(node); - ut_ad(node->space); - - return (node->space->id); -} - /*******************************************************************//** Returns the table space by a given name, NULL if not found. */ UNIV_INLINE @@ -696,7 +679,7 @@ fil_node_open_file( space->size += node->size; } - ulint atomic_writes = fsp_flags_get_atomic_writes(space->flags); + ulint atomic_writes = FSP_FLAGS_GET_ATOMIC_WRITES(space->flags); /* printf("Opening file %s\n", node->name); */ @@ -1096,7 +1079,6 @@ fil_mutex_enter_and_prepare_for_io( { fil_space_t* space; ulint count = 0; - ulint count2 = 0; retry: mutex_enter(&fil_system->mutex); @@ -1112,47 +1094,6 @@ fil_mutex_enter_and_prepare_for_io( return; } - if (space->stop_ios) { - ut_ad(space->id != 0); - /* We are going to do a rename file and want to stop new i/o's - for a while */ - - if (count2 > 20000) { - fputs("InnoDB: Warning: tablespace ", stderr); - ut_print_filename(stderr, space->name); - fprintf(stderr, - " has i/o ops stopped for a long time %lu\n", - (ulong) count2); - } - - mutex_exit(&fil_system->mutex); - -#ifndef UNIV_HOTBACKUP - - /* Wake the i/o-handler threads to make sure pending - i/o's are performed */ - os_aio_simulated_wake_handler_threads(); - - /* The sleep here is just to give IO helper threads a - bit of time to do some work. It is not required that - all IO related to the tablespace being renamed must - be flushed here as we do fil_flush() in - fil_rename_tablespace() as well. */ - os_thread_sleep(20000); - -#endif /* UNIV_HOTBACKUP */ - - /* Flush tablespaces so that we can close modified - files in the LRU list */ - fil_flush_file_spaces(FIL_TABLESPACE); - - os_thread_sleep(20000); - - count2++; - - goto retry; - } - fil_node_t* node = UT_LIST_GET_LAST(space->chain); ut_ad(space->id == 0 || node == UT_LIST_GET_FIRST(space->chain)); @@ -2895,7 +2836,7 @@ fil_delete_tablespace(ulint id, bool drop_ahi) To deal with potential read requests by checking the ::stop_new_ops flag in fil_io() */ - buf_LRU_flush_or_remove_pages(id, NULL, drop_ahi); + buf_LRU_flush_or_remove_pages(id, NULL); #endif /* !UNIV_HOTBACKUP */ @@ -3006,7 +2947,7 @@ fil_discard_tablespace( { dberr_t err; - switch (err = fil_delete_tablespace(id, true)) { + switch (err = fil_delete_tablespace(id)) { case DB_SUCCESS: break; @@ -3208,7 +3149,6 @@ fil_rename_tablespace( ibool success; fil_space_t* space; fil_node_t* node; - ulint count = 0; char* new_path; char* old_name; char* old_path; @@ -3216,25 +3156,10 @@ fil_rename_tablespace( ut_a(id != 0); -retry: - count++; - - if (!(count % 1000)) { - ut_print_timestamp(stderr); - fputs(" InnoDB: Warning: problems renaming ", stderr); - ut_print_filename(stderr, - old_name_in ? old_name_in : not_given); - fputs(" to ", stderr); - ut_print_filename(stderr, new_name); - fprintf(stderr, ", %lu iterations\n", (ulong) count); - } - mutex_enter(&fil_system->mutex); space = fil_space_get_by_id(id); - DBUG_EXECUTE_IF("fil_rename_tablespace_failure_1", space = NULL; ); - if (space == NULL) { ib_logf(IB_LOG_LEVEL_ERROR, "Cannot find space id %lu in the tablespace " @@ -3246,54 +3171,11 @@ fil_rename_tablespace( return(FALSE); } - if (count > 25000) { - space->stop_ios = FALSE; - mutex_exit(&fil_system->mutex); - - return(FALSE); - } - - /* We temporarily close the .ibd file because we do not trust that - operating systems can rename an open file. For the closing we have to - wait until there are no pending i/o's or flushes on the file. */ - - space->stop_ios = TRUE; - /* The following code must change when InnoDB supports multiple datafiles per tablespace. */ ut_a(UT_LIST_GET_LEN(space->chain) == 1); node = UT_LIST_GET_FIRST(space->chain); - if (node->n_pending > 0 - || node->n_pending_flushes > 0 - || node->being_extended) { - /* There are pending i/o's or flushes or the file is - currently being extended, sleep for a while and - retry */ - - mutex_exit(&fil_system->mutex); - - os_thread_sleep(20000); - - goto retry; - - } else if (node->modification_counter > node->flush_counter) { - /* Flush the space */ - - mutex_exit(&fil_system->mutex); - - os_thread_sleep(20000); - - fil_flush(id); - - goto retry; - - } else if (node->open) { - /* Close the file */ - - fil_node_close_file(node, fil_system); - } - /* Check that the old name in the space is right */ if (old_name_in) { @@ -3312,17 +3194,9 @@ fil_rename_tablespace( space, node, new_name, new_path); if (success) { - - DBUG_EXECUTE_IF("fil_rename_tablespace_failure_2", - goto skip_second_rename; ); - success = os_file_rename( innodb_file_data_key, old_path, new_path); - DBUG_EXECUTE_IF("fil_rename_tablespace_failure_2", -skip_second_rename: - success = FALSE; ); - if (!success) { /* We have to revert the changes we made to the tablespace memory cache */ @@ -3332,8 +3206,6 @@ fil_rename_tablespace( } } - space->stop_ios = FALSE; - mutex_exit(&fil_system->mutex); #ifndef UNIV_HOTBACKUP @@ -3921,7 +3793,6 @@ fil_open_single_table_tablespace( fsp_open_info remote; ulint tablespaces_found = 0; ulint valid_tablespaces_found = 0; - ulint atomic_writes = 0; fil_space_crypt_t* crypt_data = NULL; #ifdef UNIV_SYNC_DEBUG @@ -3936,7 +3807,7 @@ fil_open_single_table_tablespace( } ut_ad(fsp_flags_is_valid(flags & ~FSP_FLAGS_MEM_MASK, id)); - atomic_writes = fsp_flags_get_atomic_writes(flags); + const ulint atomic_writes = FSP_FLAGS_GET_ATOMIC_WRITES(flags); memset(&def, 0, sizeof(def)); memset(&dict, 0, sizeof(dict)); @@ -4278,17 +4149,7 @@ fil_open_single_table_tablespace( mem_free(def.filepath); - /* We need to check fsp flags when no errors has happened and - server was not started on read only mode and tablespace validation - was requested or flags contain other table options except - low order bits to FSP_FLAGS_POS_PAGE_SSIZE position. - Note that flag comparison is pessimistic. Adjust is required - only when flags contain buggy MariaDB 10.1.0 - - MariaDB 10.1.20 flags. */ - if (err == DB_SUCCESS - && !srv_read_only_mode - && (validate - || flags >= (1U << FSP_FLAGS_POS_PAGE_SSIZE))) { + if (err == DB_SUCCESS && validate && !srv_read_only_mode) { fsp_flags_try_adjust(id, flags & ~FSP_FLAGS_MEM_MASK); } @@ -5851,7 +5712,8 @@ fil_io( } else if (type == OS_FILE_WRITE) { ut_ad(!srv_read_only_mode); srv_stats.data_written.add(len); - if (fil_page_is_index_page((byte *)buf)) { + if (mach_read_from_2(static_cast(buf) + + FIL_PAGE_TYPE) == FIL_PAGE_INDEX) { srv_stats.index_pages_written.inc(); } else { srv_stats.non_index_pages_written.inc(); @@ -6348,479 +6210,6 @@ fil_close(void) fil_system = NULL; } -/********************************************************************//** -Initializes a buffer control block when the buf_pool is created. */ -static -void -fil_buf_block_init( -/*===============*/ - buf_block_t* block, /*!< in: pointer to control block */ - byte* frame) /*!< in: pointer to buffer frame */ -{ - UNIV_MEM_DESC(frame, UNIV_PAGE_SIZE); - - block->frame = frame; - - block->page.io_fix = BUF_IO_NONE; - /* There are assertions that check for this. */ - block->page.buf_fix_count = 1; - block->page.state = BUF_BLOCK_READY_FOR_USE; - - page_zip_des_init(&block->page.zip); -} - -struct fil_iterator_t { - pfs_os_file_t file; /*!< File handle */ - const char* filepath; /*!< File path name */ - os_offset_t start; /*!< From where to start */ - os_offset_t end; /*!< Where to stop */ - os_offset_t file_size; /*!< File size in bytes */ - ulint page_size; /*!< Page size */ - ulint n_io_buffers; /*!< Number of pages to use - for IO */ - byte* io_buffer; /*!< Buffer to use for IO */ - fil_space_crypt_t *crypt_data; /*!< Crypt data (if encrypted) */ - byte* crypt_io_buffer; /*!< IO buffer when encrypted */ -}; - -/********************************************************************//** -TODO: This can be made parallel trivially by chunking up the file and creating -a callback per thread. . Main benefit will be to use multiple CPUs for -checksums and compressed tables. We have to do compressed tables block by -block right now. Secondly we need to decompress/compress and copy too much -of data. These are CPU intensive. - -Iterate over all the pages in the tablespace. -@param iter - Tablespace iterator -@param block - block to use for IO -@param callback - Callback to inspect and update page contents -@retval DB_SUCCESS or error code */ -static -dberr_t -fil_iterate( -/*========*/ - const fil_iterator_t& iter, - buf_block_t* block, - PageCallback& callback) -{ - os_offset_t offset; - ulint page_no = 0; - ulint space_id = callback.get_space_id(); - ulint n_bytes = iter.n_io_buffers * iter.page_size; - - ut_ad(!srv_read_only_mode); - - /* TODO: For compressed tables we do a lot of useless - copying for non-index pages. Unfortunately, it is - required by buf_zip_decompress() */ - const bool row_compressed = callback.get_zip_size() > 0; - - for (offset = iter.start; offset < iter.end; offset += n_bytes) { - - byte* io_buffer = iter.io_buffer; - - block->frame = io_buffer; - - if (row_compressed) { - page_zip_des_init(&block->page.zip); - page_zip_set_size(&block->page.zip, iter.page_size); - block->page.zip.data = block->frame + UNIV_PAGE_SIZE; - ut_d(block->page.zip.m_external = true); - ut_ad(iter.page_size == callback.get_zip_size()); - - /* Zip IO is done in the compressed page buffer. */ - io_buffer = block->page.zip.data; - } - - /* We have to read the exact number of bytes. Otherwise the - InnoDB IO functions croak on failed reads. */ - - n_bytes = static_cast( - ut_min(static_cast(n_bytes), - iter.end - offset)); - - ut_ad(n_bytes > 0); - ut_ad(!(n_bytes % iter.page_size)); - - const bool encrypted = iter.crypt_data != NULL - && iter.crypt_data->should_encrypt(); - /* Use additional crypt io buffer if tablespace is encrypted */ - byte* const readptr = encrypted - ? iter.crypt_io_buffer : io_buffer; - byte* const writeptr = readptr; - - if (!os_file_read(iter.file, readptr, offset, (ulint) n_bytes)) { - - ib_logf(IB_LOG_LEVEL_ERROR, "os_file_read() failed"); - - return(DB_IO_ERROR); - } - - bool updated = false; - os_offset_t page_off = offset; - ulint n_pages_read = (ulint) n_bytes / iter.page_size; - bool decrypted = false; - - for (ulint i = 0; i < n_pages_read; ++i) { - ulint size = iter.page_size; - dberr_t err = DB_SUCCESS; - byte* src = readptr + (i * size); - byte* dst = io_buffer + (i * size); - bool frame_changed = false; - - ulint page_type = mach_read_from_2(src+FIL_PAGE_TYPE); - - const bool page_compressed - = page_type == FIL_PAGE_PAGE_COMPRESSED_ENCRYPTED - || page_type == FIL_PAGE_PAGE_COMPRESSED; - - /* If tablespace is encrypted, we need to decrypt - the page. Note that tablespaces are not in - fil_system during import. */ - if (encrypted) { - decrypted = fil_space_decrypt( - iter.crypt_data, - dst, //dst - iter.page_size, - src, // src - &err); // src - - if (err != DB_SUCCESS) { - return(err); - } - - if (decrypted) { - updated = true; - } else { - if (!page_compressed && !row_compressed) { - block->frame = src; - frame_changed = true; - } else { - memcpy(dst, src, size); - } - } - } - - /* If the original page is page_compressed, we need - to decompress page before we can update it. */ - if (page_compressed) { - fil_decompress_page(NULL, dst, ulong(size), - NULL); - updated = true; - } - - buf_block_set_file_page(block, space_id, page_no++); - - if ((err = callback(page_off, block)) != DB_SUCCESS) { - - return(err); - - } else if (!updated) { - updated = buf_block_get_state(block) - == BUF_BLOCK_FILE_PAGE; - } - - buf_block_set_state(block, BUF_BLOCK_NOT_USED); - buf_block_set_state(block, BUF_BLOCK_READY_FOR_USE); - - /* If tablespace is encrypted we use additional - temporary scratch area where pages are read - for decrypting readptr == crypt_io_buffer != io_buffer. - - Destination for decryption is a buffer pool block - block->frame == dst == io_buffer that is updated. - Pages that did not require decryption even when - tablespace is marked as encrypted are not copied - instead block->frame is set to src == readptr. - - For encryption we again use temporary scratch area - writeptr != io_buffer == dst - that is then written to the tablespace - - (1) For normal tables io_buffer == dst == writeptr - (2) For only page compressed tables - io_buffer == dst == writeptr - (3) For encrypted (and page compressed) - readptr != io_buffer == dst != writeptr - */ - - ut_ad(!encrypted && !page_compressed ? - src == dst && dst == writeptr + (i * size):1); - ut_ad(page_compressed && !encrypted ? - src == dst && dst == writeptr + (i * size):1); - ut_ad(encrypted ? - src != dst && dst != writeptr + (i * size):1); - - if (encrypted) { - memcpy(writeptr + (i * size), - row_compressed ? block->page.zip.data : - block->frame, size); - } - - if (frame_changed) { - block->frame = dst; - } - - src = io_buffer + (i * size); - - if (page_compressed) { - ulint len = 0; - - fil_compress_page( - NULL, - src, - NULL, - size, - 0,/* FIXME: compression level */ - 512,/* FIXME: use proper block size */ - encrypted, - &len); - - updated = true; - } - - /* If tablespace is encrypted, encrypt page before we - write it back. Note that we should not encrypt the - buffer that is in buffer pool. */ - /* NOTE: At this stage of IMPORT the - buffer pool is not being used at all! */ - if (decrypted && encrypted) { - byte *dest = writeptr + (i * size); - ulint space = mach_read_from_4( - src + FIL_PAGE_ARCH_LOG_NO_OR_SPACE_ID); - ulint offset = mach_read_from_4(src + FIL_PAGE_OFFSET); - ib_uint64_t lsn = mach_read_from_8(src + FIL_PAGE_LSN); - - byte* tmp = fil_encrypt_buf( - iter.crypt_data, - space, - offset, - lsn, - src, - iter.page_size == UNIV_PAGE_SIZE ? 0 : iter.page_size, - dest); - - if (tmp == src) { - /* TODO: remove unnecessary memcpy's */ - memcpy(dest, src, size); - } - - updated = true; - } - - page_off += iter.page_size; - block->frame += iter.page_size; - } - - /* A page was updated in the set, write back to disk. */ - if (updated - && !os_file_write( - iter.filepath, iter.file, writeptr, - offset, (ulint) n_bytes)) { - - ib_logf(IB_LOG_LEVEL_ERROR, "os_file_write() failed"); - - return(DB_IO_ERROR); - } - } - - return(DB_SUCCESS); -} - -/********************************************************************//** -Iterate over all the pages in the tablespace. -@param table - the table definiton in the server -@param n_io_buffers - number of blocks to read and write together -@param callback - functor that will do the page updates -@return DB_SUCCESS or error code */ -UNIV_INTERN -dberr_t -fil_tablespace_iterate( -/*===================*/ - dict_table_t* table, - ulint n_io_buffers, - PageCallback& callback) -{ - dberr_t err; - pfs_os_file_t file; - char* filepath; - - ut_a(n_io_buffers > 0); - ut_ad(!srv_read_only_mode); - - DBUG_EXECUTE_IF("ib_import_trigger_corruption_1", - return(DB_CORRUPTION);); - - if (DICT_TF_HAS_DATA_DIR(table->flags)) { - dict_get_and_save_data_dir_path(table, false); - ut_a(table->data_dir_path); - - filepath = os_file_make_remote_pathname( - table->data_dir_path, table->name, "ibd"); - } else { - filepath = fil_make_ibd_name(table->name, false); - } - - { - ibool success; - - file = os_file_create_simple_no_error_handling( - innodb_file_data_key, filepath, - OS_FILE_OPEN, OS_FILE_READ_WRITE, &success, FALSE); - - DBUG_EXECUTE_IF("fil_tablespace_iterate_failure", - { - static bool once; - - if (!once || ut_rnd_interval(0, 10) == 5) { - once = true; - success = FALSE; - os_file_close(file); - } - }); - - if (!success) { - /* The following call prints an error message */ - os_file_get_last_error(true); - - ib_logf(IB_LOG_LEVEL_ERROR, - "Trying to import a tablespace, but could not " - "open the tablespace file %s", filepath); - - mem_free(filepath); - - return(DB_TABLESPACE_NOT_FOUND); - - } else { - err = DB_SUCCESS; - } - } - - callback.set_file(filepath, file); - - os_offset_t file_size = os_file_get_size(file); - ut_a(file_size != (os_offset_t) -1); - - /* The block we will use for every physical page */ - buf_block_t block; - - memset(&block, 0x0, sizeof(block)); - - /* Allocate a page to read in the tablespace header, so that we - can determine the page size and zip_size (if it is compressed). - We allocate an extra page in case it is a compressed table. One - page is to ensure alignement. */ - - void* page_ptr = mem_alloc(3 * UNIV_PAGE_SIZE); - byte* page = static_cast(ut_align(page_ptr, UNIV_PAGE_SIZE)); - - fil_buf_block_init(&block, page); - - /* Read the first page and determine the page and zip size. */ - - if (!os_file_read(file, page, 0, UNIV_PAGE_SIZE)) { - - err = DB_IO_ERROR; - - } else if ((err = callback.init(file_size, &block)) == DB_SUCCESS) { - fil_iterator_t iter; - - iter.file = file; - iter.start = 0; - iter.end = file_size; - iter.filepath = filepath; - iter.file_size = file_size; - iter.n_io_buffers = n_io_buffers; - iter.page_size = callback.get_page_size(); - - /* In MariaDB/MySQL 5.6 tablespace does not exist - during import, therefore we can't use space directly - here. */ - ulint crypt_data_offset = fsp_header_get_crypt_offset( - callback.get_zip_size()); - - /* read (optional) crypt data */ - iter.crypt_data = fil_space_read_crypt_data( - 0, page, crypt_data_offset); - - /* Compressed pages can't be optimised for block IO for now. - We do the IMPORT page by page. */ - - if (callback.get_zip_size() > 0) { - iter.n_io_buffers = 1; - ut_a(iter.page_size == callback.get_zip_size()); - } - - /** If tablespace is encrypted, it needs extra buffers */ - if (iter.crypt_data != NULL) { - /* decrease io buffers so that memory - * consumption doesnt double - * note: the +1 is to avoid n_io_buffers getting down to 0 */ - iter.n_io_buffers = (iter.n_io_buffers + 1) / 2; - } - - /** Add an extra page for compressed page scratch area. */ - - void* io_buffer = mem_alloc( - (2 + iter.n_io_buffers) * UNIV_PAGE_SIZE); - - iter.io_buffer = static_cast( - ut_align(io_buffer, UNIV_PAGE_SIZE)); - - void* crypt_io_buffer = NULL; - if (iter.crypt_data != NULL) { - crypt_io_buffer = mem_alloc( - (2 + iter.n_io_buffers) * UNIV_PAGE_SIZE); - iter.crypt_io_buffer = static_cast( - ut_align(crypt_io_buffer, UNIV_PAGE_SIZE)); - } - - err = fil_iterate(iter, &block, callback); - - mem_free(io_buffer); - - if (crypt_io_buffer != NULL) { - mem_free(crypt_io_buffer); - iter.crypt_io_buffer = NULL; - fil_space_destroy_crypt_data(&iter.crypt_data); - } - } - - if (err == DB_SUCCESS) { - - ib_logf(IB_LOG_LEVEL_INFO, "Sync to disk"); - - if (!os_file_flush(file)) { - ib_logf(IB_LOG_LEVEL_INFO, "os_file_flush() failed!"); - err = DB_IO_ERROR; - } else { - ib_logf(IB_LOG_LEVEL_INFO, "Sync to disk - done!"); - } - } - - os_file_close(file); - - mem_free(page_ptr); - mem_free(filepath); - - return(err); -} - -/** -Set the tablespace compressed table size. -@return DB_SUCCESS if it is valie or DB_CORRUPTION if not */ -dberr_t -PageCallback::set_zip_size(const buf_frame_t* page) UNIV_NOTHROW -{ - m_zip_size = fsp_header_get_zip_size(page); - - if (!ut_is_2pow(m_zip_size) || m_zip_size > UNIV_ZIP_SIZE_MAX) { - return(DB_CORRUPTION); - } - - return(DB_SUCCESS); -} - /********************************************************************//** Delete the tablespace file and any related files like .cfg. This should not be called for temporary tables. */ diff --git a/storage/innobase/fil/fil0pagecompress.cc b/storage/innobase/fil/fil0pagecompress.cc index edc932f36..25cd8e28a 100644 --- a/storage/innobase/fil/fil0pagecompress.cc +++ b/storage/innobase/fil/fil0pagecompress.cc @@ -1,6 +1,6 @@ /***************************************************************************** -Copyright (C) 2013, 2017, MariaDB Corporation. All Rights Reserved. +Copyright (C) 2013, 2018, MariaDB Corporation. 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 @@ -80,73 +80,26 @@ static ulint srv_data_read, srv_data_written; #include "snappy-c.h" #endif -/* Used for debugging */ -//#define UNIV_PAGECOMPRESS_DEBUG 1 - -/****************************************************************//** -For page compressed pages compress the page before actual write -operation. -@return compressed page to be written*/ -UNIV_INTERN -byte* -fil_compress_page( -/*==============*/ - fil_space_t* space, /*!< in,out: tablespace (NULL during IMPORT) */ - byte* buf, /*!< in: buffer from which to write; in aio - this must be appropriately aligned */ - byte* out_buf, /*!< out: compressed buffer */ - ulint len, /*!< in: length of input buffer.*/ - ulint level, /* in: compression level */ - ulint block_size, /*!< in: block size */ - bool encrypted, /*!< in: is page also encrypted */ - ulint* out_len) /*!< out: actual length of compressed - page */ +/** Compress a page_compressed page before writing to a data file. +@param[in] buf page to be compressed +@param[out] out_buf compressed page +@param[in] level compression level +@param[in] block_size file system block size +@param[in] encrypted whether the page will be subsequently encrypted +@return actual length of compressed page +@retval 0 if the page was not compressed */ +UNIV_INTERN ulint fil_page_compress(const byte* buf, byte* out_buf, ulint level, + ulint block_size, bool encrypted) { - int err = Z_OK; - int comp_level = level; + int comp_level = int(level); ulint header_len = FIL_PAGE_DATA + FIL_PAGE_COMPRESSED_SIZE; - ulint write_size = 0; -#if HAVE_LZO - lzo_uint write_size_lzo = write_size; -#endif /* Cache to avoid change during function execution */ ulint comp_method = innodb_compression_algorithm; - bool allocated = false; - - /* page_compression does not apply to tables or tablespaces - that use ROW_FORMAT=COMPRESSED */ - ut_ad(!space || !FSP_FLAGS_GET_ZIP_SSIZE(space->flags)); if (encrypted) { header_len += FIL_PAGE_COMPRESSION_METHOD_SIZE; } - if (!out_buf) { - allocated = true; - ulint size = UNIV_PAGE_SIZE; - - /* Both snappy and lzo compression methods require that - output buffer used for compression is bigger than input - buffer. Increase the allocated buffer size accordingly. */ -#if HAVE_SNAPPY - if (comp_method == PAGE_SNAPPY_ALGORITHM) { - size = snappy_max_compressed_length(size); - } -#endif -#if HAVE_LZO - if (comp_method == PAGE_LZO_ALGORITHM) { - size += LZO1X_1_15_MEM_COMPRESS; - } -#endif - - out_buf = static_cast(ut_malloc(size)); - } - - ut_ad(buf); - ut_ad(out_buf); - ut_ad(len); - ut_ad(out_len); - /* Let's not compress file space header or extent descriptor */ switch (fil_page_get_type(buf)) { @@ -154,8 +107,7 @@ fil_compress_page( case FIL_PAGE_TYPE_FSP_HDR: case FIL_PAGE_TYPE_XDES: case FIL_PAGE_PAGE_COMPRESSED: - *out_len = len; - goto err_exit; + return 0; } /* If no compression level was provided to this table, use system @@ -164,204 +116,113 @@ fil_compress_page( comp_level = page_zip_level; } - DBUG_PRINT("compress", - ("Preparing for space " ULINTPF " '%s' len " ULINTPF, - space ? space->id : 0, - space ? space->name : "(import)", - len)); - - write_size = UNIV_PAGE_SIZE - header_len; + ulint write_size = srv_page_size - header_len; - switch(comp_method) { + switch (comp_method) { + default: + ut_ad(!"unknown compression method"); + /* fall through */ + case PAGE_UNCOMPRESSED: + return 0; + case PAGE_ZLIB_ALGORITHM: + { + ulong len = uLong(write_size); + if (Z_OK == compress2( + out_buf + header_len, &len, + buf, uLong(srv_page_size), comp_level)) { + write_size = len; + goto success; + } + } + break; #ifdef HAVE_LZ4 case PAGE_LZ4_ALGORITHM: - -#ifdef HAVE_LZ4_COMPRESS_DEFAULT - err = LZ4_compress_default((const char *)buf, - (char *)out_buf+header_len, len, write_size); -#else - err = LZ4_compress_limitedOutput((const char *)buf, - (char *)out_buf+header_len, len, write_size); -#endif /* HAVE_LZ4_COMPRESS_DEFAULT */ - write_size = err; - - if (err == 0) { - /* If error we leave the actual page as it was */ - -#ifndef UNIV_PAGECOMPRESS_DEBUG - if (space && !space->printed_compression_failure) { - space->printed_compression_failure = true; -#endif - ib_logf(IB_LOG_LEVEL_WARN, - "Compression failed for space " ULINTPF - " name %s len " ULINTPF - " err %d write_size " ULINTPF ".", - space->id, space->name, len, - err, write_size); -#ifndef UNIV_PAGECOMPRESS_DEBUG - } -#endif - srv_stats.pages_page_compression_error.inc(); - *out_len = len; - goto err_exit; +# ifdef HAVE_LZ4_COMPRESS_DEFAULT + write_size = LZ4_compress_default( + reinterpret_cast(buf), + reinterpret_cast(out_buf) + header_len, + int(srv_page_size), int(write_size)); +# else + write_size = LZ4_compress_limitedOutput( + reinterpret_cast(buf), + reinterpret_cast(out_buf) + header_len, + int(srv_page_size), int(write_size)); +# endif + + if (write_size) { + goto success; } break; #endif /* HAVE_LZ4 */ #ifdef HAVE_LZO - case PAGE_LZO_ALGORITHM: - err = lzo1x_1_15_compress( - buf, len, out_buf+header_len, &write_size_lzo, out_buf+UNIV_PAGE_SIZE); - - write_size = write_size_lzo; - - if (err != LZO_E_OK || write_size > UNIV_PAGE_SIZE-header_len) { - if (space && !space->printed_compression_failure) { - space->printed_compression_failure = true; - ib_logf(IB_LOG_LEVEL_WARN, - "Compression failed for space " ULINTPF - " name %s len " ULINTPF - " err %d write_size " ULINTPF ".", - space->id, space->name, len, - err, write_size); - } - - srv_stats.pages_page_compression_error.inc(); - *out_len = len; - goto err_exit; + case PAGE_LZO_ALGORITHM: { + lzo_uint len = write_size; + + if (LZO_E_OK == lzo1x_1_15_compress( + buf, srv_page_size, + out_buf + header_len, &len, + out_buf + srv_page_size) + && len <= write_size) { + write_size = len; + goto success; } - break; + } #endif /* HAVE_LZO */ #ifdef HAVE_LZMA case PAGE_LZMA_ALGORITHM: { - size_t out_pos=0; - - err = lzma_easy_buffer_encode( - comp_level, - LZMA_CHECK_NONE, - NULL, /* No custom allocator, use malloc/free */ - reinterpret_cast(buf), - len, - reinterpret_cast(out_buf + header_len), - &out_pos, - (size_t)write_size); - - if (err != LZMA_OK || out_pos > UNIV_PAGE_SIZE-header_len) { - if (space && !space->printed_compression_failure) { - space->printed_compression_failure = true; - ib_logf(IB_LOG_LEVEL_WARN, - "Compression failed for space " ULINTPF - " name %s len " ULINTPF - " err %d write_size " ULINTPF ".", - space->id, space->name, len, - err, out_pos); - } - - srv_stats.pages_page_compression_error.inc(); - *out_len = len; - goto err_exit; + size_t out_pos = 0; + + if (LZMA_OK == lzma_easy_buffer_encode( + comp_level, LZMA_CHECK_NONE, NULL, + buf, srv_page_size, out_buf + header_len, + &out_pos, write_size) + && out_pos <= write_size) { + write_size = out_pos; + goto success; } - - write_size = out_pos; - break; } #endif /* HAVE_LZMA */ #ifdef HAVE_BZIP2 case PAGE_BZIP2_ALGORITHM: { - - err = BZ2_bzBuffToBuffCompress( - (char *)(out_buf + header_len), - (unsigned int *)&write_size, - (char *)buf, - len, - 1, - 0, - 0); - - if (err != BZ_OK || write_size > UNIV_PAGE_SIZE-header_len) { - if (space && !space->printed_compression_failure) { - space->printed_compression_failure = true; - ib_logf(IB_LOG_LEVEL_WARN, - "Compression failed for space " ULINTPF - " name %s len " ULINTPF - " err %d write_size " ULINTPF ".", - space->id, space->name, len, - err, write_size); - } - - srv_stats.pages_page_compression_error.inc(); - *out_len = len; - goto err_exit; + unsigned len = unsigned(write_size); + if (BZ_OK == BZ2_bzBuffToBuffCompress( + reinterpret_cast(out_buf + header_len), + &len, + const_cast( + reinterpret_cast(buf)), + unsigned(srv_page_size), 1, 0, 0) + && len <= write_size) { + write_size = len; + goto success; } break; } #endif /* HAVE_BZIP2 */ #ifdef HAVE_SNAPPY - case PAGE_SNAPPY_ALGORITHM: - { - snappy_status cstatus; - write_size = snappy_max_compressed_length(UNIV_PAGE_SIZE); - - cstatus = snappy_compress( - (const char *)buf, - (size_t)len, - (char *)(out_buf+header_len), - (size_t*)&write_size); - - if (cstatus != SNAPPY_OK || write_size > UNIV_PAGE_SIZE-header_len) { - if (space && !space->printed_compression_failure) { - space->printed_compression_failure = true; - ib_logf(IB_LOG_LEVEL_WARN, - "Compression failed for space " ULINTPF - " name %s len " ULINTPF - " err %d write_size " ULINTPF ".", - space->id, space->name, len, - (int)cstatus, write_size); - } - - srv_stats.pages_page_compression_error.inc(); - *out_len = len; - goto err_exit; + case PAGE_SNAPPY_ALGORITHM: { + size_t len = snappy_max_compressed_length(srv_page_size); + + if (SNAPPY_OK == snappy_compress( + reinterpret_cast(buf), + srv_page_size, + reinterpret_cast(out_buf) + header_len, + &len) + && len <= write_size) { + write_size = len; + goto success; } break; } #endif /* HAVE_SNAPPY */ - - case PAGE_ZLIB_ALGORITHM: - err = compress2(out_buf+header_len, (ulong*)&write_size, buf, - uLong(len), comp_level); - - if (err != Z_OK) { - /* If error we leave the actual page as it was */ - - if (space && !space->printed_compression_failure) { - space->printed_compression_failure = true; - ib_logf(IB_LOG_LEVEL_WARN, - "Compression failed for space " ULINTPF - " name %s len " ULINTPF - " rt %d write_size " ULINTPF ".", - space->id, space->name, len, - err, write_size); - } - - srv_stats.pages_page_compression_error.inc(); - *out_len = len; - goto err_exit; - } - break; - - case PAGE_UNCOMPRESSED: - *out_len = len; - return (buf); - break; - default: - ut_error; - break; } + srv_stats.pages_page_compression_error.inc(); + return 0; +success: /* Set up the page header */ memcpy(out_buf, buf, FIL_PAGE_DATA); /* Set up the checksum */ @@ -392,22 +253,11 @@ fil_compress_page( /* Verify that page can be decompressed */ { - byte *comp_page; - byte *uncomp_page; - - comp_page = static_cast(ut_malloc(UNIV_PAGE_SIZE)); - uncomp_page = static_cast(ut_malloc(UNIV_PAGE_SIZE)); - memcpy(comp_page, out_buf, UNIV_PAGE_SIZE); - - fil_decompress_page(uncomp_page, comp_page, ulong(len), NULL); - - if (buf_page_is_corrupted(false, uncomp_page, 0, space)) { - buf_page_print(uncomp_page, 0); - ut_ad(0); - } - - ut_free(comp_page); - ut_free(uncomp_page); + page_t tmp_buf[UNIV_PAGE_SIZE_MAX]; + page_t page[UNIV_PAGE_SIZE_MAX]; + memcpy(page, out_buf, srv_page_size); + ut_ad(fil_page_decompress(tmp_buf, page)); + ut_ad(!buf_page_is_corrupted(false, page, 0, NULL)); } #endif /* UNIV_DEBUG */ @@ -431,324 +281,144 @@ fil_compress_page( #endif } - DBUG_PRINT("compress", - ("Succeeded for space " ULINTPF - " '%s' len " ULINTPF " out_len " ULINTPF, - space ? space->id : 0, - space ? space->name : "(import)", - len, write_size)); - - srv_stats.page_compression_saved.add((len - write_size)); + srv_stats.page_compression_saved.add(srv_page_size - write_size); srv_stats.pages_page_compressed.inc(); /* If we do not persistently trim rest of page, we need to write it all */ if (!srv_use_trim) { - memset(out_buf+write_size,0,len-write_size); - write_size = len; - } - - *out_len = write_size; - - if (allocated) { - /* TODO: reduce number of memcpy's */ - memcpy(buf, out_buf, len); - } else { - return(out_buf); - } - -err_exit: - if (allocated) { - ut_free(out_buf); + memset(out_buf + write_size, 0, srv_page_size - write_size); } - return (buf); - + return write_size; } -/****************************************************************//** -For page compressed pages decompress the page after actual read -operation. */ -UNIV_INTERN -void -fil_decompress_page( -/*================*/ - byte* page_buf, /*!< in: preallocated buffer or NULL */ - byte* buf, /*!< out: buffer from which to read; in aio - this must be appropriately aligned */ - ulong len, /*!< in: length of output buffer.*/ - ulint* write_size, /*!< in/out: Actual payload size of - the compressed data. */ - bool return_error) /*!< in: true if only an error should - be produced when decompression fails. - By default this parameter is false. */ +/** Decompress a page that may be subject to page_compressed compression. +@param[in,out] tmp_buf temporary buffer (of innodb_page_size) +@param[in,out] buf possibly compressed page buffer +@return size of the compressed data +@retval 0 if decompression failed +@retval srv_page_size if the page was not compressed */ +UNIV_INTERN ulint fil_page_decompress(byte* tmp_buf, byte* buf) { - int err = 0; - ulint actual_size = 0; - ulint compression_alg = 0; - byte *in_buf; - ulint ptype; - ulint header_len = FIL_PAGE_DATA + FIL_PAGE_COMPRESSED_SIZE; - - ut_ad(buf); - ut_ad(len); - - ptype = mach_read_from_2(buf+FIL_PAGE_TYPE); - - if (ptype == FIL_PAGE_PAGE_COMPRESSED_ENCRYPTED) { - header_len += FIL_PAGE_COMPRESSION_METHOD_SIZE; - } - - /* Do not try to uncompressed pages that are not compressed */ - if (ptype != FIL_PAGE_PAGE_COMPRESSED && - ptype != FIL_PAGE_PAGE_COMPRESSED_ENCRYPTED && - ptype != FIL_PAGE_TYPE_COMPRESSED) { - return; - } - - // If no buffer was given, we need to allocate temporal buffer - if (page_buf == NULL) { - in_buf = static_cast(ut_malloc(UNIV_PAGE_SIZE)); - memset(in_buf, 0, UNIV_PAGE_SIZE); - } else { - in_buf = page_buf; + const unsigned ptype = mach_read_from_2(buf+FIL_PAGE_TYPE); + ulint header_len; + ib_uint64_t compression_alg; + switch (ptype) { + case FIL_PAGE_PAGE_COMPRESSED_ENCRYPTED: + header_len = FIL_PAGE_DATA + FIL_PAGE_COMPRESSED_SIZE + + FIL_PAGE_COMPRESSION_METHOD_SIZE; + compression_alg = mach_read_from_2( + FIL_PAGE_DATA + FIL_PAGE_COMPRESSED_SIZE + buf); + break; + case FIL_PAGE_PAGE_COMPRESSED: + header_len = FIL_PAGE_DATA + FIL_PAGE_COMPRESSED_SIZE; + compression_alg = mach_read_from_8( + FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION + buf); + break; + default: + return srv_page_size; } - /* Before actual decompress, make sure that page type is correct */ - - if (mach_read_from_4(buf+FIL_PAGE_SPACE_OR_CHKSUM) != BUF_NO_CHECKSUM_MAGIC || - (ptype != FIL_PAGE_PAGE_COMPRESSED && - ptype != FIL_PAGE_PAGE_COMPRESSED_ENCRYPTED)) { - ib_logf(IB_LOG_LEVEL_ERROR, - "Corruption: We try to uncompress corrupted page" - " CRC " ULINTPF " type " ULINTPF " len " ULINTPF ".", - mach_read_from_4(buf+FIL_PAGE_SPACE_OR_CHKSUM), - mach_read_from_2(buf+FIL_PAGE_TYPE), len); - - fflush(stderr); - if (return_error) { - goto error_return; - } - ut_error; + if (mach_read_from_4(buf + FIL_PAGE_SPACE_OR_CHKSUM) + != BUF_NO_CHECKSUM_MAGIC) { + return 0; } - /* Get compression algorithm */ - if (ptype == FIL_PAGE_PAGE_COMPRESSED_ENCRYPTED) { - compression_alg = mach_read_from_2(buf+FIL_PAGE_DATA+FIL_PAGE_COMPRESSED_SIZE); - } else { - compression_alg = mach_read_from_8(buf+FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION); - } + ulint actual_size = mach_read_from_2(buf + FIL_PAGE_DATA); - /* Get the actual size of compressed page */ - actual_size = mach_read_from_2(buf+FIL_PAGE_DATA); /* Check if payload size is corrupted */ - if (actual_size == 0 || actual_size > UNIV_PAGE_SIZE) { - ib_logf(IB_LOG_LEVEL_ERROR, - "Corruption: We try to uncompress corrupted page" - " actual size " ULINTPF " compression %s.", - actual_size, fil_get_compression_alg_name(compression_alg)); - fflush(stderr); - if (return_error) { - goto error_return; - } - ut_error; + if (actual_size == 0 || actual_size > srv_page_size - header_len) { + return 0; } - /* Store actual payload size of the compressed data. This pointer - points to buffer pool. */ - if (write_size) { - *write_size = actual_size; - } - - DBUG_PRINT("compress", - ("Preparing for decompress for len " ULINTPF ".", - actual_size)); - - switch(compression_alg) { + switch (compression_alg) { + default: + ib_logf(IB_LOG_LEVEL_ERROR, + "Unknown compression algorithm " UINT64PF, + compression_alg); + return 0; case PAGE_ZLIB_ALGORITHM: - err= uncompress(in_buf, &len, buf+header_len, (unsigned long)actual_size); - - /* If uncompress fails it means that page is corrupted */ - if (err != Z_OK) { - - ib_logf(IB_LOG_LEVEL_ERROR, - "Corruption: Page is marked as compressed" - " but uncompress failed with error %d " - " size " ULINTPF " len " ULINTPF ".", - err, actual_size, len); - - fflush(stderr); - - if (return_error) { - goto error_return; + { + uLong len = srv_page_size; + if (Z_OK != uncompress(tmp_buf, &len, + buf + header_len, + uLong(actual_size)) + && len != srv_page_size) { + return 0; } - ut_error; } break; - #ifdef HAVE_LZ4 case PAGE_LZ4_ALGORITHM: - err = LZ4_decompress_fast((const char *)buf+header_len, (char *)in_buf, len); - - if (err != (int)actual_size) { - ib_logf(IB_LOG_LEVEL_ERROR, - "Corruption: Page is marked as compressed" - " but uncompress failed with error %d " - " size " ULINTPF " len " ULINTPF ".", - err, actual_size, len); - - fflush(stderr); - - if (return_error) { - goto error_return; - } - ut_error; + if (LZ4_decompress_safe(reinterpret_cast(buf) + + header_len, + reinterpret_cast(tmp_buf), + actual_size, srv_page_size) + == int(srv_page_size)) { + break; } - break; + return 0; #endif /* HAVE_LZ4 */ #ifdef HAVE_LZO case PAGE_LZO_ALGORITHM: { - ulint olen = 0; - lzo_uint olen_lzo = olen; - err = lzo1x_decompress((const unsigned char *)buf+header_len, - actual_size,(unsigned char *)in_buf, &olen_lzo, NULL); - - olen = olen_lzo; - - if (err != LZO_E_OK || (olen == 0 || olen > UNIV_PAGE_SIZE)) { - ib_logf(IB_LOG_LEVEL_ERROR, - "Corruption: Page is marked as compressed" - " but uncompress failed with error %d " - " size " ULINTPF " len " ULINTPF ".", - err, actual_size, len); - - fflush(stderr); - - if (return_error) { - goto error_return; - } - ut_error; + lzo_uint len_lzo = srv_page_size; + if (LZO_E_OK == lzo1x_decompress_safe( + buf + header_len, + actual_size, tmp_buf, &len_lzo, NULL) + && len_lzo == srv_page_size) { + break; } - break; + return 0; } #endif /* HAVE_LZO */ #ifdef HAVE_LZMA case PAGE_LZMA_ALGORITHM: { - - lzma_ret ret; size_t src_pos = 0; size_t dst_pos = 0; uint64_t memlimit = UINT64_MAX; - ret = lzma_stream_buffer_decode( - &memlimit, - 0, - NULL, - buf+header_len, - &src_pos, - actual_size, - in_buf, - &dst_pos, - len); - - - if (ret != LZMA_OK || (dst_pos == 0 || dst_pos > UNIV_PAGE_SIZE)) { - ib_logf(IB_LOG_LEVEL_ERROR, - "Corruption: Page is marked as compressed" - " but decompression read only %ld bytes" - " size " ULINTPF "len " ULINTPF ".", - dst_pos, actual_size, len); - fflush(stderr); - - if (return_error) { - goto error_return; - } - ut_error; + if (LZMA_OK == lzma_stream_buffer_decode( + &memlimit, 0, NULL, buf + header_len, + &src_pos, actual_size, tmp_buf, &dst_pos, + srv_page_size) + && dst_pos == srv_page_size) { + break; } - - break; + return 0; } #endif /* HAVE_LZMA */ #ifdef HAVE_BZIP2 case PAGE_BZIP2_ALGORITHM: { - unsigned int dst_pos = UNIV_PAGE_SIZE; - - err = BZ2_bzBuffToBuffDecompress( - (char *)in_buf, - &dst_pos, - (char *)(buf+header_len), - actual_size, - 1, - 0); - - if (err != BZ_OK || (dst_pos == 0 || dst_pos > UNIV_PAGE_SIZE)) { - ib_logf(IB_LOG_LEVEL_ERROR, - "Corruption: Page is marked as compressed" - " but decompression read only %du bytes" - " size " ULINTPF " len " ULINTPF " err %d.", - dst_pos, actual_size, len, err); - fflush(stderr); - - if (return_error) { - goto error_return; - } - ut_error; + unsigned int dst_pos = srv_page_size; + if (BZ_OK == BZ2_bzBuffToBuffDecompress( + reinterpret_cast(tmp_buf), + &dst_pos, + reinterpret_cast(buf) + header_len, + actual_size, 1, 0) + && dst_pos == srv_page_size) { + break; } - break; + return 0; } #endif /* HAVE_BZIP2 */ #ifdef HAVE_SNAPPY - case PAGE_SNAPPY_ALGORITHM: - { - snappy_status cstatus; - ulint olen = UNIV_PAGE_SIZE; - - cstatus = snappy_uncompress( - (const char *)(buf+header_len), - (size_t)actual_size, - (char *)in_buf, - (size_t*)&olen); - - if (cstatus != SNAPPY_OK || olen != UNIV_PAGE_SIZE) { - ib_logf(IB_LOG_LEVEL_ERROR, - "Corruption: Page is marked as compressed" - " but decompression read only " ULINTPF " bytes" - " size " ULINTPF " len " ULINTPF " err %d.", - olen, actual_size, len, (int)cstatus); - fflush(stderr); - - if (return_error) { - goto error_return; - } - ut_error; + case PAGE_SNAPPY_ALGORITHM: { + size_t olen = srv_page_size; + + if (SNAPPY_OK == snappy_uncompress( + reinterpret_cast(buf) + header_len, + actual_size, + reinterpret_cast(tmp_buf), &olen) + && olen == srv_page_size) { + break; } - - break; + return 0; } #endif /* HAVE_SNAPPY */ - default: - ib_logf(IB_LOG_LEVEL_ERROR, - "Corruption: Page is marked as compressed" - " but compression algorithm %s" - " is not known." - ,fil_get_compression_alg_name(compression_alg)); - - fflush(stderr); - if (return_error) { - goto error_return; - } - ut_error; - break; } srv_stats.pages_page_decompressed.inc(); - - /* Copy the uncompressed page to the buffer pool, not - really any other options. */ - memcpy(buf, in_buf, len); - -error_return: - if (page_buf != in_buf) { - ut_free(in_buf); - } + memcpy(buf, tmp_buf, srv_page_size); + return actual_size; } diff --git a/storage/innobase/fsp/fsp0fsp.cc b/storage/innobase/fsp/fsp0fsp.cc index 1cf37f366..b20c59c4d 100644 --- a/storage/innobase/fsp/fsp0fsp.cc +++ b/storage/innobase/fsp/fsp0fsp.cc @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 1995, 2016, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2017, MariaDB Corporation. +Copyright (c) 2017, 2018, MariaDB Corporation. 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 @@ -3027,7 +3027,7 @@ fseg_free_page_low( /* Drop search system page hash index if the page is found in the pool and is hashed */ - btr_search_drop_page_hash_when_freed(space, zip_size, page); + btr_search_drop_page_hash_when_freed(space, page); descr = xdes_get_descriptor(space, zip_size, page, mtr); @@ -3247,7 +3247,7 @@ fseg_free_extent( found in the pool and is hashed */ btr_search_drop_page_hash_when_freed( - space, zip_size, first_page_in_extent + i); + space, first_page_in_extent + i); } } diff --git a/storage/innobase/fts/fts0fts.cc b/storage/innobase/fts/fts0fts.cc index dc121083c..f65265fd5 100644 --- a/storage/innobase/fts/fts0fts.cc +++ b/storage/innobase/fts/fts0fts.cc @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 2011, 2017, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2016, 2017, MariaDB Corporation. +Copyright (c) 2016, 2018, MariaDB Corporation. 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 @@ -4628,6 +4628,7 @@ fts_sync( ib_vector_get(cache->indexes, i)); if (index_cache->index->to_be_dropped + || index_cache->index->table->to_be_dropped || fts_sync_index_check(index_cache)) { continue; } @@ -4638,17 +4639,6 @@ fts_sync( end_sync: if (error == DB_SUCCESS && !sync->interrupted) { error = fts_sync_commit(sync); - if (error == DB_SUCCESS) { - for (i = 0; i < ib_vector_size(cache->indexes); ++i) { - fts_index_cache_t* index_cache; - index_cache = static_cast( - ib_vector_get(cache->indexes, i)); - if (index_cache->index->index_fts_syncing) { - index_cache->index->index_fts_syncing - = false; - } - } - } } else { fts_sync_rollback(sync); } @@ -4657,12 +4647,9 @@ fts_sync( /* Clear fts syncing flags of any indexes incase sync is interrupeted */ for (i = 0; i < ib_vector_size(cache->indexes); ++i) { - fts_index_cache_t* index_cache; - index_cache = static_cast( - ib_vector_get(cache->indexes, i)); - if (index_cache->index->index_fts_syncing == true) { - index_cache->index->index_fts_syncing = false; - } + static_cast( + ib_vector_get(cache->indexes, i)) + ->index->index_fts_syncing = false; } sync->interrupted = false; diff --git a/storage/innobase/handler/ha_innodb.cc b/storage/innobase/handler/ha_innodb.cc index b66f74873..0daa89b6e 100644 --- a/storage/innobase/handler/ha_innodb.cc +++ b/storage/innobase/handler/ha_innodb.cc @@ -1,10 +1,10 @@ /***************************************************************************** -Copyright (c) 2000, 2017, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2013, 2017, MariaDB Corporation. +Copyright (c) 2000, 2018, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2008, 2009 Google Inc. Copyright (c) 2009, Percona Inc. Copyright (c) 2012, Facebook Inc. +Copyright (c) 2013, 2018, MariaDB Corporation. Portions of this file contain modifications contributed and copyrighted by Google, Inc. Those modifications are gratefully acknowledged and are described @@ -55,7 +55,7 @@ MYSQL_PLUGIN_IMPORT extern char mysql_unpacked_real_data_home[]; #include #endif -#include +#include /** @file ha_innodb.cc */ @@ -314,6 +314,23 @@ static TYPELIB innodb_lock_schedule_algorithm_typelib = { NULL }; +/** Possible values for system variable "innodb_default_row_format". */ +static const char* innodb_default_row_format_names[] = { + "redundant", + "compact", + "dynamic", + NullS +}; + +/** Used to define an enumerate type of the system variable +innodb_default_row_format. */ +static TYPELIB innodb_default_row_format_typelib = { + array_elements(innodb_default_row_format_names) - 1, + "innodb_default_row_format_typelib", + innodb_default_row_format_names, + NULL +}; + /* The following counter is used to convey information to InnoDB about server activity: in case of normal DML ops it is not sensible to call srv_active_wake_master_thread after each @@ -334,6 +351,35 @@ static const char* innobase_change_buffering_values[IBUF_USE_COUNT] = { "all" /* IBUF_USE_ALL */ }; + +/** Note we cannot use rec_format_enum because we do not allow +COMPRESSED row format for innodb_default_row_format option. */ +enum default_row_format_enum { + DEFAULT_ROW_FORMAT_REDUNDANT = 0, + DEFAULT_ROW_FORMAT_COMPACT = 1, + DEFAULT_ROW_FORMAT_DYNAMIC = 2 +}; + +/** Convert an InnoDB ROW_FORMAT value. +@param[in] row_format row_format from "innodb_default_row_format" +@return converted ROW_FORMAT */ +static rec_format_t get_row_format(ulong row_format) +{ + switch (row_format) { + case DEFAULT_ROW_FORMAT_REDUNDANT: + return REC_FORMAT_REDUNDANT; + case DEFAULT_ROW_FORMAT_COMPACT: + return REC_FORMAT_COMPACT; + case DEFAULT_ROW_FORMAT_DYNAMIC: + return REC_FORMAT_DYNAMIC; + default: + ut_ad(0); + return REC_FORMAT_COMPACT; + } +} + +static ulong innodb_default_row_format; + /* Call back function array defined by MySQL and used to retrieve FTS results. */ const struct _ft_vft ft_vft_result = {NULL, @@ -1153,7 +1199,9 @@ innobase_close_connection( THD* thd); /*!< in: MySQL thread handle for which to close the connection */ -static void innobase_kill_query(handlerton *hton, THD* thd, enum thd_kill_levels level); +/** Cancel any pending lock request associated with the current THD. +@sa THD::awake() @sa ha_kill_query() */ +static void innobase_kill_query(handlerton*, THD* thd, enum thd_kill_levels); static void innobase_commit_ordered(handlerton *hton, THD* thd, bool all); /*****************************************************************//** @@ -2365,8 +2413,12 @@ innobase_mysql_tmpfile( fd2 = -1; } } +#else +#ifdef F_DUPFD_CLOEXEC + fd2 = fcntl(fd, F_DUPFD_CLOEXEC, 0); #else fd2 = dup(fd); +#endif #endif if (fd2 < 0) { DBUG_PRINT("error",("Got error %d on dup",fd2)); @@ -2801,8 +2853,7 @@ ha_innobase::ha_innobase( (srv_force_primary_key ? HA_REQUIRE_PRIMARY_KEY : 0 ) | HA_CAN_FULLTEXT_EXT | HA_CAN_EXPORT), start_of_scan(0), - num_write_row(0), - ha_partition_stats(NULL) + num_write_row(0) {} /*********************************************************************//** @@ -4845,23 +4896,12 @@ innobase_close_thd( UNIV_INTERN void lock_cancel_waiting_and_release(lock_t* lock); -/*****************************************************************//** -Cancel any pending lock request associated with the current THD. */ -static -void -innobase_kill_query( -/*======================*/ - handlerton* hton, /*!< in: innobase handlerton */ - THD* thd, /*!< in: MySQL thread being killed */ - enum thd_kill_levels level) /*!< in: kill level */ +/** Cancel any pending lock request associated with the current THD. +@sa THD::awake() @sa ha_kill_query() */ +static void innobase_kill_query(handlerton*, THD* thd, enum thd_kill_levels) { - trx_t* trx; - DBUG_ENTER("innobase_kill_query"); - DBUG_ASSERT(hton == innodb_hton_ptr); - #ifdef WITH_WSREP - wsrep_thd_LOCK(thd); if (wsrep_thd_get_conflict_state(thd) != NO_CONFLICT) { /* if victim has been signaled by BF thread and/or aborting is already progressing, following query aborting is not necessary @@ -4869,56 +4909,41 @@ innobase_kill_query( Also, BF thread should own trx mutex for the victim, which would conflict with trx_mutex_enter() below */ - wsrep_thd_UNLOCK(thd); DBUG_VOID_RETURN; } - wsrep_thd_UNLOCK(thd); #endif /* WITH_WSREP */ - trx = thd_to_trx(thd); - if (trx && trx->lock.wait_lock) { - /* In wsrep BF we have already took lock_sys and trx - mutex either on wsrep_abort_transaction() or - before wsrep_kill_victim(). In replication we - could own lock_sys mutex taken in - lock_deadlock_check_and_resolve(). */ - - WSREP_DEBUG("Killing victim trx %p BF %d trx BF %d trx_id " TRX_ID_FMT " ABORT %d thd %p" - " current_thd %p BF %d wait_lock_modes: %s\n", - trx, wsrep_thd_is_BF(trx->mysql_thd, FALSE), - wsrep_thd_is_BF(thd, FALSE), - trx->id, trx->abort_type, - trx->mysql_thd, - current_thd, - wsrep_thd_is_BF(current_thd, FALSE), - lock_get_info(trx->lock.wait_lock).c_str()); - - if (!wsrep_thd_is_BF(trx->mysql_thd, FALSE) - && trx->abort_type == TRX_SERVER_ABORT) { - ut_ad(!lock_mutex_own()); - lock_mutex_enter(); - } - - if (trx->abort_type != TRX_WSREP_ABORT) { - trx_mutex_enter(trx); - } + if (trx_t* trx = thd_to_trx(thd)) { + ut_ad(trx->mysql_thd == thd); - ut_ad(lock_mutex_own()); - ut_ad(trx_mutex_own(trx)); - - /* Cancel a pending lock request. */ - if (trx->lock.wait_lock) { - lock_cancel_waiting_and_release(trx->lock.wait_lock); + switch (trx->abort_type) { +#ifdef WITH_WSREP + case TRX_WSREP_ABORT: + break; +#endif + case TRX_SERVER_ABORT: + if (!wsrep_thd_is_BF(trx->mysql_thd, FALSE)) { + lock_mutex_enter(); + } + /* fall through */ + case TRX_REPLICATION_ABORT: + trx_mutex_enter(trx); } - - if (trx->abort_type != TRX_WSREP_ABORT) { + /* Cancel a pending lock request if there are any */ + lock_trx_handle_wait(trx); + switch (trx->abort_type) { +#ifdef WITH_WSREP + case TRX_WSREP_ABORT: + break; +#endif + case TRX_SERVER_ABORT: + if (!wsrep_thd_is_BF(trx->mysql_thd, FALSE)) { + lock_mutex_exit(); + } + /* fall through */ + case TRX_REPLICATION_ABORT: trx_mutex_exit(trx); } - - if (!wsrep_thd_is_BF(trx->mysql_thd, FALSE) && - trx->abort_type == TRX_SERVER_ABORT) { - lock_mutex_exit(); - } } DBUG_VOID_RETURN; @@ -8414,14 +8439,12 @@ ha_innobase::write_row( user_thd); #ifdef WITH_WSREP - if (!error_result && - wsrep_thd_exec_mode(user_thd) == LOCAL_STATE && - wsrep_on(user_thd) && - !wsrep_consistency_check(user_thd) && - !wsrep_thd_ignore_table(user_thd)) - { - if (wsrep_append_keys(user_thd, false, record, NULL)) - { + if (!error_result + && wsrep_on(user_thd) + && wsrep_thd_exec_mode(user_thd) == LOCAL_STATE + && !wsrep_consistency_check(user_thd) + && !wsrep_thd_ignore_table(user_thd)) { + if (wsrep_append_keys(user_thd, false, record, NULL)) { DBUG_PRINT("wsrep", ("row key failed")); error_result = HA_ERR_INTERNAL_ERROR; goto wsrep_error; @@ -9042,7 +9065,7 @@ ha_innobase::unlock_row(void) But there are some calls to this function from the SQL layer when the transaction is in state TRX_STATE_NOT_STARTED. The check on prebuilt->select_lock_type above gets around this issue. */ - ut_ad(trx_state_eq(prebuilt->trx, TRX_STATE_ACTIVE)); + ut_ad(trx_state_eq(prebuilt->trx, TRX_STATE_ACTIVE, true)); switch (prebuilt->row_read_type) { case ROW_READ_WITH_LOCKS: @@ -11326,8 +11349,6 @@ create_options_are_invalid( CHECK_ERROR_ROW_TYPE_NEEDS_GT_ANTELOPE; break; case ROW_TYPE_DYNAMIC: - CHECK_ERROR_ROW_TYPE_NEEDS_FILE_PER_TABLE(use_tablespace); - CHECK_ERROR_ROW_TYPE_NEEDS_GT_ANTELOPE; /* ROW_FORMAT=DYNAMIC also shuns KEY_BLOCK_SIZE */ /* fall through */ case ROW_TYPE_COMPACT: @@ -11561,7 +11582,8 @@ innobase_table_flags( bool zip_allowed = true; ulint zip_ssize = 0; enum row_type row_format; - rec_format_t innodb_row_format = REC_FORMAT_COMPACT; + rec_format_t innodb_row_format = + get_row_format(innodb_default_row_format); bool use_data_dir; ha_table_option_struct *options= form->s->option_struct; @@ -11708,37 +11730,29 @@ innobase_table_flags( /* Validate the row format. Correct it if necessary */ switch (row_format) { + case ROW_TYPE_DEFAULT: + break; case ROW_TYPE_REDUNDANT: innodb_row_format = REC_FORMAT_REDUNDANT; break; - case ROW_TYPE_COMPRESSED: case ROW_TYPE_DYNAMIC: + innodb_row_format = REC_FORMAT_DYNAMIC; + break; + case ROW_TYPE_COMPRESSED: if (!use_tablespace) { push_warning_printf( thd, Sql_condition::WARN_LEVEL_WARN, ER_ILLEGAL_HA_CREATE_OPTION, - "InnoDB: ROW_FORMAT=%s requires" - " innodb_file_per_table.", - get_row_format_name(row_format)); + "InnoDB: ROW_FORMAT=COMPRESSED requires" + " innodb_file_per_table."); } else if (file_format_allowed == UNIV_FORMAT_A) { push_warning_printf( thd, Sql_condition::WARN_LEVEL_WARN, ER_ILLEGAL_HA_CREATE_OPTION, - "InnoDB: ROW_FORMAT=%s requires" - " innodb_file_format > Antelope.", - get_row_format_name(row_format)); + "InnoDB: ROW_FORMAT=COMPRESSED requires" + " innodb_file_format > Antelope."); } else { - switch(row_format) { - case ROW_TYPE_COMPRESSED: - innodb_row_format = REC_FORMAT_COMPRESSED; - break; - case ROW_TYPE_DYNAMIC: - innodb_row_format = REC_FORMAT_DYNAMIC; - break; - default: - /* Not possible, avoid compiler warning */ - break; - } + innodb_row_format = REC_FORMAT_COMPRESSED; break; /* Correct row_format */ } zip_allowed = FALSE; @@ -11752,10 +11766,8 @@ innobase_table_flags( ER_ILLEGAL_HA_CREATE_OPTION, "InnoDB: assuming ROW_FORMAT=COMPACT."); /* fall through */ - case ROW_TYPE_DEFAULT: - /* If we fell through, set row format to Compact. */ - row_format = ROW_TYPE_COMPACT; case ROW_TYPE_COMPACT: + innodb_row_format = REC_FORMAT_COMPACT; break; } @@ -13894,6 +13906,7 @@ ha_innobase::optimize( This works OK otherwise, but MySQL locks the entire table during calls to OPTIMIZE, which is undesirable. */ + bool try_alter = true; if (srv_defragment) { int err; @@ -13901,7 +13914,7 @@ ha_innobase::optimize( err = defragment_table(prebuilt->table->name, NULL, false); if (err == 0) { - return (HA_ADMIN_OK); + try_alter = false; } else { push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, err, @@ -13909,9 +13922,7 @@ ha_innobase::optimize( prebuilt->table->name, err); if(err == ER_SP_ALREADY_EXISTS) { - return (HA_ADMIN_OK); - } else { - return (HA_ADMIN_TRY_ALTER); + try_alter = false; } } } @@ -13922,11 +13933,10 @@ ha_innobase::optimize( fts_sync_table(prebuilt->table, false, true, false); fts_optimize_table(prebuilt->table); } - return(HA_ADMIN_OK); - } else { - - return(HA_ADMIN_TRY_ALTER); + try_alter = false; } + + return try_alter ? HA_ADMIN_TRY_ALTER : HA_ADMIN_OK; } /*******************************************************************//** @@ -14743,6 +14753,7 @@ ha_innobase::start_stmt( case SQLCOM_INSERT: case SQLCOM_UPDATE: case SQLCOM_DELETE: + case SQLCOM_REPLACE: init_table_handle_for_HANDLER(); prebuilt->select_lock_type = LOCK_X; prebuilt->stored_select_lock_type = LOCK_X; @@ -16737,13 +16748,6 @@ innodb_max_dirty_pages_pct_lwm_update( srv_max_dirty_pages_pct_lwm = in_val; } -UNIV_INTERN -void -ha_innobase::set_partition_owner_stats(ha_statistics *stats) -{ - ha_partition_stats= stats; -} - /************************************************************//** Validate the file format name and return its corresponding id. @return valid file format id */ @@ -18603,8 +18607,10 @@ wsrep_innobase_kill_one_trx( thd_get_thread_id(thd), victim_trx->id); - WSREP_DEBUG("Aborting query: %s", - (thd && wsrep_thd_query(thd)) ? wsrep_thd_query(thd) : "void"); + WSREP_DEBUG("Aborting query: %s conf %d trx: %lu", + (thd && wsrep_thd_query(thd)) ? wsrep_thd_query(thd) : "void", + wsrep_thd_conflict_state(thd, FALSE), + wsrep_thd_ws_handle(thd)->trx_id); wsrep_thd_LOCK(thd); DBUG_EXECUTE_IF("sync.wsrep_after_BF_victim_lock", @@ -18667,7 +18673,7 @@ wsrep_innobase_kill_one_trx( wsrep_t *wsrep= get_wsrep(); rcode = wsrep->abort_pre_commit( wsrep, bf_seqno, - (wsrep_trx_id_t)victim_trx->id + (wsrep_trx_id_t)wsrep_thd_ws_handle(thd)->trx_id ); switch (rcode) { @@ -18724,7 +18730,7 @@ wsrep_innobase_kill_one_trx( thd_get_thread_id(thd))); WSREP_DEBUG("kill query for: %ld", thd_get_thread_id(thd)); - /* Note that innobase_kill_connection will take lock_mutex + /* Note that innobase_kill_query will take lock_mutex and trx_mutex */ wsrep_thd_UNLOCK(thd); wsrep_thd_awake(thd, signal); @@ -18790,12 +18796,14 @@ wsrep_abort_transaction( my_bool signal) { DBUG_ENTER("wsrep_innobase_abort_thd"); - trx_t* victim_trx = thd_to_trx(victim_thd); - trx_t* bf_trx = (bf_thd) ? thd_to_trx(bf_thd) : NULL; + + trx_t* victim_trx = thd_to_trx(victim_thd); + trx_t* bf_trx = (bf_thd) ? thd_to_trx(bf_thd) : NULL; - WSREP_DEBUG("abort transaction: BF: %s victim: %s", - wsrep_thd_query(bf_thd), - wsrep_thd_query(victim_thd)); + WSREP_DEBUG("abort transaction: BF: %s victim: %s victim conf: %d", + wsrep_thd_query(bf_thd), + wsrep_thd_query(victim_thd), + wsrep_thd_conflict_state(victim_thd, FALSE)); if (victim_trx) { lock_mutex_enter(); @@ -18822,29 +18830,27 @@ wsrep_abort_transaction( static int innobase_wsrep_set_checkpoint(handlerton* hton, const XID* xid) { DBUG_ASSERT(hton == innodb_hton_ptr); - if (wsrep_is_wsrep_xid(xid)) { - mtr_t mtr; - mtr_start(&mtr); - trx_sysf_t* sys_header = trx_sysf_get(&mtr); - trx_sys_update_wsrep_checkpoint(xid, sys_header, &mtr); - mtr_commit(&mtr); - innobase_flush_logs(hton); - return 0; - } else { - return 1; - } + if (wsrep_is_wsrep_xid(xid)) { + mtr_t mtr; + mtr_start(&mtr); + trx_sysf_t* sys_header = trx_sysf_get(&mtr); + trx_sys_update_wsrep_checkpoint(xid, sys_header, &mtr); + mtr_commit(&mtr); + innobase_flush_logs(hton); + return 0; + } else { + return 1; + } } static int innobase_wsrep_get_checkpoint(handlerton* hton, XID* xid) { DBUG_ASSERT(hton == innodb_hton_ptr); - trx_sys_read_wsrep_checkpoint(xid); - return 0; + trx_sys_read_wsrep_checkpoint(xid); + return 0; } -static void -wsrep_fake_trx_id( -/*==================*/ +static void wsrep_fake_trx_id( handlerton *hton, THD *thd) /*!< in: user thread handle */ { @@ -19805,6 +19811,14 @@ static MYSQL_SYSVAR_BOOL(cmp_per_index_enabled, srv_cmp_per_index_enabled, "may have negative impact on performance (off by default)", NULL, innodb_cmp_per_index_update, FALSE); +static MYSQL_SYSVAR_ENUM(default_row_format, innodb_default_row_format, + PLUGIN_VAR_RQCMDARG, + "The default ROW FORMAT for all innodb tables created without explicit" + " ROW_FORMAT. Possible values are REDUNDANT, COMPACT, and DYNAMIC." + " The ROW_FORMAT value COMPRESSED is not allowed", + NULL, NULL, DEFAULT_ROW_FORMAT_COMPACT, + &innodb_default_row_format_typelib); + #ifdef UNIV_DEBUG static MYSQL_SYSVAR_UINT(trx_rseg_n_slots_debug, trx_rseg_n_slots_debug, PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_NOCMDOPT, @@ -20174,6 +20188,7 @@ static struct st_mysql_sys_var* innobase_system_variables[]= { MYSQL_SYSVAR(sync_array_size), MYSQL_SYSVAR(compression_failure_threshold_pct), MYSQL_SYSVAR(compression_pad_pct_max), + MYSQL_SYSVAR(default_row_format), MYSQL_SYSVAR(simulate_comp_failures), #ifdef UNIV_DEBUG MYSQL_SYSVAR(trx_rseg_n_slots_debug), diff --git a/storage/innobase/handler/ha_innodb.h b/storage/innobase/handler/ha_innodb.h index 300f49c93..9c8389104 100644 --- a/storage/innobase/handler/ha_innodb.h +++ b/storage/innobase/handler/ha_innodb.h @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 2000, 2017, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2013, 2017, MariaDB Corporation. +Copyright (c) 2013, 2018, MariaDB Corporation. 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 @@ -100,8 +100,6 @@ class ha_innobase: public handler or undefined */ uint num_write_row; /*!< number of write_row() calls */ - ha_statistics* ha_partition_stats; /*!< stats of the partition owner - handler (if there is one) */ uint store_key_val_for_row(uint keynr, char* buff, uint buff_len, const uchar* record); inline void update_thd(THD* thd); @@ -316,7 +314,6 @@ class ha_innobase: public handler Alter_inplace_info* ha_alter_info, bool commit); /** @} */ - void set_partition_owner_stats(ha_statistics *stats); bool check_if_incompatible_data(HA_CREATE_INFO *info, uint table_changes); private: diff --git a/storage/innobase/handler/handler0alter.cc b/storage/innobase/handler/handler0alter.cc index f8e61631d..9f44b64a2 100644 --- a/storage/innobase/handler/handler0alter.cc +++ b/storage/innobase/handler/handler0alter.cc @@ -1,6 +1,6 @@ /***************************************************************************** -Copyright (c) 2005, 2017, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 2005, 2018, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2013, 2018, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under @@ -1619,6 +1619,7 @@ innobase_create_index_def( if (key_clustered) { DBUG_ASSERT(!(key->flags & HA_FULLTEXT)); + DBUG_ASSERT(key->flags & HA_NOSAME); index->ind_type |= DICT_CLUSTERED; } else if (key->flags & HA_FULLTEXT) { DBUG_ASSERT(!(key->flags & HA_KEYFLAG_MASK @@ -1934,14 +1935,9 @@ innobase_create_key_defs( ulint primary_key_number; if (new_primary) { - if (n_add == 0) { - DBUG_ASSERT(got_default_clust); - DBUG_ASSERT(altered_table->s->primary_key - == 0); - primary_key_number = 0; - } else { - primary_key_number = *add; - } + DBUG_ASSERT(n_add || got_default_clust); + DBUG_ASSERT(n_add || !altered_table->s->primary_key); + primary_key_number = altered_table->s->primary_key; } else if (got_default_clust) { /* Create the GEN_CLUST_INDEX */ index_def_t* index = indexdef++; @@ -4417,12 +4413,16 @@ rollback_inplace_alter_table( row_mysql_lock_data_dictionary(ctx->trx); if (ctx->need_rebuild()) { - dberr_t err; - ulint flags = ctx->new_table->flags; - /* DML threads can access ctx->new_table via the online rebuild log. Free it first. */ innobase_online_rebuild_log_free(prebuilt->table); + } + + if (!ctx->new_table) { + ut_ad(ctx->need_rebuild()); + } else if (ctx->need_rebuild()) { + dberr_t err; + ulint flags = ctx->new_table->flags; /* Since the FTS index specific auxiliary tables has not yet registered with "table->fts" by fts_add_index(), @@ -4879,13 +4879,15 @@ innobase_rename_columns_cache( } /** Get the auto-increment value of the table on commit. -@param ha_alter_info Data used during in-place alter -@param ctx In-place ALTER TABLE context -@param altered_table MySQL table that is being altered -@param old_table MySQL table as it is before the ALTER operation -@return the next auto-increment value (0 if not present) */ +@param[in] ha_alter_info Data used during in-place alter +@param[in,out] ctx In-place ALTER TABLE context + return autoinc value in ctx->max_autoinc +@param altered_table[in] MySQL table that is being altered +@param old_table[in] MySQL table as it is before the ALTER operation +retval true Failure +@retval false Success*/ static MY_ATTRIBUTE((nonnull, warn_unused_result)) -ulonglong +bool commit_get_autoinc( /*===============*/ Alter_inplace_info* ha_alter_info, @@ -4893,23 +4895,28 @@ commit_get_autoinc( const TABLE* altered_table, const TABLE* old_table) { - ulonglong max_autoinc; DBUG_ENTER("commit_get_autoinc"); if (!altered_table->found_next_number_field) { /* There is no AUTO_INCREMENT column in the table after the ALTER operation. */ - max_autoinc = 0; + ctx->max_autoinc = 0; } else if (ctx->add_autoinc != ULINT_UNDEFINED) { /* An AUTO_INCREMENT column was added. Get the last value from the sequence, which may be based on a supplied AUTO_INCREMENT value. */ - max_autoinc = ctx->sequence.last(); + ctx->max_autoinc = ctx->sequence.last(); } else if ((ha_alter_info->handler_flags & Alter_inplace_info::CHANGE_CREATE_OPTION) && (ha_alter_info->create_info->used_fields & HA_CREATE_USED_AUTO)) { + + /* Check if the table is discarded */ + if(dict_table_is_discarded(ctx->old_table)) { + DBUG_RETURN(true); + } + /* An AUTO_INCREMENT value was supplied, but the table was not rebuilt. Get the user-supplied value or the last value from the sequence. */ @@ -4924,7 +4931,8 @@ commit_get_autoinc( dict_index_t* index = dict_table_get_index_on_name( ctx->old_table, autoinc_key->name); - max_autoinc = ha_alter_info->create_info->auto_increment_value; + ctx->max_autoinc = + ha_alter_info->create_info->auto_increment_value; dict_table_autoinc_lock(ctx->old_table); @@ -4933,8 +4941,8 @@ commit_get_autoinc( if (err != DB_SUCCESS) { ut_ad(0); - max_autoinc = 0; - } else if (max_autoinc <= max_value_table) { + ctx->max_autoinc = 0; + } else if (ctx->max_autoinc <= max_value_table) { ulonglong col_max_value; ulonglong offset; @@ -4942,7 +4950,7 @@ commit_get_autoinc( old_table->found_next_number_field); offset = ctx->prebuilt->autoinc_offset; - max_autoinc = innobase_next_autoinc( + ctx->max_autoinc = innobase_next_autoinc( max_value_table, 1, 1, offset, col_max_value); } @@ -4952,11 +4960,11 @@ commit_get_autoinc( Read the old counter value from the table. */ ut_ad(old_table->found_next_number_field); dict_table_autoinc_lock(ctx->old_table); - max_autoinc = ctx->old_table->autoinc; + ctx->max_autoinc = ctx->old_table->autoinc; dict_table_autoinc_unlock(ctx->old_table); } - DBUG_RETURN(max_autoinc); + DBUG_RETURN(false); } /** Add or drop foreign key constraints to the data dictionary tables, @@ -5782,21 +5790,6 @@ ha_innobase::commit_inplace_alter_table( ut_ad(prebuilt->table == ctx0->old_table); ha_alter_info->group_commit_ctx = NULL; - /* Free the ctx->trx of other partitions, if any. We will only - use the ctx0->trx here. Others may have been allocated in - the prepare stage. */ - - for (inplace_alter_handler_ctx** pctx = &ctx_array[1]; *pctx; - pctx++) { - ha_innobase_inplace_ctx* ctx - = static_cast(*pctx); - - if (ctx->trx) { - trx_free_for_mysql(ctx->trx); - ctx->trx = NULL; - } - } - trx_start_if_not_started_xa(prebuilt->trx); for (inplace_alter_handler_ctx** pctx = ctx_array; *pctx; pctx++) { @@ -5951,8 +5944,13 @@ ha_innobase::commit_inplace_alter_table( DBUG_ASSERT(new_clustered == ctx->need_rebuild()); - ctx->max_autoinc = commit_get_autoinc( - ha_alter_info, ctx, altered_table, table); + if (commit_get_autoinc(ha_alter_info, ctx, altered_table, + table)) { + fail = true; + my_error(ER_TABLESPACE_DISCARDED, MYF(0), + table->s->table_name.str); + goto rollback_trx; + } if (ctx->need_rebuild()) { ctx->tmp_name = dict_mem_create_temporary_tablename( @@ -5984,6 +5982,8 @@ ha_innobase::commit_inplace_alter_table( #endif } +rollback_trx: + /* Commit or roll back the changes to the data dictionary. */ if (fail) { @@ -6175,10 +6175,6 @@ ha_innobase::commit_inplace_alter_table( covering all partitions. */ share->idx_trans_tbl.index_count = 0; - if (trx == ctx0->trx) { - ctx0->trx = NULL; - } - /* Tell the InnoDB server that there might be work for utility threads: */ @@ -6201,10 +6197,31 @@ ha_innobase::commit_inplace_alter_table( } row_mysql_unlock_data_dictionary(trx); - trx_free_for_mysql(trx); + if (trx != ctx0->trx) { + trx_free_for_mysql(trx); + } DBUG_RETURN(true); } + if (trx == ctx0->trx) { + ctx0->trx = NULL; + } + + /* Free the ctx->trx of other partitions, if any. We will only + use the ctx0->trx here. Others may have been allocated in + the prepare stage. */ + + for (inplace_alter_handler_ctx** pctx = &ctx_array[1]; *pctx; + pctx++) { + ha_innobase_inplace_ctx* ctx + = static_cast(*pctx); + + if (ctx->trx) { + trx_free_for_mysql(ctx->trx); + ctx->trx = NULL; + } + } + /* Release the table locks. */ trx_commit_for_mysql(prebuilt->trx); diff --git a/storage/innobase/handler/i_s.cc b/storage/innobase/handler/i_s.cc index 2c82c1b49..31bb984f1 100644 --- a/storage/innobase/handler/i_s.cc +++ b/storage/innobase/handler/i_s.cc @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 2007, 2016, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2014, 2017, MariaDB Corporation. +Copyright (c) 2014, 2018, MariaDB Corporation. 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 @@ -4935,9 +4935,11 @@ i_s_innodb_buffer_page_fill( mutex_enter(&dict_sys->mutex); - if (const dict_index_t* index = - dict_index_get_if_in_cache_low( - page_info->index_id)) { + const dict_index_t* index = + dict_index_get_if_in_cache_low( + page_info->index_id); + + if (index) { table_name_end = innobase_convert_name( table_name, sizeof(table_name), index->table_name, @@ -4960,7 +4962,10 @@ i_s_innodb_buffer_page_fill( OK(ret); - fields[IDX_BUFFER_PAGE_TABLE_NAME]->set_notnull(); + if (index) { + fields[IDX_BUFFER_PAGE_TABLE_NAME] + ->set_notnull(); + } } OK(fields[IDX_BUFFER_PAGE_NUM_RECS]->store( @@ -5637,9 +5642,11 @@ i_s_innodb_buf_page_lru_fill( mutex_enter(&dict_sys->mutex); - if (const dict_index_t* index = - dict_index_get_if_in_cache_low( - page_info->index_id)) { + const dict_index_t* index = + dict_index_get_if_in_cache_low( + page_info->index_id); + + if (index) { table_name_end = innobase_convert_name( table_name, sizeof(table_name), index->table_name, @@ -5662,7 +5669,10 @@ i_s_innodb_buf_page_lru_fill( OK(ret); - fields[IDX_BUF_LRU_PAGE_TABLE_NAME]->set_notnull(); + if (index) { + fields[IDX_BUF_LRU_PAGE_TABLE_NAME] + ->set_notnull(); + } } OK(fields[IDX_BUF_LRU_PAGE_NUM_RECS]->store( diff --git a/storage/innobase/ibuf/ibuf0ibuf.cc b/storage/innobase/ibuf/ibuf0ibuf.cc index 2b406e116..17fe3ae75 100644 --- a/storage/innobase/ibuf/ibuf0ibuf.cc +++ b/storage/innobase/ibuf/ibuf0ibuf.cc @@ -5177,6 +5177,11 @@ ibuf_check_bitmap_on_import( bitmap_page = ibuf_bitmap_get_map_page( space_id, page_no, zip_size, &mtr); + if (!bitmap_page) { + mutex_exit(&ibuf_mutex); + return DB_CORRUPTION; + } + for (i = FSP_IBUF_BITMAP_OFFSET + 1; i < page_size; i++) { const ulint offset = page_no + i; diff --git a/storage/innobase/include/btr0sea.h b/storage/innobase/include/btr0sea.h index c95ca2805..4e1df7066 100644 --- a/storage/innobase/include/btr0sea.h +++ b/storage/innobase/include/btr0sea.h @@ -1,6 +1,7 @@ /***************************************************************************** Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 2018, MariaDB Corporation. 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 @@ -141,17 +142,11 @@ btr_search_drop_page_hash_index( s- or x-latched, or an index page for which we know that block->buf_fix_count == 0 */ -/********************************************************************//** -Drops a possible page hash index when a page is evicted from the buffer pool -or freed in a file segment. */ +/** Drop possible adaptive hash index entries when a page is evicted +from the buffer pool or freed in a file, or the index is being dropped. */ UNIV_INTERN void -btr_search_drop_page_hash_when_freed( -/*=================================*/ - ulint space, /*!< in: space id */ - ulint zip_size, /*!< in: compressed page size in bytes - or 0 for uncompressed pages */ - ulint page_no); /*!< in: page number */ +btr_search_drop_page_hash_when_freed(ulint space, ulint page_no); /********************************************************************//** Updates the page hash index when a single record is inserted on a page. */ UNIV_INTERN diff --git a/storage/innobase/include/buf0buf.h b/storage/innobase/include/buf0buf.h index 857bdf9d2..aca4e5881 100644 --- a/storage/innobase/include/buf0buf.h +++ b/storage/innobase/include/buf0buf.h @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 1995, 2016, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2013, 2017, MariaDB Corporation. +Copyright (c) 2013, 2018, MariaDB Corporation. 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 @@ -39,6 +39,7 @@ Created 11/5/1995 Heikki Tuuri #include "ut0rbt.h" #include "os0proc.h" #include "log0log.h" +#include "my_atomic.h" /** @name Modes for buf_page_get_gen */ /* @{ */ @@ -1506,45 +1507,16 @@ buf_page_encrypt_before_write( buf_page_t* bpage, byte* src_frame); -/********************************************************************** -The hook that is called after page is written to disk. -The function releases any resources needed for encryption that was allocated -in buf_page_encrypt_before_write */ -UNIV_INTERN -ibool -buf_page_encrypt_after_write( -/*=========================*/ - buf_page_t* page); /*!< in/out: buffer page that was flushed */ - -/********************************************************************//** -The hook that is called just before a page is read from disk. -The function allocates memory that is used to temporarily store disk content -before getting decrypted */ -UNIV_INTERN -byte* -buf_page_decrypt_before_read( -/*=========================*/ - buf_page_t* page, /*!< in/out: buffer page read from disk */ - ulint zip_size); /*!< in: compressed page size, or 0 */ - -/********************************************************************//** -The hook that is called just after a page is read from disk. -The function decrypt disk content into buf_page_t and releases the -temporary buffer that was allocated in buf_page_decrypt_before_read */ -UNIV_INTERN -bool -buf_page_decrypt_after_read( -/*========================*/ - buf_page_t* page); /*!< in/out: buffer page read from disk */ - /** @brief The temporary memory structure. NOTE! The definition appears here only for other modules of this directory (buf) to see it. Do not use from outside! */ typedef struct { - bool reserved; /*!< true if this slot is reserved +private: + int32 reserved; /*!< true if this slot is reserved */ +public: byte* crypt_buf; /*!< for encryption the data needs to be copied to a separate buffer before it's encrypted&written. this as a page can be @@ -1555,6 +1527,21 @@ typedef struct { byte* out_buf; /*!< resulting buffer after encryption/compression. This is a pointer and not allocated. */ + + /** Release the slot */ + void release() + { + my_atomic_store32_explicit(&reserved, false, + MY_MEMORY_ORDER_RELAXED); + } + + /** Acquire the slot + @return whether the slot was acquired */ + bool acquire() + { + return !my_atomic_fas32_explicit(&reserved, true, + MY_MEMORY_ORDER_RELAXED); + } } buf_tmp_buffer_t; /** The common buffer control block structure diff --git a/storage/innobase/include/buf0lru.h b/storage/innobase/include/buf0lru.h index 308bda20c..623883433 100644 --- a/storage/innobase/include/buf0lru.h +++ b/storage/innobase/include/buf0lru.h @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 1995, 2016, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2017, MariaDB Corporation. +Copyright (c) 2017, 2018, MariaDB Corporation. 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 @@ -34,6 +34,7 @@ Created 11/5/1995 Heikki Tuuri // Forward declaration struct trx_t; +struct dict_table_t; /******************************************************************//** Returns TRUE if less than 25 % of the buffer pool is available. This can be @@ -52,14 +53,15 @@ These are low-level functions /** Minimum LRU list length for which the LRU_old pointer is defined */ #define BUF_LRU_OLD_MIN_LEN 512 /* 8 megabytes of 16k pages */ +/** Drop the adaptive hash index for a tablespace. +@param[in,out] table table */ +UNIV_INTERN void buf_LRU_drop_page_hash_for_tablespace(dict_table_t* table); + /** Empty the flush list for all pages belonging to a tablespace. @param[in] id tablespace identifier @param[in] trx transaction, for checking for user interrupt; - or NULL if nothing is to be written -@param[in] drop_ahi whether to drop the adaptive hash index */ -UNIV_INTERN -void -buf_LRU_flush_or_remove_pages(ulint id, const trx_t* trx, bool drop_ahi=false); + or NULL if nothing is to be written */ +UNIV_INTERN void buf_LRU_flush_or_remove_pages(ulint id, const trx_t* trx); #if defined UNIV_DEBUG || defined UNIV_BUF_DEBUG /********************************************************************//** diff --git a/storage/innobase/include/data0type.ic b/storage/innobase/include/data0type.ic index eaa90f6d3..c04da618a 100644 --- a/storage/innobase/include/data0type.ic +++ b/storage/innobase/include/data0type.ic @@ -524,6 +524,7 @@ dtype_get_fixed_size_low( return(0); } #endif /* UNIV_DEBUG */ + /* fall through */ case DATA_CHAR: case DATA_FIXBINARY: case DATA_INT: @@ -601,6 +602,7 @@ dtype_get_min_size_low( return(0); } #endif /* UNIV_DEBUG */ + /* fall through */ case DATA_CHAR: case DATA_FIXBINARY: case DATA_INT: diff --git a/storage/innobase/include/fil0fil.h b/storage/innobase/include/fil0fil.h index 312b09e1f..a8dc9e143 100644 --- a/storage/innobase/include/fil0fil.h +++ b/storage/innobase/include/fil0fil.h @@ -173,8 +173,7 @@ extern fil_addr_t fil_addr_null; #define FIL_PAGE_TYPE_BLOB 10 /*!< Uncompressed BLOB page */ #define FIL_PAGE_TYPE_ZBLOB 11 /*!< First compressed BLOB page */ #define FIL_PAGE_TYPE_ZBLOB2 12 /*!< Subsequent compressed BLOB page */ -#define FIL_PAGE_TYPE_COMPRESSED 13 /*!< Compressed page */ -#define FIL_PAGE_TYPE_LAST FIL_PAGE_TYPE_COMPRESSED +#define FIL_PAGE_TYPE_LAST FIL_PAGE_TYPE_ZBLOB2 /*!< Last page type */ /* @} */ @@ -281,10 +280,6 @@ struct fil_space_t { an insert buffer merge request for a page because it actually was for the previous incarnation of the space */ - ibool stop_ios;/*!< TRUE if we want to rename the - .ibd file of tablespace and want to - stop temporarily posting of new i/o - requests on the file */ bool stop_new_ops; /*!< we set this TRUE when we start deleting a single-table tablespace. @@ -346,9 +341,6 @@ struct fil_space_t { bool is_in_unflushed_spaces; /*!< true if this space is currently in unflushed_spaces */ - bool printed_compression_failure; - /*!< true if we have already printed - compression failure */ fil_space_crypt_t* crypt_data; /*!< tablespace crypt data or NULL */ ulint file_block_size; @@ -1292,107 +1284,6 @@ fil_delete_file( /*============*/ const char* path); /*!< in: filepath of the ibd tablespace */ -/** Callback functor. */ -struct PageCallback { - - /** - Default constructor */ - PageCallback() - : - m_zip_size(), - m_page_size(), - m_filepath() UNIV_NOTHROW {} - - virtual ~PageCallback() UNIV_NOTHROW {} - - /** - Called for page 0 in the tablespace file at the start. - @param file_size - size of the file in bytes - @param block - contents of the first page in the tablespace file - @retval DB_SUCCESS or error code.*/ - virtual dberr_t init( - os_offset_t file_size, - const buf_block_t* block) UNIV_NOTHROW = 0; - - /** - Called for every page in the tablespace. If the page was not - updated then its state must be set to BUF_PAGE_NOT_USED. For - compressed tables the page descriptor memory will be at offset: - block->frame + UNIV_PAGE_SIZE; - @param offset - physical offset within the file - @param block - block read from file, note it is not from the buffer pool - @retval DB_SUCCESS or error code. */ - virtual dberr_t operator()( - os_offset_t offset, - buf_block_t* block) UNIV_NOTHROW = 0; - - /** - Set the name of the physical file and the file handle that is used - to open it for the file that is being iterated over. - @param filename - then physical name of the tablespace file. - @param file - OS file handle */ - void set_file(const char* filename, pfs_os_file_t file) UNIV_NOTHROW - { - m_file = file; - m_filepath = filename; - } - - /** - @return the space id of the tablespace */ - virtual ulint get_space_id() const UNIV_NOTHROW = 0; - - /** The compressed page size - @return the compressed page size */ - ulint get_zip_size() const - { - return(m_zip_size); - } - - /** - Set the tablespace compressed table size. - @return DB_SUCCESS if it is valie or DB_CORRUPTION if not */ - dberr_t set_zip_size(const buf_frame_t* page) UNIV_NOTHROW; - - /** The compressed page size - @return the compressed page size */ - ulint get_page_size() const - { - return(m_page_size); - } - - /** Compressed table page size */ - ulint m_zip_size; - - /** The tablespace page size. */ - ulint m_page_size; - - /** File handle to the tablespace */ - pfs_os_file_t m_file; - - /** Physical file path. */ - const char* m_filepath; - -protected: - // Disable copying - PageCallback(const PageCallback&); - PageCallback& operator=(const PageCallback&); -}; - -/********************************************************************//** -Iterate over all the pages in the tablespace. -@param table - the table definiton in the server -@param n_io_buffers - number of blocks to read and write together -@param callback - functor that will do the page updates -@return DB_SUCCESS or error code */ -UNIV_INTERN -dberr_t -fil_tablespace_iterate( -/*===================*/ - dict_table_t* table, - ulint n_io_buffers, - PageCallback& callback) - MY_ATTRIBUTE((nonnull, warn_unused_result)); - /*******************************************************************//** Checks if a single-table tablespace for a given table name exists in the tablespace memory cache. diff --git a/storage/innobase/include/fil0fil.ic b/storage/innobase/include/fil0fil.ic index 6c2504c9f..3f21c5293 100644 --- a/storage/innobase/include/fil0fil.ic +++ b/storage/innobase/include/fil0fil.ic @@ -1,6 +1,6 @@ /***************************************************************************** -Copyright (c) 2015, 2017, MariaDB Corporation. +Copyright (c) 2015, 2018, MariaDB Corporation. 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 @@ -65,12 +65,9 @@ fil_get_page_type_name( return "ZBLOB"; case FIL_PAGE_TYPE_ZBLOB2: return "ZBLOB2"; - case FIL_PAGE_TYPE_COMPRESSED: - return "ORACLE PAGE COMPRESSED"; } return "PAGE TYPE CORRUPTED"; - } /****************************************************************//** @@ -112,8 +109,7 @@ fil_page_type_validate( page_type == FIL_PAGE_TYPE_XDES || page_type == FIL_PAGE_TYPE_BLOB || page_type == FIL_PAGE_TYPE_ZBLOB || - page_type == FIL_PAGE_TYPE_ZBLOB2 || - page_type == FIL_PAGE_TYPE_COMPRESSED))) { + page_type == FIL_PAGE_TYPE_ZBLOB2))) { ulint key_version = mach_read_from_4(page + FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION); bool page_compressed = (page_type == FIL_PAGE_PAGE_COMPRESSED); diff --git a/storage/innobase/include/fil0pagecompress.h b/storage/innobase/include/fil0pagecompress.h index 03e16699c..934372c55 100644 --- a/storage/innobase/include/fil0pagecompress.h +++ b/storage/innobase/include/fil0pagecompress.h @@ -1,6 +1,6 @@ /***************************************************************************** -Copyright (C) 2013, 2017 MariaDB Corporation. All Rights Reserved. +Copyright (C) 2013, 2018 MariaDB Corporation. 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 @@ -30,70 +30,26 @@ atomic writes information to table space. Created 11/12/2013 Jan Lindström jan.lindstrom@skysql.com ***********************************************************************/ -/*******************************************************************//** -Find out wheather the page is index page or not -@return true if page type index page, false if not */ -UNIV_INLINE -ibool -fil_page_is_index_page( -/*===================*/ - byte *buf); /*!< in: page */ - -/****************************************************************//** -Get the name of the compression algorithm used for page -compression. -@return compression algorithm name or "UNKNOWN" if not known*/ -UNIV_INLINE -const char* -fil_get_compression_alg_name( -/*=========================*/ - ulint comp_alg); /*!mutex and sometimes by trx->mutex. */ -typedef enum { +enum trx_abort_t { TRX_SERVER_ABORT = 0, - TRX_WSREP_ABORT = 1, - TRX_REPLICATION_ABORT = 2 -} trx_abort_t; +#ifdef WITH_WSREP + TRX_WSREP_ABORT, +#endif + TRX_REPLICATION_ABORT +}; struct trx_t{ ulint magic_n; diff --git a/storage/innobase/include/univ.i b/storage/innobase/include/univ.i index 24bcab568..7304d1e5d 100644 --- a/storage/innobase/include/univ.i +++ b/storage/innobase/include/univ.i @@ -45,7 +45,7 @@ Created 1/20/1994 Heikki Tuuri #define INNODB_VERSION_MAJOR 5 #define INNODB_VERSION_MINOR 6 -#define INNODB_VERSION_BUGFIX 37 +#define INNODB_VERSION_BUGFIX 40 /* The following is the InnoDB version as shown in SELECT plugin_version FROM information_schema.plugins; @@ -65,6 +65,10 @@ component, i.e. we show M.N.P as M.N */ IB_TO_STR(INNODB_VERSION_MAJOR) "." \ IB_TO_STR(INNODB_VERSION_MINOR) "/en/" +/** How far ahead should we tell the service manager the timeout +(time in seconds) */ +#define INNODB_EXTEND_TIMEOUT_INTERVAL 30 + #ifdef MYSQL_DYNAMIC_PLUGIN /* In the dynamic plugin, redefine some externally visible symbols in order not to conflict with the symbols of a builtin InnoDB. */ diff --git a/storage/innobase/include/ut0timer.h b/storage/innobase/include/ut0timer.h index f361ae79b..3015771b4 100644 --- a/storage/innobase/include/ut0timer.h +++ b/storage/innobase/include/ut0timer.h @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 2013, 2014, Facebook, Inc. All Rights Reserved. -Copyright (c) 2014, SkySQL Ab. All Rights Reserved. +Copyright (c) 2014, 2018, MariaDB Corporation. 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 @@ -19,7 +19,7 @@ this program; if not, write to the Free Software Foundation, Inc., /********************************************************************//** @file include/ut0timer.h -Timer rountines +Timer routines Created 30/07/2014 Jan Lindström jan.lindstrom@skysql.com modified from https://github.com/facebook/mysql-5.6/commit/c75a413edeb96eb99bf11d7269bdfea06f96d6b6 @@ -28,8 +28,6 @@ modified from https://github.com/facebook/mysql-5.6/commit/c75a413edeb96eb99bf11 #define ut0timer_h #include "univ.i" -#include "data0type.h" -#include /* Current timer stats */ extern struct my_timer_unit_info ut_timer; @@ -47,39 +45,6 @@ Initializes my_timer struct to contain the info for selected timer.*/ UNIV_INTERN void ut_init_timer(void); -/**************************************************************//** -Return time passed since time then, automatically adjusted -for the estimated timer overhead. -@return time passed since "then" */ -UNIV_INLINE -ulonglong -ut_timer_since( -/*===========*/ - ulonglong then); /*!< in: time where to calculate */ -/**************************************************************//** -Get time passed since "then", and update then to now -@return time passed sinche "then" */ -UNIV_INLINE -ulonglong -ut_timer_since_and_update( -/*======================*/ - ulonglong *then); /*!< in: time where to calculate */ -/**************************************************************//** -Convert native timer units in a ulonglong into seconds in a double -@return time in a seconds */ -UNIV_INLINE -double -ut_timer_to_seconds( -/*=================*/ - ulonglong when); /*!< in: time where to calculate */ -/**************************************************************//** -Convert native timer units in a ulonglong into milliseconds in a double -@return time in milliseconds */ -UNIV_INLINE -double -ut_timer_to_milliseconds( -/*=====================*/ - ulonglong when); /*!< in: time where to calculate */ /**************************************************************//** Convert native timer units in a ulonglong into microseconds in a double @return time in microseconds */ diff --git a/storage/innobase/include/ut0timer.ic b/storage/innobase/include/ut0timer.ic index 46dcd0cb7..34886481e 100644 --- a/storage/innobase/include/ut0timer.ic +++ b/storage/innobase/include/ut0timer.ic @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 2013, 2014, Facebook, Inc. All Rights Reserved. -Copyright (c) 2014, SkySQL Ab. All Rights Reserved. +Copyright (c) 2014, 2018, MariaDB Corporation. 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 @@ -19,69 +19,12 @@ this program; if not, write to the Free Software Foundation, Inc., /********************************************************************//** @file include/ut0timer.ic -Timer rountines +Timer routines Created 30/07/2014 Jan Lindström jan.lindstrom@skysql.com modified from https://github.com/facebook/mysql-5.6/commit/c75a413edeb96eb99bf11d7269bdfea06f96d6b6 *************************************************************************/ -/**************************************************************//** -Return time passed since time then, automatically adjusted -for the estimated timer overhead. -@return time passed since "then" */ -UNIV_INLINE -ulonglong -ut_timer_since( -/*===========*/ - ulonglong then) /*!< in: time where to calculate */ -{ - return (ut_timer_now() - then) - ut_timer.overhead; -} - -/**************************************************************//** -Get time passed since "then", and update then to now -@return time passed sinche "then" */ -UNIV_INLINE -ulonglong -ut_timer_since_and_update( -/*======================*/ - ulonglong *then) /*!< in: time where to calculate */ -{ - ulonglong now = ut_timer_now(); - ulonglong ret = (now - (*then)) - ut_timer.overhead; - *then = now; - return ret; -} - -/**************************************************************//** -Convert native timer units in a ulonglong into seconds in a double -@return time in a seconds */ -UNIV_INLINE -double -ut_timer_to_seconds( -/*=================*/ - ulonglong when) /*!< in: time where to calculate */ -{ - double ret = (double)(when); - ret /= (double)(ut_timer.frequency); - return ret; -} - -/**************************************************************//** -Convert native timer units in a ulonglong into milliseconds in a double -@return time in milliseconds */ -UNIV_INLINE -double -ut_timer_to_milliseconds( -/*=====================*/ - ulonglong when) /*!< in: time where to calculate */ -{ - double ret = (double)(when); - ret *= 1000.0; - ret /= (double)(ut_timer.frequency); - return ret; -} - /**************************************************************//** Convert native timer units in a ulonglong into microseconds in a double @return time in microseconds */ diff --git a/storage/innobase/lock/lock0lock.cc b/storage/innobase/lock/lock0lock.cc index 64e7a8b96..441fcace7 100644 --- a/storage/innobase/lock/lock0lock.cc +++ b/storage/innobase/lock/lock0lock.cc @@ -898,7 +898,7 @@ UNIV_INLINE void lock_reset_lock_and_trx_wait( /*=========================*/ - lock_t* lock) /*!< in/out: record lock */ + lock_t* lock) /*!< in/out: record lock */ { ut_ad(lock_get_wait(lock)); ut_ad(lock_mutex_own()); @@ -2216,13 +2216,6 @@ lock_rec_create( trx_mutex_enter(trx); } - /* trx might not wait for c_lock, but some other lock - does not matter if wait_lock was released above - */ - if (c_lock->trx->lock.wait_lock == c_lock) { - lock_reset_lock_and_trx_wait(lock); - } - trx_mutex_exit(c_lock->trx); if (wsrep_debug) { @@ -4970,19 +4963,18 @@ lock_table_create( UT_LIST_ADD_LAST(trx_locks, trx->lock.trx_locks, lock); #ifdef WITH_WSREP - if (wsrep_thd_is_wsrep(trx->mysql_thd)) { - if (c_lock && wsrep_thd_is_BF(trx->mysql_thd, FALSE)) { + if (c_lock) { + if (wsrep_thd_is_wsrep(trx->mysql_thd) + && wsrep_thd_is_BF(trx->mysql_thd, FALSE)) { UT_LIST_INSERT_AFTER( un_member.tab_lock.locks, table->locks, c_lock, lock); } else { UT_LIST_ADD_LAST(un_member.tab_lock.locks, table->locks, lock); } - if (c_lock) { - trx_mutex_enter(c_lock->trx); - } + trx_mutex_enter(c_lock->trx); - if (c_lock && c_lock->trx->lock.que_state == TRX_QUE_LOCK_WAIT) { + if (c_lock->trx->lock.que_state == TRX_QUE_LOCK_WAIT) { c_lock->trx->lock.was_chosen_as_deadlock_victim = TRUE; @@ -4991,36 +4983,21 @@ lock_table_create( wsrep_print_wait_locks(c_lock->trx->lock.wait_lock); } - /* have to release trx mutex for the duration of - victim lock release. This will eventually call - lock_grant, which wants to grant trx mutex again - */ - /* caller has trx_mutex, have to release for lock cancel */ + /* The lock release will call lock_grant(), + which would acquire trx->mutex again. */ trx_mutex_exit(trx); lock_cancel_waiting_and_release(c_lock->trx->lock.wait_lock); trx_mutex_enter(trx); - /* trx might not wait for c_lock, but some other lock - does not matter if wait_lock was released above - */ - if (c_lock->trx->lock.wait_lock == c_lock) { - lock_reset_lock_and_trx_wait(lock); - } - if (wsrep_debug) { fprintf(stderr, "WSREP: c_lock canceled " TRX_ID_FMT "\n", c_lock->trx->id); } } - if (c_lock) { - trx_mutex_exit(c_lock->trx); - } - } else { + trx_mutex_exit(c_lock->trx); + } else #endif /* WITH_WSREP */ UT_LIST_ADD_LAST(un_member.tab_lock.locks, table->locks, lock); -#ifdef WITH_WSREP - } -#endif /* WITH_WSREP */ if (UNIV_UNLIKELY(type_mode & LOCK_WAIT)) { @@ -6918,10 +6895,10 @@ lock_rec_block_validate( page_no, RW_X_LATCH, NULL, BUF_GET_POSSIBLY_FREED, __FILE__, __LINE__, &mtr); - - buf_block_dbg_add_level(block, SYNC_NO_ORDER_CHECK); - - ut_ad(lock_rec_validate_page(block)); + if (block) { + buf_block_dbg_add_level(block, SYNC_NO_ORDER_CHECK); + ut_ad(lock_rec_validate_page(block)); + } mtr_commit(&mtr); fil_space_release(space); @@ -7940,7 +7917,10 @@ lock_trx_release_locks( } mutex_exit(&trx_sys->mutex); } else { - ut_ad(trx_state_eq(trx, TRX_STATE_ACTIVE)); + ut_ad(trx_state_eq(trx, TRX_STATE_ACTIVE) + || (trx_state_eq(trx, TRX_STATE_COMMITTED_IN_MEMORY) + && trx->is_recovered + && !UT_LIST_GET_LEN(trx->lock.trx_locks))); } /* The transition of trx->state to TRX_STATE_COMMITTED_IN_MEMORY @@ -7997,26 +7977,19 @@ lock_trx_handle_wait( /*=================*/ trx_t* trx) /*!< in/out: trx lock state */ { - dberr_t err; - - lock_mutex_enter(); - - trx_mutex_enter(trx); + ut_ad(lock_mutex_own()); + ut_ad(trx_mutex_own(trx)); if (trx->lock.was_chosen_as_deadlock_victim) { - err = DB_DEADLOCK; - } else if (trx->lock.wait_lock != NULL) { - lock_cancel_waiting_and_release(trx->lock.wait_lock); - err = DB_LOCK_WAIT; - } else { + return DB_DEADLOCK; + } + if (!trx->lock.wait_lock) { /* The lock was probably granted before we got here. */ - err = DB_SUCCESS; + return DB_SUCCESS; } - lock_mutex_exit(); - trx_mutex_exit(trx); - - return(err); + lock_cancel_waiting_and_release(trx->lock.wait_lock); + return DB_LOCK_WAIT; } /*********************************************************************//** diff --git a/storage/innobase/log/log0log.cc b/storage/innobase/log/log0log.cc index 7a242b76e..654645935 100644 --- a/storage/innobase/log/log0log.cc +++ b/storage/innobase/log/log0log.cc @@ -2,7 +2,7 @@ Copyright (c) 1995, 2016, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2009, Google Inc. -Copyright (c) 2014, 2017, MariaDB Corporation. +Copyright (c) 2014, 2018, MariaDB Corporation. Portions of this file contain modifications contributed and copyrighted by Google, Inc. Those modifications are gratefully acknowledged and are described @@ -39,7 +39,7 @@ Created 12/9/1995 Heikki Tuuri #ifndef UNIV_HOTBACKUP #if MYSQL_VERSION_ID < 100200 -# include /* sd_notifyf() */ +# include #endif #include "mem0mem.h" @@ -1443,6 +1443,12 @@ log_write_up_to( return; } + if (srv_shutdown_state != SRV_SHUTDOWN_NONE) { + service_manager_extend_timeout(INNODB_EXTEND_TIMEOUT_INTERVAL, + "log write up to: " LSN_PF, + lsn); + } + loop: ut_ad(++loop_count < 100); @@ -2351,8 +2357,9 @@ log_group_read_log_seg( if (recv_sys->report(ut_time())) { ib_logf(IB_LOG_LEVEL_INFO, "Read redo log up to LSN=" LSN_PF, start_lsn); - sd_notifyf(0, "STATUS=Read redo log up to LSN=" LSN_PF, - start_lsn); + service_manager_extend_timeout(INNODB_EXTEND_TIMEOUT_INTERVAL, + "Read redo log up to LSN=" LSN_PF, + start_lsn); } if (start_lsn != end_lsn) { @@ -3237,7 +3244,9 @@ logs_empty_and_mark_files_at_shutdown(void) os_event_set(lock_sys->timeout_event); os_event_set(dict_stats_event); } - os_thread_sleep(100000); +#define COUNT_INTERVAL 600U +#define CHECK_INTERVAL 100000U + os_thread_sleep(CHECK_INTERVAL); count++; @@ -3249,7 +3258,11 @@ logs_empty_and_mark_files_at_shutdown(void) if (ulint total_trx = srv_was_started && !srv_read_only_mode && srv_force_recovery < SRV_FORCE_NO_TRX_UNDO ? trx_sys_any_active_transactions() : 0) { - if (srv_print_verbose_log && count > 600) { + if (srv_print_verbose_log && count > COUNT_INTERVAL) { + service_manager_extend_timeout( + COUNT_INTERVAL * CHECK_INTERVAL/1000000 * 2, + "Waiting for %lu active transactions to finish", + (ulong) total_trx); ib_logf(IB_LOG_LEVEL_INFO, "Waiting for %lu active transactions to finish", (ulong) total_trx); @@ -3284,7 +3297,10 @@ logs_empty_and_mark_files_at_shutdown(void) if (thread_name) { ut_ad(!srv_read_only_mode); wait_suspend_loop: - if (srv_print_verbose_log && count > 600) { + service_manager_extend_timeout( + COUNT_INTERVAL * CHECK_INTERVAL/1000000 * 2, + "Waiting for %s to exit", thread_name); + if (srv_print_verbose_log && count > COUNT_INTERVAL) { ib_logf(IB_LOG_LEVEL_INFO, "Waiting for %s to exit", thread_name); count = 0; @@ -3320,10 +3336,14 @@ logs_empty_and_mark_files_at_shutdown(void) before proceeding further. */ count = 0; + service_manager_extend_timeout(COUNT_INTERVAL * CHECK_INTERVAL/1000000 * 2, + "Waiting for page cleaner"); while (buf_page_cleaner_is_active) { ++count; - os_thread_sleep(100000); - if (srv_print_verbose_log && count > 600) { + os_thread_sleep(CHECK_INTERVAL); + if (srv_print_verbose_log && count > COUNT_INTERVAL) { + service_manager_extend_timeout(COUNT_INTERVAL * CHECK_INTERVAL/1000000 * 2, + "Waiting for page cleaner"); ib_logf(IB_LOG_LEVEL_INFO, "Waiting for page_cleaner to " "finish flushing of buffer pool"); @@ -3408,6 +3428,8 @@ logs_empty_and_mark_files_at_shutdown(void) } if (!srv_read_only_mode) { + service_manager_extend_timeout(INNODB_EXTEND_TIMEOUT_INTERVAL, + "ensuring dirty buffer pool are written to log"); log_make_checkpoint_at(LSN_MAX, TRUE); mutex_enter(&log_sys->mutex); @@ -3441,23 +3463,9 @@ logs_empty_and_mark_files_at_shutdown(void) mutex_exit(&log_sys->mutex); - fil_flush_file_spaces(FIL_TABLESPACE); + /* Ensure that all buffered changes are written to the + redo log before fil_close_all_files(). */ fil_flush_file_spaces(FIL_LOG); - - /* The call fil_write_flushed_lsn_to_data_files() will - bypass the buffer pool: therefore it is essential that - the buffer pool has been completely flushed to disk! */ - - if (!buf_all_freed()) { - if (srv_print_verbose_log && count > 600) { - ib_logf(IB_LOG_LEVEL_INFO, - "Waiting for dirty buffer pages" - " to be flushed"); - count = 0; - } - - goto loop; - } } else { lsn = srv_start_lsn; } @@ -3468,8 +3476,9 @@ logs_empty_and_mark_files_at_shutdown(void) srv_thread_type type = srv_get_active_thread_type(); ut_a(type == SRV_NONE); - bool freed = buf_all_freed(); - ut_a(freed); + service_manager_extend_timeout(INNODB_EXTEND_TIMEOUT_INTERVAL, + "Free innodb buffer pool"); + buf_all_freed(); ut_a(lsn == log_sys->lsn); @@ -3499,9 +3508,6 @@ logs_empty_and_mark_files_at_shutdown(void) type = srv_get_active_thread_type(); ut_a(type == SRV_NONE); - freed = buf_all_freed(); - ut_a(freed); - ut_a(lsn == log_sys->lsn); } diff --git a/storage/innobase/log/log0recv.cc b/storage/innobase/log/log0recv.cc index 6e6d8aae2..deaf5e88d 100644 --- a/storage/innobase/log/log0recv.cc +++ b/storage/innobase/log/log0recv.cc @@ -30,7 +30,7 @@ Created 9/20/1997 Heikki Tuuri #include // Solaris/x86 header file bug #include -#include +#include #include "log0recv.h" @@ -1717,8 +1717,8 @@ recv_recover_page_func( if (recv_sys->report(time)) { ib_logf(IB_LOG_LEVEL_INFO, "To recover: " ULINTPF " pages from log", n); - sd_notifyf(0, "STATUS=To recover: " ULINTPF - " pages from log", n); + service_manager_extend_timeout( + INNODB_EXTEND_TIMEOUT_INTERVAL, "To recover: " ULINTPF " pages from log", n); } } @@ -2911,6 +2911,9 @@ recv_init_crash_recovery(void) and restore them from the doublewrite buffer if possible */ + service_manager_extend_timeout( + INNODB_EXTEND_TIMEOUT_INTERVAL, "Starting Innodb crash recovery"); + if (srv_force_recovery < SRV_FORCE_NO_LOG_REDO) { buf_dblwr_process(); diff --git a/storage/innobase/mem/mem0mem.cc b/storage/innobase/mem/mem0mem.cc index b9f190509..f91126697 100644 --- a/storage/innobase/mem/mem0mem.cc +++ b/storage/innobase/mem/mem0mem.cc @@ -406,6 +406,11 @@ mem_heap_create_block_func( heap->total_size += len; } + /* Poison all available memory. Individual chunks will be unpoisoned on + every mem_heap_alloc() call. */ + compile_time_assert(MEM_BLOCK_HEADER_SIZE >= sizeof *block); + UNIV_MEM_FREE(block + 1, len - sizeof *block); + ut_ad((ulint)MEM_BLOCK_HEADER_SIZE < len); return(block); diff --git a/storage/innobase/os/os0file.cc b/storage/innobase/os/os0file.cc index e9abdc91f..5aa9b6040 100644 --- a/storage/innobase/os/os0file.cc +++ b/storage/innobase/os/os0file.cc @@ -2,7 +2,7 @@ Copyright (c) 1995, 2017, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2009, Percona Inc. -Copyright (c) 2013, 2017, MariaDB Corporation. +Copyright (c) 2013, 2018, MariaDB Corporation. Portions of this file contain modifications contributed and copyrighted by Percona Inc.. Those modifications are @@ -1350,7 +1350,8 @@ os_file_create_simple_func( /* Use default security attributes and no template file. */ file = CreateFile( - (LPCTSTR) name, access, FILE_SHARE_READ, NULL, + (LPCTSTR) name, access, + FILE_SHARE_READ | FILE_SHARE_DELETE, NULL, create_flag, attributes, NULL); if (file == INVALID_HANDLE_VALUE) { @@ -1421,7 +1422,7 @@ os_file_create_simple_func( } do { - file = ::open(name, create_flag, os_innodb_umask); + file = ::open(name, create_flag | O_CLOEXEC, os_innodb_umask); if (file == -1) { *success = FALSE; @@ -1483,7 +1484,7 @@ os_file_create_simple_no_error_handling_func( DWORD access; DWORD create_flag; DWORD attributes = 0; - DWORD share_mode = FILE_SHARE_READ; + DWORD share_mode = FILE_SHARE_READ | FILE_SHARE_DELETE; ut_a(name); ut_a(!(create_mode & OS_FILE_ON_ERROR_SILENT)); @@ -1604,7 +1605,7 @@ os_file_create_simple_no_error_handling_func( return(file); } - file = open(name, create_flag, os_innodb_umask); + file = ::open(name, create_flag | O_CLOEXEC, os_innodb_umask); *success = file != -1; @@ -1764,7 +1765,7 @@ os_file_create_func( #ifdef __WIN__ DWORD create_flag; - DWORD share_mode = FILE_SHARE_READ; + DWORD share_mode = FILE_SHARE_READ | FILE_SHARE_DELETE; on_error_no_exit = create_mode & OS_FILE_ON_ERROR_NO_EXIT ? TRUE : FALSE; @@ -1969,7 +1970,7 @@ os_file_create_func( #endif /* O_SYNC */ do { - file = open(name, create_flag, os_innodb_umask); + file = ::open(name, create_flag | O_CLOEXEC, os_innodb_umask); if (file == -1) { const char* operation; @@ -2184,6 +2185,24 @@ os_file_delete_func( #endif } +/** Handle RENAME error. +@param name old name of the file +@param new_name new name of the file */ +static void os_file_handle_rename_error(const char* name, const char* new_name) +{ + if (os_file_get_last_error(true) != OS_FILE_DISK_FULL) { + ib_logf(IB_LOG_LEVEL_ERROR, "Cannot rename file '%s' to '%s'", + name, new_name); + } else if (!os_has_said_disk_full) { + os_has_said_disk_full = true; + /* Disk full error is reported irrespective of the + on_error_silent setting. */ + ib_logf(IB_LOG_LEVEL_ERROR, + "Full disk prevents renaming file '%s' to '%s'", + name, new_name); + } +} + /***********************************************************************//** NOTE! Use the corresponding macro os_file_rename(), not directly this function! Renames a file (can also move it to another directory). It is safest that the @@ -2219,8 +2238,7 @@ os_file_rename_func( return(TRUE); } - os_file_handle_error_no_exit(oldpath, "rename", FALSE, __FILE__, __LINE__); - + os_file_handle_rename_error(oldpath, newpath); return(FALSE); #else int ret; @@ -2229,8 +2247,7 @@ os_file_rename_func( ret = rename(oldpath, newpath); if (ret != 0) { - os_file_handle_error_no_exit(oldpath, "rename", FALSE, __FILE__, __LINE__); - + os_file_handle_rename_error(oldpath, newpath); return(FALSE); } @@ -2842,8 +2859,15 @@ os_file_read_func( MONITOR_ATOMIC_DEC_LOW(MONITOR_OS_PENDING_READS, monitor); - if (ret && len == n) { + if (!ret) { + } else if (len == n) { return(TRUE); + } else { + ib_logf(IB_LOG_LEVEL_ERROR, + "Tried to read " ULINTPF " bytes at offset " + UINT64PF ". Was only able to read %lu.", + n, offset, ret); + return FALSE; } #else /* __WIN__ */ ibool retry; @@ -2866,6 +2890,7 @@ os_file_read_func( "Tried to read " ULINTPF " bytes at offset " UINT64PF ". Was only able to read %ld.", n, offset, (lint) ret); + return FALSE; } #endif /* __WIN__ */ #ifdef __WIN__ @@ -2964,8 +2989,15 @@ os_file_read_no_error_handling_func( MONITOR_ATOMIC_DEC_LOW(MONITOR_OS_PENDING_READS, monitor); - if (ret && len == n) { + if (!ret) { + } else if (len == n) { return(TRUE); + } else { + ib_logf(IB_LOG_LEVEL_ERROR, + "Tried to read " ULINTPF " bytes at offset " + UINT64PF ". Was only able to read %lu.", + n, offset, len); + return FALSE; } #else /* __WIN__ */ ibool retry; @@ -2988,6 +3020,7 @@ os_file_read_no_error_handling_func( "Tried to read " ULINTPF " bytes at offset " UINT64PF ". Was only able to read %ld.", n, offset, (lint) ret); + return FALSE; } #endif /* __WIN__ */ #ifdef __WIN__ @@ -3422,7 +3455,7 @@ os_file_get_status( access = !srv_read_only_mode ? O_RDWR : O_RDONLY; - fh = ::open(path, access, os_innodb_umask); + fh = ::open(path, access | O_CLOEXEC, os_innodb_umask); if (fh == -1) { stat_info->rw_perm = false; @@ -3851,7 +3884,7 @@ os_aio_native_aio_supported(void) strcpy(name + dirnamelen, "ib_logfile0"); - fd = ::open(name, O_RDONLY); + fd = ::open(name, O_RDONLY | O_CLOEXEC); if (fd == -1) { diff --git a/storage/innobase/page/page0page.cc b/storage/innobase/page/page0page.cc index 231c01012..2cc967129 100644 --- a/storage/innobase/page/page0page.cc +++ b/storage/innobase/page/page0page.cc @@ -2,6 +2,7 @@ Copyright (c) 1994, 2016, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2012, Facebook Inc. +Copyright (c) 2018, MariaDB Corporation. 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 @@ -93,17 +94,13 @@ page_dir_find_owner_slot( /*=====================*/ const rec_t* rec) /*!< in: the physical record */ { - const page_t* page; - register uint16 rec_offs_bytes; - register const page_dir_slot_t* slot; - register const page_dir_slot_t* first_slot; - register const rec_t* r = rec; - ut_ad(page_rec_check(rec)); - page = page_align(rec); - first_slot = page_dir_get_nth_slot(page, 0); - slot = page_dir_get_nth_slot(page, page_dir_get_n_slots(page) - 1); + const page_t* page = page_align(rec); + const page_dir_slot_t* first_slot = page_dir_get_nth_slot(page, 0); + const page_dir_slot_t* slot = page_dir_get_nth_slot( + page, page_dir_get_n_slots(page) - 1); + const rec_t* r = rec; if (page_is_comp(page)) { while (rec_get_n_owned_new(r) == 0) { @@ -119,7 +116,7 @@ page_dir_find_owner_slot( } } - rec_offs_bytes = mach_encode_2(r - page); + uint16 rec_offs_bytes = mach_encode_2(r - page); while (UNIV_LIKELY(*(uint16*) slot != rec_offs_bytes)) { diff --git a/storage/innobase/row/row0import.cc b/storage/innobase/row/row0import.cc index cc5fe0acf..c808a991f 100644 --- a/storage/innobase/row/row0import.cc +++ b/storage/innobase/row/row0import.cc @@ -1,6 +1,6 @@ /***************************************************************************** -Copyright (c) 2012, 2016, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 2012, 2018, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2015, 2018, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under @@ -31,6 +31,7 @@ Created 2012-02-08 by Sunny Bains. #endif #include "btr0pcur.h" +#include "btr0sea.h" #include "que0que.h" #include "dict0boot.h" #include "ibuf0ibuf.h" @@ -40,12 +41,17 @@ Created 2012-02-08 by Sunny Bains. #include "row0mysql.h" #include "srv0start.h" #include "row0quiesce.h" +#include "fil0pagecompress.h" +#ifdef HAVE_LZO +#include "lzo/lzo1x.h" +#endif +#ifdef HAVE_SNAPPY +#include "snappy-c.h" +#endif #include -/** The size of the buffer to use for IO. Note: os_file_read() doesn't expect -reads to fail. If you set the buffer size to be greater than a multiple of the -file size then it will assert. TODO: Fix this limitation of the IO functions. +/** The size of the buffer to use for IO. @param n - page size of the tablespace. @retval number of pages */ #define IO_BUFFER_SIZE(n) ((1024 * 1024) / n) @@ -361,7 +367,8 @@ class IndexPurge { /** Functor that is called for each physical page that is read from the tablespace file. */ -class AbstractCallback : public PageCallback { +class AbstractCallback +{ public: /** Constructor @param trx - covering transaction */ @@ -394,32 +401,59 @@ class AbstractCallback : public PageCallback { return(get_zip_size() > 0); } -protected: /** - Get the data page depending on the table type, compressed or not. - @param block - block read from disk - @retval the buffer frame */ - buf_frame_t* get_frame(buf_block_t* block) const UNIV_NOTHROW + Set the name of the physical file and the file handle that is used + to open it for the file that is being iterated over. + @param filename - then physical name of the tablespace file. + @param file - OS file handle */ + void set_file(const char* filename, pfs_os_file_t file) UNIV_NOTHROW { - if (is_compressed_table()) { - return(block->page.zip.data); - } + m_file = file; + m_filepath = filename; + } - return(buf_block_get_frame(block)); + /** The compressed page size + @return the compressed page size */ + ulint get_zip_size() const + { + return(m_zip_size); } - /** Check for session interrupt. If required we could - even flush to disk here every N pages. - @retval DB_SUCCESS or error code */ - dberr_t periodic_check() UNIV_NOTHROW + /** The compressed page size + @return the compressed page size */ + ulint get_page_size() const { - if (trx_is_interrupted(m_trx)) { - return(DB_INTERRUPTED); - } + return(m_page_size); + } - return(DB_SUCCESS); + const char* filename() const { return m_filepath; } + + /** + Called for every page in the tablespace. If the page was not + updated then its state must be set to BUF_PAGE_NOT_USED. For + compressed tables the page descriptor memory will be at offset: + block->frame + UNIV_PAGE_SIZE; + @param block block read from file, note it is not from the buffer pool + @retval DB_SUCCESS or error code. */ + virtual dberr_t operator()(buf_block_t* block) UNIV_NOTHROW = 0; + + /** + @return the space id of the tablespace */ + virtual ulint get_space_id() const UNIV_NOTHROW = 0; + + bool is_interrupted() const { return trx_is_interrupted(m_trx); } + + /** + Get the data page depending on the table type, compressed or not. + @param block - block read from disk + @retval the buffer frame */ + static byte* get_frame(const buf_block_t* block) + { + return block->page.zip.data + ? block->page.zip.data : block->frame; } +protected: /** Get the physical offset of the extent descriptor within the page. @param page_no - page number of the extent descriptor @@ -509,6 +543,18 @@ class AbstractCallback : public PageCallback { } protected: + /** Compressed table page size */ + ulint m_zip_size; + + /** The tablespace page size. */ + ulint m_page_size; + + /** File handle to the tablespace */ + pfs_os_file_t m_file; + + /** Physical file path. */ + const char* m_filepath; + /** Covering transaction. */ trx_t* m_trx; @@ -565,9 +611,9 @@ AbstractCallback::init( /* Since we don't know whether it is a compressed table or not, the data is always read into the block->frame. */ - dberr_t err = set_zip_size(block->frame); + m_zip_size = fsp_header_get_zip_size(page); - if (err != DB_SUCCESS) { + if (!ut_is_2pow(m_zip_size) || m_zip_size > UNIV_ZIP_SIZE_MAX) { return(DB_CORRUPTION); } @@ -604,11 +650,7 @@ AbstractCallback::init( m_free_limit = mach_read_from_4(page + FSP_FREE_LIMIT); m_space = mach_read_from_4(page + FSP_HEADER_OFFSET + FSP_SPACE_ID); - if ((err = set_current_xdes(0, page)) != DB_SUCCESS) { - return(err); - } - - return(DB_SUCCESS); + return set_current_xdes(0, page); } /** @@ -650,12 +692,9 @@ struct FetchIndexRootPages : public AbstractCallback { /** Called for each block as it is read from the file. - @param offset - physical offset in the file - @param block - block to convert, it is not from the buffer pool. + @param block block to convert, it is not from the buffer pool. @retval DB_SUCCESS or error code. */ - virtual dberr_t operator() ( - os_offset_t offset, - buf_block_t* block) UNIV_NOTHROW; + dberr_t operator()(buf_block_t* block) UNIV_NOTHROW; /** Update the import configuration that will be used to import the tablespace. */ @@ -673,34 +712,18 @@ Called for each block as it is read from the file. Check index pages to determine the exact row format. We can't get that from the tablespace header flags alone. -@param offset - physical offset in the file -@param block - block to convert, it is not from the buffer pool. +@param block block to convert, it is not from the buffer pool. @retval DB_SUCCESS or error code. */ -dberr_t -FetchIndexRootPages::operator() ( - os_offset_t offset, - buf_block_t* block) UNIV_NOTHROW +dberr_t FetchIndexRootPages::operator()(buf_block_t* block) UNIV_NOTHROW { - dberr_t err; - - if ((err = periodic_check()) != DB_SUCCESS) { - return(err); - } + if (is_interrupted()) return DB_INTERRUPTED; const page_t* page = get_frame(block); ulint page_type = fil_page_get_type(page); - if (block->page.offset * m_page_size != offset) { - ib_logf(IB_LOG_LEVEL_ERROR, - "Page offset doesn't match file offset: " - "page offset: %u, file offset: " ULINTPF, - block->page.offset, - (ulint) (offset / m_page_size)); - - err = DB_CORRUPTION; - } else if (page_type == FIL_PAGE_TYPE_XDES) { - err = set_current_xdes(block->page.offset, page); + if (page_type == FIL_PAGE_TYPE_XDES) { + return set_current_xdes(block->page.offset, page); } else if (page_type == FIL_PAGE_INDEX && !is_free(block->page.offset) && is_root_page(page)) { @@ -725,7 +748,7 @@ FetchIndexRootPages::operator() ( } } - return(err); + return DB_SUCCESS; } /** @@ -842,21 +865,10 @@ class PageConverter : public AbstractCallback { /** Called for each block as it is read from the file. - @param offset - physical offset in the file - @param block - block to convert, it is not from the buffer pool. + @param block block to convert, it is not from the buffer pool. @retval DB_SUCCESS or error code. */ - virtual dberr_t operator() ( - os_offset_t offset, - buf_block_t* block) UNIV_NOTHROW; + dberr_t operator()(buf_block_t* block) UNIV_NOTHROW; private: - - /** Status returned by PageConverter::validate() */ - enum import_page_status_t { - IMPORT_PAGE_STATUS_OK, /*!< Page is OK */ - IMPORT_PAGE_STATUS_ALL_ZERO, /*!< Page is all zeros */ - IMPORT_PAGE_STATUS_CORRUPTED /*!< Page is corrupted */ - }; - /** Update the page, set the space id, max trx id and index id. @param block - block read from file @@ -866,17 +878,6 @@ class PageConverter : public AbstractCallback { buf_block_t* block, ulint& page_type) UNIV_NOTHROW; -#if defined UNIV_DEBUG - /** - @return true error condition is enabled. */ - bool trigger_corruption() UNIV_NOTHROW - { - return(false); - } - #else -#define trigger_corruption() (false) -#endif /* UNIV_DEBUG */ - /** Update the space, index id, trx id. @param block - block to convert @@ -889,15 +890,6 @@ class PageConverter : public AbstractCallback { @retval DB_SUCCESS or error code */ dberr_t update_records(buf_block_t* block) UNIV_NOTHROW; - /** - Validate the page, check for corruption. - @param offset - physical offset within file. - @param page - page read from file. - @return 0 on success, 1 if all zero, 2 if corrupted */ - import_page_status_t validate( - os_offset_t offset, - buf_block_t* page) UNIV_NOTHROW; - /** Validate the space flags and update tablespace header page. @param block - block read from file, not from the buffer pool. @@ -1596,6 +1588,7 @@ IndexPurge::purge() UNIV_NOTHROW Constructor * @param cfg - config of table being imported. * @param trx - transaction covering the import */ +inline PageConverter::PageConverter( row_import* cfg, trx_t* trx) @@ -1620,6 +1613,7 @@ Adjust the BLOB reference for a single column that is externally stored @param offsets - column offsets for the record @param i - column ordinal value @return DB_SUCCESS or error code */ +inline dberr_t PageConverter::adjust_cluster_index_blob_column( rec_t* rec, @@ -1672,6 +1666,7 @@ stored columns. @param rec - record to update @param offsets - column offsets for the record @return DB_SUCCESS or error code */ +inline dberr_t PageConverter::adjust_cluster_index_blob_columns( rec_t* rec, @@ -1705,6 +1700,7 @@ BLOB reference, write the new space id. @param rec - record to update @param offsets - column offsets for the record @return DB_SUCCESS or error code */ +inline dberr_t PageConverter::adjust_cluster_index_blob_ref( rec_t* rec, @@ -1728,6 +1724,7 @@ Purge delete-marked records, only if it is possible to do so without re-organising the B+tree. @param offsets - current row offsets. @return true if purge succeeded */ +inline bool PageConverter::purge(const ulint* offsets) UNIV_NOTHROW { @@ -1752,6 +1749,7 @@ Adjust the BLOB references and sys fields for the current record. @param offsets - column offsets for the record @param deleted - true if row is delete marked @return DB_SUCCESS or error code. */ +inline dberr_t PageConverter::adjust_cluster_record( const dict_index_t* index, @@ -1769,7 +1767,7 @@ PageConverter::adjust_cluster_record( row_upd_rec_sys_fields( rec, m_page_zip_ptr, m_cluster_index, m_offsets, - m_trx, 0); + m_trx, roll_ptr_t(1) << 55); } return(err); @@ -1780,6 +1778,7 @@ Update the BLOB refrences and write UNDO log entries for rows that can't be purged optimistically. @param block - block to update @retval DB_SUCCESS or error code */ +inline dberr_t PageConverter::update_records( buf_block_t* block) UNIV_NOTHROW @@ -1791,12 +1790,9 @@ PageConverter::update_records( m_rec_iter.open(block); - if (!page_is_leaf(block->frame)) { - return DB_SUCCESS; - } - while (!m_rec_iter.end()) { rec_t* rec = m_rec_iter.current(); + ibool deleted = rec_get_deleted_flag(rec, comp); /* For the clustered index we have to adjust the BLOB @@ -1845,6 +1841,7 @@ PageConverter::update_records( /** Update the space, index id, trx id. @return DB_SUCCESS or error code */ +inline dberr_t PageConverter::update_index_page( buf_block_t* block) UNIV_NOTHROW @@ -1907,13 +1904,14 @@ PageConverter::update_index_page( return(DB_SUCCESS); } - return(update_records(block)); + return page_is_leaf(block->frame) ? update_records(block) : DB_SUCCESS; } /** Validate the space flags and update tablespace header page. @param block - block read from file, not from the buffer pool. @retval DB_SUCCESS or error code */ +inline dberr_t PageConverter::update_header( buf_block_t* block) UNIV_NOTHROW @@ -1953,6 +1951,7 @@ PageConverter::update_header( Update the page, set the space id, max trx id and index id. @param block - block read from file @retval DB_SUCCESS or error code */ +inline dberr_t PageConverter::update_page( buf_block_t* block, @@ -1960,6 +1959,14 @@ PageConverter::update_page( { dberr_t err = DB_SUCCESS; + ut_ad(!block->page.zip.data == !is_compressed_table()); + + if (block->page.zip.data) { + m_page_zip_ptr = &block->page.zip; + } else { + ut_ad(!m_page_zip_ptr); + } + switch (page_type = fil_page_get_type(get_frame(block))) { case FIL_PAGE_TYPE_FSP_HDR: /* Work directly on the uncompressed page headers. */ @@ -2014,141 +2021,45 @@ PageConverter::update_page( return(DB_CORRUPTION); } -/** -Validate the page -@param offset - physical offset within file. -@param page - page read from file. -@return status */ -PageConverter::import_page_status_t -PageConverter::validate( - os_offset_t offset, - buf_block_t* block) UNIV_NOTHROW -{ - buf_frame_t* page = get_frame(block); - - /* Check that the page number corresponds to the offset in - the file. Flag as corrupt if it doesn't. Disable the check - for LSN in buf_page_is_corrupted() */ - - if (buf_page_is_corrupted(false, page, get_zip_size(), NULL) - || (page_get_page_no(page) != offset / m_page_size - && page_get_page_no(page) != 0)) { - - return(IMPORT_PAGE_STATUS_CORRUPTED); - - } else if (offset > 0 && page_get_page_no(page) == 0) { - ulint checksum; - - checksum = mach_read_from_4(page + FIL_PAGE_SPACE_OR_CHKSUM); - if (checksum != 0) { - /* Checksum check passed in buf_page_is_corrupted(). */ - ib_logf(IB_LOG_LEVEL_WARN, - "%s: Page %lu checksum " ULINTPF - " should be zero.", - m_filepath, (ulong) (offset / m_page_size), - checksum); - } - - const byte* b = page + FIL_PAGE_OFFSET; - const byte* e = page + m_page_size - - FIL_PAGE_END_LSN_OLD_CHKSUM; - - /* If the page number is zero and offset > 0 then - the entire page MUST consist of zeroes. If not then - we flag it as corrupt. */ - - while (b != e) { - - if (*b++ && !trigger_corruption()) { - return(IMPORT_PAGE_STATUS_CORRUPTED); - } - } - - /* The page is all zero: do nothing. */ - return(IMPORT_PAGE_STATUS_ALL_ZERO); - } - - return(IMPORT_PAGE_STATUS_OK); -} - /** Called for every page in the tablespace. If the page was not updated then its state must be set to BUF_PAGE_NOT_USED. -@param offset - physical offset within the file -@param block - block read from file, note it is not from the buffer pool +@param block block read from file, note it is not from the buffer pool @retval DB_SUCCESS or error code. */ -dberr_t -PageConverter::operator() ( - os_offset_t offset, - buf_block_t* block) UNIV_NOTHROW +dberr_t PageConverter::operator()(buf_block_t* block) UNIV_NOTHROW { - ulint page_type; - dberr_t err = DB_SUCCESS; - - if ((err = periodic_check()) != DB_SUCCESS) { - return(err); - } - - if (is_compressed_table()) { - m_page_zip_ptr = &block->page.zip; - } else { - ut_ad(m_page_zip_ptr == 0); - } - - switch(validate(offset, block)) { - case IMPORT_PAGE_STATUS_OK: - - /* We have to decompress the compressed pages before - we can work on them */ - - if ((err = update_page(block, page_type)) != DB_SUCCESS) { - break; - } - - /* Note: For compressed pages this function will write to the - zip descriptor and for uncompressed pages it will write to - page (ie. the block->frame). Therefore the caller should write - out the descriptor contents and not block->frame for compressed - pages. */ - - if (!is_compressed_table() || page_type == FIL_PAGE_INDEX) { - - buf_flush_init_for_writing( - !is_compressed_table() - ? block->frame : block->page.zip.data, - !is_compressed_table() ? 0 : m_page_zip_ptr, - m_current_lsn); - } else { - /* Calculate and update the checksum of non-btree - pages for compressed tables explicitly here. */ - - buf_flush_update_zip_checksum( - get_frame(block), get_zip_size(), - m_current_lsn); - } - - break; + /* If we already had an old page with matching number + in the buffer pool, evict it now, because + we no longer evict the pages on DISCARD TABLESPACE. */ + buf_page_get_gen(get_space_id(), get_zip_size(), block->page.offset, + RW_NO_LATCH, NULL, BUF_EVICT_IF_IN_POOL, + __FILE__, __LINE__, NULL); - case IMPORT_PAGE_STATUS_ALL_ZERO: - /* The page is all zero: leave it as is. */ - break; + ulint page_type; - case IMPORT_PAGE_STATUS_CORRUPTED: + dberr_t err = update_page(block, page_type); + if (err != DB_SUCCESS) return err; - ib_logf(IB_LOG_LEVEL_WARN, - "%s: Page %lu at offset " UINT64PF " looks corrupted.", - m_filepath, (ulong) (offset / m_page_size), offset); + /* Note: For compressed pages this function will write to the + zip descriptor and for uncompressed pages it will write to + page (ie. the block->frame). Therefore the caller should write + out the descriptor contents and not block->frame for compressed + pages. */ - err = DB_CORRUPTION; + if (!is_compressed_table() || page_type == FIL_PAGE_INDEX) { + buf_flush_init_for_writing( + get_frame(block), + block->page.zip.data ? &block->page.zip : NULL, + m_current_lsn); + } else { + /* Calculate and update the checksum of non-btree + pages for compressed tables explicitly here. */ + buf_flush_update_zip_checksum( + get_frame(block), get_zip_size(), + m_current_lsn); } - /* If we already had and old page with matching number - in the buffer pool, evict it now, because - we no longer evict the pages on DISCARD TABLESPACE. */ - buf_page_get_gen(get_space_id(), get_zip_size(), block->page.offset, - RW_NO_LATCH, NULL, BUF_EVICT_IF_IN_POOL, - __FILE__, __LINE__, NULL); - return(err); + return DB_SUCCESS; } /*****************************************************************//** @@ -3423,6 +3334,498 @@ row_import_update_discarded_flag( return(err); } +struct fil_iterator_t { + pfs_os_file_t file; /*!< File handle */ + const char* filepath; /*!< File path name */ + os_offset_t start; /*!< From where to start */ + os_offset_t end; /*!< Where to stop */ + os_offset_t file_size; /*!< File size in bytes */ + ulint page_size; /*!< Page size */ + ulint n_io_buffers; /*!< Number of pages to use + for IO */ + byte* io_buffer; /*!< Buffer to use for IO */ + fil_space_crypt_t *crypt_data; /*!< Crypt data (if encrypted) */ + byte* crypt_io_buffer; /*!< IO buffer when encrypted */ +}; + +/********************************************************************//** +TODO: This can be made parallel trivially by chunking up the file and creating +a callback per thread. . Main benefit will be to use multiple CPUs for +checksums and compressed tables. We have to do compressed tables block by +block right now. Secondly we need to decompress/compress and copy too much +of data. These are CPU intensive. + +Iterate over all the pages in the tablespace. +@param iter - Tablespace iterator +@param block - block to use for IO +@param callback - Callback to inspect and update page contents +@retval DB_SUCCESS or error code */ +static +dberr_t +fil_iterate( +/*========*/ + const fil_iterator_t& iter, + buf_block_t* block, + AbstractCallback& callback) +{ + os_offset_t offset; + ulint n_bytes = iter.n_io_buffers * iter.page_size; + + const ulint buf_size = srv_page_size +#ifdef HAVE_LZO + + LZO1X_1_15_MEM_COMPRESS +#elif defined HAVE_SNAPPY + + snappy_max_compressed_length(srv_page_size) +#endif + ; + byte* page_compress_buf = static_cast( + ut_malloc_low(buf_size, false)); + ut_ad(!srv_read_only_mode); + + if (!page_compress_buf) { + return DB_OUT_OF_MEMORY; + } + + /* TODO: For ROW_FORMAT=COMPRESSED tables we do a lot of useless + copying for non-index pages. Unfortunately, it is + required by buf_zip_decompress() */ + dberr_t err = DB_SUCCESS; + + for (offset = iter.start; offset < iter.end; offset += n_bytes) { + if (callback.is_interrupted()) { + err = DB_INTERRUPTED; + goto func_exit; + } + + byte* io_buffer = iter.io_buffer; + block->frame = io_buffer; + + if (block->page.zip.data) { + /* Zip IO is done in the compressed page buffer. */ + io_buffer = block->page.zip.data; + ut_ad(PAGE_ZIP_MATCH(block->frame, &block->page.zip)); + } + + /* We have to read the exact number of bytes. Otherwise the + InnoDB IO functions croak on failed reads. */ + + n_bytes = ulint(ut_min(os_offset_t(n_bytes), + iter.end - offset)); + + ut_ad(n_bytes > 0); + ut_ad(!(n_bytes % iter.page_size)); + + const bool encrypted = iter.crypt_data != NULL + && iter.crypt_data->should_encrypt(); + /* Use additional crypt io buffer if tablespace is encrypted */ + byte* const readptr = encrypted + ? iter.crypt_io_buffer : io_buffer; + byte* const writeptr = readptr; + + if (!os_file_read_no_error_handling(iter.file, readptr, + offset, n_bytes)) { + ib_logf(IB_LOG_LEVEL_ERROR, "os_file_read() failed"); + err = DB_IO_ERROR; + goto func_exit; + } + + bool updated = false; + const ulint size = iter.page_size; + ulint n_pages_read = ulint(n_bytes) / size; + block->page.offset = offset / size; + + for (ulint i = 0; i < n_pages_read; + ++i, block->frame += size, block->page.offset++) { + byte* src = readptr + (i * size); + const ulint page_no = page_get_page_no(src); + if (!page_no && block->page.offset) { + const ulint* b = reinterpret_cast + (src); + const ulint* const e = b + size / sizeof *b; + do { + if (*b++) { + goto page_corrupted; + } + } while (b != e); + + /* Proceed to the next page, + because this one is all zero. */ + continue; + } + + if (page_no != block->page.offset) { +page_corrupted: + ib_logf(IB_LOG_LEVEL_WARN, + "%s: Page %lu at offset " + UINT64PF " looks corrupted.", + callback.filename(), + ulong(offset / size), offset); + err = DB_CORRUPTION; + goto func_exit; + } + + bool decrypted = false; + byte* dst = io_buffer + (i * size); + bool frame_changed = false; + ulint page_type = mach_read_from_2(src+FIL_PAGE_TYPE); + const bool page_compressed + = page_type + == FIL_PAGE_PAGE_COMPRESSED_ENCRYPTED + || page_type == FIL_PAGE_PAGE_COMPRESSED; + + if (page_compressed && block->page.zip.data) { + goto page_corrupted; + } + + if (!encrypted) { + } else if (!mach_read_from_4( + FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION + + src)) { +not_encrypted: + if (!page_compressed + && !block->page.zip.data) { + block->frame = src; + frame_changed = true; + } else { + ut_ad(dst != src); + memcpy(dst, src, size); + } + } else { + if (!fil_space_verify_crypt_checksum( + src, callback.get_zip_size(), + NULL, block->page.offset)) { + goto page_corrupted; + } + + decrypted = fil_space_decrypt( + iter.crypt_data, dst, + iter.page_size, src, &err); + + if (err != DB_SUCCESS) { + goto func_exit; + } + + if (!decrypted) { + goto not_encrypted; + } + + updated = true; + } + + /* If the original page is page_compressed, we need + to decompress it before adjusting further. */ + if (page_compressed) { + ulint compress_length = fil_page_decompress( + page_compress_buf, dst); + ut_ad(compress_length != srv_page_size); + if (compress_length == 0) { + goto page_corrupted; + } + updated = true; + } else if (buf_page_is_corrupted( + false, + encrypted && !frame_changed + ? dst : src, + callback.get_zip_size(), NULL)) { + goto page_corrupted; + } + + if ((err = callback(block)) != DB_SUCCESS) { + goto func_exit; + } else if (!updated) { + updated = buf_block_get_state(block) + == BUF_BLOCK_FILE_PAGE; + } + + /* If tablespace is encrypted we use additional + temporary scratch area where pages are read + for decrypting readptr == crypt_io_buffer != io_buffer. + + Destination for decryption is a buffer pool block + block->frame == dst == io_buffer that is updated. + Pages that did not require decryption even when + tablespace is marked as encrypted are not copied + instead block->frame is set to src == readptr. + + For encryption we again use temporary scratch area + writeptr != io_buffer == dst + that is then written to the tablespace + + (1) For normal tables io_buffer == dst == writeptr + (2) For only page compressed tables + io_buffer == dst == writeptr + (3) For encrypted (and page compressed) + readptr != io_buffer == dst != writeptr + */ + + ut_ad(!encrypted && !page_compressed ? + src == dst && dst == writeptr + (i * size):1); + ut_ad(page_compressed && !encrypted ? + src == dst && dst == writeptr + (i * size):1); + ut_ad(encrypted ? + src != dst && dst != writeptr + (i * size):1); + + /* When tablespace is encrypted or compressed its + first page (i.e. page 0) is not encrypted or + compressed and there is no need to copy frame. */ + if (encrypted && block->page.offset != 0) { + byte *local_frame = callback.get_frame(block); + ut_ad((writeptr + (i * size)) != local_frame); + memcpy((writeptr + (i * size)), local_frame, size); + } + + if (frame_changed) { + block->frame = dst; + } + + src = io_buffer + (i * size); + + if (page_compressed) { + updated = true; + if (fil_page_compress( + src, + page_compress_buf, + 0,/* FIXME: compression level */ + 512,/* FIXME: proper block size */ + encrypted)) { + /* FIXME: remove memcpy() */ + memcpy(src, page_compress_buf, + srv_page_size); + } + } + + /* If tablespace is encrypted, encrypt page before we + write it back. Note that we should not encrypt the + buffer that is in buffer pool. */ + /* NOTE: At this stage of IMPORT the + buffer pool is not being used at all! */ + if (decrypted && encrypted) { + byte *dest = writeptr + (i * size); + + byte* tmp = fil_encrypt_buf( + iter.crypt_data, + callback.get_space_id(), + block->page.offset, + mach_read_from_8(src + FIL_PAGE_LSN), + src, + callback.get_zip_size(), + dest); + + if (tmp == src) { + /* TODO: remove unnecessary memcpy's */ + ut_ad(dest != src); + memcpy(dest, src, size); + } + + updated = true; + } + } + + /* A page was updated in the set, write back to disk. */ + if (updated + && !os_file_write( + iter.filepath, iter.file, writeptr, + offset, (ulint) n_bytes)) { + + ib_logf(IB_LOG_LEVEL_ERROR, "os_file_write() failed"); + err = DB_IO_ERROR; + goto func_exit; + } + } + +func_exit: + ut_free(page_compress_buf); + return err; +} + +/********************************************************************//** +Iterate over all the pages in the tablespace. +@param table - the table definiton in the server +@param n_io_buffers - number of blocks to read and write together +@param callback - functor that will do the page updates +@return DB_SUCCESS or error code */ +static +dberr_t +fil_tablespace_iterate( +/*===================*/ + dict_table_t* table, + ulint n_io_buffers, + AbstractCallback& callback) +{ + dberr_t err; + pfs_os_file_t file; + char* filepath; + + ut_a(n_io_buffers > 0); + ut_ad(!srv_read_only_mode); + + DBUG_EXECUTE_IF("ib_import_trigger_corruption_1", + return(DB_CORRUPTION);); + + if (DICT_TF_HAS_DATA_DIR(table->flags)) { + dict_get_and_save_data_dir_path(table, false); + ut_a(table->data_dir_path); + + filepath = os_file_make_remote_pathname( + table->data_dir_path, table->name, "ibd"); + } else { + filepath = fil_make_ibd_name(table->name, false); + } + + { + ibool success; + + file = os_file_create_simple_no_error_handling( + innodb_file_data_key, filepath, + OS_FILE_OPEN, OS_FILE_READ_WRITE, &success, FALSE); + + DBUG_EXECUTE_IF("fil_tablespace_iterate_failure", + { + static bool once; + + if (!once || ut_rnd_interval(0, 10) == 5) { + once = true; + success = FALSE; + os_file_close(file); + } + }); + + if (!success) { + /* The following call prints an error message */ + os_file_get_last_error(true); + + ib_logf(IB_LOG_LEVEL_ERROR, + "Trying to import a tablespace, but could not " + "open the tablespace file %s", filepath); + + mem_free(filepath); + + return(DB_TABLESPACE_NOT_FOUND); + + } else { + err = DB_SUCCESS; + } + } + + callback.set_file(filepath, file); + + os_offset_t file_size = os_file_get_size(file); + ut_a(file_size != (os_offset_t) -1); + + /* Allocate a page to read in the tablespace header, so that we + can determine the page size and zip_size (if it is compressed). + We allocate an extra page in case it is a compressed table. One + page is to ensure alignement. */ + + void* page_ptr = mem_alloc(3 * UNIV_PAGE_SIZE); + byte* page = static_cast(ut_align(page_ptr, UNIV_PAGE_SIZE)); + + /* The block we will use for every physical page */ + buf_block_t block; + + memset(&block, 0, sizeof block); + block.frame = page; + block.page.space = callback.get_space_id(); + block.page.io_fix = BUF_IO_NONE; + block.page.buf_fix_count = 1; + block.page.state = BUF_BLOCK_FILE_PAGE; + + /* Read the first page and determine the page and zip size. */ + + if (!os_file_read_no_error_handling(file, page, 0, UNIV_PAGE_SIZE)) { + + err = DB_IO_ERROR; + + } else if ((err = callback.init(file_size, &block)) == DB_SUCCESS) { + if (const ulint zip_size = callback.get_zip_size()) { + page_zip_set_size(&block.page.zip, zip_size); + /* ROW_FORMAT=COMPRESSED is not optimised for block IO + for now. We do the IMPORT page by page. */ + n_io_buffers = 1; + } + + fil_iterator_t iter; + + iter.file = file; + iter.start = 0; + iter.end = file_size; + iter.filepath = filepath; + iter.file_size = file_size; + iter.n_io_buffers = n_io_buffers; + iter.page_size = callback.get_page_size(); + + /* In MariaDB/MySQL 5.6 tablespace does not exist + during import, therefore we can't use space directly + here. */ + ulint crypt_data_offset = fsp_header_get_crypt_offset( + callback.get_zip_size()); + + /* read (optional) crypt data */ + iter.crypt_data = fil_space_read_crypt_data( + 0, page, crypt_data_offset); + + /** If tablespace is encrypted, it needs extra buffers */ + if (iter.crypt_data != NULL) { + /* decrease io buffers so that memory + * consumption doesnt double + * note: the +1 is to avoid n_io_buffers getting down to 0 */ + iter.n_io_buffers = (iter.n_io_buffers + 1) / 2; + } + + /** Add an extra page for compressed page scratch area. */ + + void* io_buffer = mem_alloc( + (2 + iter.n_io_buffers) * UNIV_PAGE_SIZE); + + iter.io_buffer = static_cast( + ut_align(io_buffer, UNIV_PAGE_SIZE)); + + void* crypt_io_buffer = NULL; + if (iter.crypt_data != NULL) { + crypt_io_buffer = mem_alloc( + (2 + iter.n_io_buffers) * UNIV_PAGE_SIZE); + iter.crypt_io_buffer = static_cast( + ut_align(crypt_io_buffer, UNIV_PAGE_SIZE)); + } + + if (block.page.zip.ssize) { + ut_ad(iter.n_io_buffers == 1); + block.frame = iter.io_buffer; + block.page.zip.data = block.frame + UNIV_PAGE_SIZE; + ut_d(block.page.zip.m_external = true); + } + + err = fil_iterate(iter, &block, callback); + + mem_free(io_buffer); + + if (crypt_io_buffer != NULL) { + mem_free(crypt_io_buffer); + iter.crypt_io_buffer = NULL; + fil_space_destroy_crypt_data(&iter.crypt_data); + } + } + + if (err == DB_SUCCESS) { + + ib_logf(IB_LOG_LEVEL_INFO, "Sync to disk"); + + if (!os_file_flush(file)) { + ib_logf(IB_LOG_LEVEL_INFO, "os_file_flush() failed!"); + err = DB_IO_ERROR; + } else { + ib_logf(IB_LOG_LEVEL_INFO, "Sync to disk - done!"); + } + } + + os_file_close(file); + + mem_free(page_ptr); + mem_free(filepath); + + return(err); +} + /*****************************************************************//** Imports a tablespace. The space id in the .ibd file must match the space id of the table in the data dictionary. @@ -3597,6 +4000,17 @@ row_import_for_mysql( return(row_import_cleanup(prebuilt, trx, err)); } + /* On DISCARD TABLESPACE, we did not drop any adaptive hash + index entries. If we replaced the discarded tablespace with a + smaller one here, there could still be some adaptive hash + index entries that point to cached garbage pages in the buffer + pool, because PageConverter::operator() only evicted those + pages that were replaced by the imported pages. We must + discard all remaining adaptive hash index entries, because the + adaptive hash index must be a subset of the table contents; + false positives are not tolerated. */ + buf_LRU_drop_page_hash_for_tablespace(table); + row_mysql_lock_data_dictionary(trx); /* If the table is stored in a remote tablespace, we need to diff --git a/storage/innobase/row/row0log.cc b/storage/innobase/row/row0log.cc index fd5a13bba..c170e7e8c 100644 --- a/storage/innobase/row/row0log.cc +++ b/storage/innobase/row/row0log.cc @@ -1,6 +1,6 @@ /***************************************************************************** -Copyright (c) 2011, 2016, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 2011, 2018, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2017, 2018, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under @@ -466,6 +466,8 @@ row_log_table_open( *avail = srv_sort_buf_size - log->tail.bytes; if (size > *avail) { + /* Make sure log->tail.buf is large enough */ + ut_ad(size <= sizeof log->tail.buf); return(log->tail.buf); } else { return(log->tail.block + log->tail.bytes); @@ -584,12 +586,10 @@ row_log_table_delete( { ulint old_pk_extra_size; ulint old_pk_size; - ulint ext_size = 0; ulint mrec_size; ulint avail_size; mem_heap_t* heap = NULL; const dtuple_t* old_pk; - row_ext_t* ext; ut_ad(dict_index_is_clust(index)); ut_ad(rec_offs_validate(rec, index, offsets)); @@ -670,72 +670,20 @@ row_log_table_delete( &old_pk_extra_size); ut_ad(old_pk_extra_size < 0x100); - mrec_size = 6 + old_pk_size; - - /* Log enough prefix of the BLOB unless both the - old and new table are in COMPACT or REDUNDANT format, - which store the prefix in the clustered index record. */ - if (rec_offs_any_extern(offsets) - && (dict_table_get_format(index->table) >= UNIV_FORMAT_B - || dict_table_get_format(new_table) >= UNIV_FORMAT_B)) { - - /* Build a cache of those off-page column prefixes - that are referenced by secondary indexes. It can be - that none of the off-page columns are needed. */ - row_build(ROW_COPY_DATA, index, rec, - offsets, NULL, NULL, NULL, &ext, heap); - if (ext) { - /* Log the row_ext_t, ext->ext and ext->buf */ - ext_size = ext->n_ext * ext->max_len - + sizeof(*ext) - + ext->n_ext * sizeof(ulint) - + (ext->n_ext - 1) * sizeof ext->len; - mrec_size += ext_size; - } - } + /* 2 = 1 (extra_size) + at least 1 byte payload */ + mrec_size = 2 + old_pk_size; if (byte* b = row_log_table_open(index->online_log, mrec_size, &avail_size)) { *b++ = ROW_T_DELETE; *b++ = static_cast(old_pk_extra_size); - /* Log the size of external prefix we saved */ - mach_write_to_4(b, ext_size); - b += 4; - rec_convert_dtuple_to_temp( b + old_pk_extra_size, new_index, old_pk->fields, old_pk->n_fields); b += old_pk_size; - if (ext_size) { - ulint cur_ext_size = sizeof(*ext) - + (ext->n_ext - 1) * sizeof ext->len; - - memcpy(b, ext, cur_ext_size); - b += cur_ext_size; - - /* Check if we need to col_map to adjust the column - number. If columns were added/removed/reordered, - adjust the column number. */ - if (const ulint* col_map = - index->online_log->col_map) { - for (ulint i = 0; i < ext->n_ext; i++) { - const_cast(ext->ext[i]) = - col_map[ext->ext[i]]; - } - } - - memcpy(b, ext->ext, ext->n_ext * sizeof(*ext->ext)); - b += ext->n_ext * sizeof(*ext->ext); - - ext_size -= cur_ext_size - + ext->n_ext * sizeof(*ext->ext); - memcpy(b, ext->buf, ext_size); - b += ext_size; - } - row_log_table_close(index, b, mrec_size, avail_size); } @@ -1654,15 +1602,13 @@ row_log_table_apply_insert( /******************************************************//** Deletes a record from a table that is being rebuilt. @return DB_SUCCESS or error code */ -static MY_ATTRIBUTE((nonnull(1, 2, 4, 5), warn_unused_result)) +static MY_ATTRIBUTE((nonnull, warn_unused_result)) dberr_t row_log_table_apply_delete_low( /*===========================*/ btr_pcur_t* pcur, /*!< in/out: B-tree cursor, will be trashed */ const ulint* offsets, /*!< in: offsets on pcur */ - const row_ext_t* save_ext, /*!< in: saved external field - info, or NULL */ mem_heap_t* heap, /*!< in/out: memory heap */ mtr_t* mtr) /*!< in/out: mini-transaction, will be committed */ @@ -1686,11 +1632,7 @@ row_log_table_apply_delete_low( /* Build a row template for purging secondary index entries. */ row = row_build( ROW_COPY_DATA, index, btr_pcur_get_rec(pcur), - offsets, NULL, NULL, NULL, - save_ext ? NULL : &ext, heap); - if (!save_ext) { - save_ext = ext; - } + offsets, NULL, NULL, NULL, &ext, heap); } else { row = NULL; } @@ -1709,7 +1651,7 @@ row_log_table_apply_delete_low( } const dtuple_t* entry = row_build_index_entry( - row, save_ext, index, heap); + row, ext, index, heap); mtr_start(mtr); btr_pcur_open(index, entry, PAGE_CUR_LE, BTR_MODIFY_TREE, pcur, mtr); @@ -1752,11 +1694,10 @@ row_log_table_apply_delete_low( /******************************************************//** Replays a delete operation on a table that was rebuilt. @return DB_SUCCESS or error code */ -static MY_ATTRIBUTE((nonnull(1, 3, 4, 5, 6, 7), warn_unused_result)) +static MY_ATTRIBUTE((nonnull, warn_unused_result)) dberr_t row_log_table_apply_delete( /*=======================*/ - que_thr_t* thr, /*!< in: query graph */ ulint trx_id_col, /*!< in: position of DB_TRX_ID in the new clustered index */ @@ -1765,9 +1706,7 @@ row_log_table_apply_delete( mem_heap_t* offsets_heap, /*!< in/out: memory heap that can be emptied */ mem_heap_t* heap, /*!< in/out: memory heap */ - const row_log_t* log, /*!< in: online log */ - const row_ext_t* save_ext) /*!< in: saved external field - info, or NULL */ + const row_log_t* log) /*!< in: online log */ { dict_table_t* new_table = log->table; dict_index_t* index = dict_table_get_first_index(new_table); @@ -1867,8 +1806,7 @@ row_log_table_apply_delete( } } - return(row_log_table_apply_delete_low(&pcur, offsets, save_ext, - heap, &mtr)); + return row_log_table_apply_delete_low(&pcur, offsets, heap, &mtr); } /******************************************************//** @@ -2079,7 +2017,7 @@ row_log_table_apply_update( /* Some BLOBs are missing, so we are interpreting this ROW_T_UPDATE as ROW_T_DELETE (see *1). */ error = row_log_table_apply_delete_low( - &pcur, cur_offsets, NULL, heap, &mtr); + &pcur, cur_offsets, heap, &mtr); goto func_exit_committed; } @@ -2117,7 +2055,7 @@ row_log_table_apply_update( } error = row_log_table_apply_delete_low( - &pcur, cur_offsets, NULL, heap, &mtr); + &pcur, cur_offsets, heap, &mtr); ut_ad(mtr.state == MTR_COMMITTED); if (error == DB_SUCCESS) { @@ -2263,8 +2201,6 @@ row_log_table_apply_op( ulint extra_size; const mrec_t* next_mrec; dtuple_t* old_pk; - row_ext_t* ext; - ulint ext_size; ut_ad(dict_index_is_clust(dup->index)); ut_ad(dup->index->table != log->table); @@ -2272,7 +2208,7 @@ row_log_table_apply_op( *error = DB_SUCCESS; - /* 3 = 1 (op type) + 1 (ext_size) + at least 1 byte payload */ + /* 3 = 1 (op type) + 1 (extra_size) + at least 1 byte payload */ if (mrec + 3 >= mrec_end) { return(NULL); } @@ -2322,14 +2258,12 @@ row_log_table_apply_op( break; case ROW_T_DELETE: - /* 1 (extra_size) + 4 (ext_size) + at least 1 (payload) */ - if (mrec + 6 >= mrec_end) { + /* 1 (extra_size) + at least 1 (payload) */ + if (mrec + 2 >= mrec_end) { return(NULL); } extra_size = *mrec++; - ext_size = mach_read_from_4(mrec); - mrec += 4; ut_ad(mrec < mrec_end); /* We assume extra_size < 0x100 for the PRIMARY KEY prefix. @@ -2338,40 +2272,16 @@ row_log_table_apply_op( rec_offs_set_n_fields(offsets, new_index->n_uniq + 2); rec_init_offsets_temp(mrec, new_index, offsets); - next_mrec = mrec + rec_offs_data_size(offsets) + ext_size; + next_mrec = mrec + rec_offs_data_size(offsets); if (next_mrec > mrec_end) { return(NULL); } log->head.total += next_mrec - mrec_start; - /* If there are external fields, retrieve those logged - prefix info and reconstruct the row_ext_t */ - if (ext_size) { - /* We use memcpy to avoid unaligned - access on some non-x86 platforms.*/ - ext = static_cast( - mem_heap_dup(heap, - mrec + rec_offs_data_size(offsets), - ext_size)); - - byte* ext_start = reinterpret_cast(ext); - - ulint ext_len = sizeof(*ext) - + (ext->n_ext - 1) * sizeof ext->len; - - ext->ext = reinterpret_cast(ext_start + ext_len); - ext_len += ext->n_ext * sizeof(*ext->ext); - - ext->buf = static_cast(ext_start + ext_len); - } else { - ext = NULL; - } - *error = row_log_table_apply_delete( - thr, new_trx_id_col, - mrec, offsets, offsets_heap, heap, - log, ext); + new_trx_id_col, + mrec, offsets, offsets_heap, heap, log); break; case ROW_T_UPDATE: @@ -2796,7 +2706,15 @@ row_log_table_apply_ops( while (!trx_is_interrupted(trx)) { mrec = next_mrec; - ut_ad(mrec < mrec_end); + ut_ad(mrec <= mrec_end); + + if (mrec == mrec_end) { + /* We are at the end of the log. + Mark the replay all_done. */ + if (has_index_lock) { + goto all_done; + } + } if (!has_index_lock) { /* We are applying operations from a different diff --git a/storage/innobase/row/row0merge.cc b/storage/innobase/row/row0merge.cc index 80ab10cdb..0206d4153 100644 --- a/storage/innobase/row/row0merge.cc +++ b/storage/innobase/row/row0merge.cc @@ -3108,7 +3108,8 @@ row_merge_drop_indexes( A concurrent purge will be prevented by dict_operation_lock. */ - if (!locked && table->n_ref_count > 1) { + if (!locked && (table->n_ref_count > 1 + || UT_LIST_GET_FIRST(table->locks))) { /* We will have to drop the indexes later, when the table is guaranteed to be no longer in use. Mark the indexes as incomplete and corrupted, so that other diff --git a/storage/innobase/row/row0mysql.cc b/storage/innobase/row/row0mysql.cc index 36ca5c776..be24ae885 100644 --- a/storage/innobase/row/row0mysql.cc +++ b/storage/innobase/row/row0mysql.cc @@ -1,6 +1,6 @@ /***************************************************************************** -Copyright (c) 2000, 2017, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 2000, 2018, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2015, 2018, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under @@ -1499,8 +1499,7 @@ row_insert_for_mysql( doc_ids difference should not exceed FTS_DOC_ID_MAX_STEP value. */ - if (next_doc_id > 1 - && doc_id - next_doc_id >= FTS_DOC_ID_MAX_STEP) { + if (doc_id - next_doc_id >= FTS_DOC_ID_MAX_STEP) { fprintf(stderr, "InnoDB: Doc ID " UINT64PF " is too" " big. Its difference with largest" @@ -3517,6 +3516,8 @@ row_truncate_table_for_mysql( fil_space_release(space); } + buf_LRU_drop_page_hash_for_tablespace(table); + if (flags != ULINT_UNDEFINED && fil_discard_tablespace(space_id) == DB_SUCCESS) { @@ -4210,6 +4211,21 @@ row_drop_table_for_mysql( rw_lock_x_unlock(dict_index_get_lock(index)); } + if (table->space != TRX_SYS_SPACE) { + /* On DISCARD TABLESPACE, we would not drop the + adaptive hash index entries. If the tablespace is + missing here, delete-marking the record in SYS_INDEXES + would not free any pages in the buffer pool. Thus, + dict_index_remove_from_cache() would hang due to + adaptive hash index entries existing in the buffer + pool. To prevent this hang, and also to guarantee + that btr_search_drop_page_hash_when_freed() will avoid + calling btr_search_drop_page_hash_index() while we + hold the InnoDB dictionary lock, we will drop any + adaptive hash index entries upfront. */ + buf_LRU_drop_page_hash_for_tablespace(table); + } + /* We use the private SQL parser of Innobase to generate the query graphs needed in deleting the dictionary data from system tables in Innobase. Deleting a row from SYS_INDEXES table also @@ -5239,7 +5255,8 @@ row_rename_table_for_mysql( } } - if (dict_table_has_fts_index(table) + if ((dict_table_has_fts_index(table) + || DICT_TF2_FLAG_IS_SET(table, DICT_TF2_FTS_HAS_DOC_ID)) && !dict_tables_have_same_db(old_name, new_name)) { err = fts_rename_aux_tables(table, new_name, trx); if (err != DB_TABLE_NOT_FOUND) { @@ -5341,6 +5358,7 @@ row_rename_table_for_mysql( trx_rollback_to_savepoint(trx, NULL); trx->error_state = DB_SUCCESS; } + table->data_dir_path= NULL; } funct_exit: diff --git a/storage/innobase/row/row0sel.cc b/storage/innobase/row/row0sel.cc index 6cca3e21c..06bf4cc30 100644 --- a/storage/innobase/row/row0sel.cc +++ b/storage/innobase/row/row0sel.cc @@ -2707,7 +2707,9 @@ row_sel_field_store_in_mysql_format_func( || !(templ->mysql_col_len % templ->mbmaxlen)); ut_ad(len * templ->mbmaxlen >= templ->mysql_col_len || (field_no == templ->icp_rec_field_no - && field->prefix_len > 0)); + && field->prefix_len > 0) + || templ->rec_field_is_prefix); + ut_ad(!(field->prefix_len % templ->mbmaxlen)); if (templ->mbminlen == 1 && templ->mbmaxlen != 1) { @@ -3667,6 +3669,118 @@ row_search_idx_cond_check( return(result); } +/** Return the record field length in characters. +@param[in] col table column of the field +@param[in] field_no field number +@param[in] rec physical record +@param[in] offsets field offsets in the physical record +@return field length in characters. */ +static +size_t +rec_field_len_in_chars( + const dict_col_t* col, + const ulint field_no, + const rec_t* rec, + const ulint* offsets) +{ + const ulint cset = dtype_get_charset_coll(col->prtype); + const CHARSET_INFO* cs = all_charsets[cset]; + ulint rec_field_len; + const char* rec_field = reinterpret_cast( + rec_get_nth_field( + rec, offsets, field_no, &rec_field_len)); + + if (UNIV_UNLIKELY(!cs)) { + ib_logf(IB_LOG_LEVEL_WARN, "Missing collation " ULINTPF, cset); + return SIZE_T_MAX; + } + + return(cs->cset->numchars(cs, rec_field, rec_field + rec_field_len)); +} + +/** Avoid the clustered index lookup if all the following conditions +are true: +1) all columns are in secondary index +2) all values for columns that are prefix-only indexes are shorter +than the prefix size. This optimization can avoid many IOs for certain schemas. +@return true, to avoid clustered index lookup. */ +static +bool row_search_with_covering_prefix( + row_prebuilt_t* prebuilt, + const rec_t* rec, + const ulint* offsets) +{ + const dict_index_t* index = prebuilt->index; + ut_ad(!dict_index_is_clust(index)); + + if (!srv_prefix_index_cluster_optimization) { + return false; + } + + /** Optimization only applicable if there the number of secondary index + fields are greater than or equal to number of clustered index fields. */ + if (prebuilt->n_template > index->n_fields) { + return false; + } + + for (ulint i = 0; i < prebuilt->n_template; i++) { + mysql_row_templ_t* templ = prebuilt->mysql_template + i; + ulint j = templ->rec_prefix_field_no; + + /** Condition (1) : is the field in the index. */ + if (j == ULINT_UNDEFINED) { + return false; + } + + /** Condition (2): If this is a prefix index then + row's value size shorter than prefix length. */ + + if (!templ->rec_field_is_prefix) { + continue; + } + + ulint rec_size = rec_offs_nth_size(offsets, j); + const dict_field_t* field = dict_index_get_nth_field(index, j); + ulint max_chars = field->prefix_len / templ->mbmaxlen; + + ut_a(field->prefix_len > 0); + + if (rec_size < max_chars) { + /* Record in bytes shorter than the index + prefix length in char. */ + continue; + } + + if (rec_size * templ->mbminlen >= field->prefix_len) { + /* Shortest representation string by the + byte length of the record is longer than the + maximum possible index prefix. */ + return false; + } + + size_t num_chars = rec_field_len_in_chars( + field->col, j, rec, offsets); + + if (num_chars >= max_chars) { + /* No of chars to store the record exceeds + the index prefix character length. */ + return false; + } + } + + /* If prefix index optimization condition satisfied then + for all columns above, use rec_prefix_field_no instead of + rec_field_no, and skip the clustered lookup below. */ + for (ulint i = 0; i < prebuilt->n_template; i++) { + mysql_row_templ_t* templ = prebuilt->mysql_template + i; + templ->rec_field_no = templ->rec_prefix_field_no; + ut_a(templ->rec_field_no != ULINT_UNDEFINED); + } + + srv_stats.n_sec_rec_cluster_reads_avoided.inc(); + return true; +} + /********************************************************************//** Searches for rows in the database. This is used in the interface to MySQL. This function opens a cursor, and also implements fetch next @@ -3729,7 +3843,6 @@ row_search_for_mysql( ulint* offsets = offsets_; ibool table_lock_waited = FALSE; byte* next_buf = 0; - ibool use_clustered_index = FALSE; rec_offs_init(offsets_); @@ -4543,9 +4656,27 @@ row_search_for_mysql( ulint lock_type; + if (srv_locks_unsafe_for_binlog + || trx->isolation_level <= TRX_ISO_READ_COMMITTED) { + /* At READ COMMITTED or READ UNCOMMITTED + isolation levels, do not lock committed + delete-marked records. */ + if (!rec_get_deleted_flag(rec, comp)) { + goto no_gap_lock; + } + if (trx_id_t trx_id = index == clust_index + ? row_get_rec_trx_id(rec, index, offsets) + : row_vers_impl_x_locked(rec, index, offsets)) { + if (trx_rw_is_active(trx_id, NULL)) { + /* The record belongs to an active + transaction. We must acquire a lock. */ + goto no_gap_lock; + } + } + goto locks_ok_del_marked; + } + if (!set_also_gap_locks - || srv_locks_unsafe_for_binlog - || trx->isolation_level <= TRX_ISO_READ_COMMITTED || (unique_search && !rec_get_deleted_flag(rec, comp))) { goto no_gap_lock; @@ -4615,7 +4746,11 @@ row_search_for_mysql( a deadlock and the transaction had to wait then release the lock it is waiting on. */ + lock_mutex_enter(); + trx_mutex_enter(trx); err = lock_trx_handle_wait(trx); + lock_mutex_exit(); + trx_mutex_exit(trx); switch (err) { case DB_SUCCESS: @@ -4732,20 +4867,9 @@ row_search_for_mysql( page_rec_is_comp() cannot be used! */ if (rec_get_deleted_flag(rec, comp)) { - +locks_ok_del_marked: /* The record is delete-marked: we can skip it */ - if ((srv_locks_unsafe_for_binlog - || trx->isolation_level <= TRX_ISO_READ_COMMITTED) - && prebuilt->select_lock_type != LOCK_NONE - && !did_semi_consistent_read) { - - /* No need to keep a lock on a delete-marked record - if we do not want to use next-key locking. */ - - row_unlock_for_mysql(prebuilt, TRUE); - } - /* This is an optimization to skip setting the next key lock on the record that follows this delete-marked record. This optimization works because of the unique search criteria @@ -4786,69 +4910,10 @@ row_search_for_mysql( break; } - /* Get the clustered index record if needed, if we did not do the - search using the clustered index... */ - - use_clustered_index = - (index != clust_index && prebuilt->need_to_access_clustered); - - if (use_clustered_index && srv_prefix_index_cluster_optimization - && prebuilt->n_template <= index->n_fields) { - /* ...but, perhaps avoid the clustered index lookup if - all of the following are true: - 1) all columns are in the secondary index - 2) all values for columns that are prefix-only - indexes are shorter than the prefix size - This optimization can avoid many IOs for certain schemas. - */ - ibool row_contains_all_values = TRUE; - int i; - for (i = 0; i < prebuilt->n_template; i++) { - /* Condition (1) from above: is the field in the - index (prefix or not)? */ - mysql_row_templ_t* templ = - prebuilt->mysql_template + i; - ulint secondary_index_field_no = - templ->rec_prefix_field_no; - if (secondary_index_field_no == ULINT_UNDEFINED) { - row_contains_all_values = FALSE; - break; - } - /* Condition (2) from above: if this is a - prefix, is this row's value size shorter - than the prefix? */ - if (templ->rec_field_is_prefix) { - ulint record_size = rec_offs_nth_size( - offsets, - secondary_index_field_no); - const dict_field_t *field = - dict_index_get_nth_field( - index, - secondary_index_field_no); - ut_a(field->prefix_len > 0); - if (record_size >= field->prefix_len) { - row_contains_all_values = FALSE; - break; - } - } + if (index != clust_index && prebuilt->need_to_access_clustered) { + if (row_search_with_covering_prefix(prebuilt, rec, offsets)) { + goto use_covering_index; } - /* If (1) and (2) were true for all columns above, use - rec_prefix_field_no instead of rec_field_no, and skip - the clustered lookup below. */ - if (row_contains_all_values) { - for (i = 0; i < prebuilt->n_template; i++) { - mysql_row_templ_t* templ = - prebuilt->mysql_template + i; - templ->rec_field_no = - templ->rec_prefix_field_no; - ut_a(templ->rec_field_no != ULINT_UNDEFINED); - } - use_clustered_index = FALSE; - srv_stats.n_sec_rec_cluster_reads_avoided.inc(); - } - } - - if (use_clustered_index) { requires_clust_rec: ut_ad(index != clust_index); /* We use a 'goto' to the preceding label if a consistent @@ -4934,6 +4999,7 @@ row_search_for_mysql( } } } else { +use_covering_index: result_rec = rec; } diff --git a/storage/innobase/row/row0upd.cc b/storage/innobase/row/row0upd.cc index e2de47bf8..33f468826 100644 --- a/storage/innobase/row/row0upd.cc +++ b/storage/innobase/row/row0upd.cc @@ -1803,6 +1803,23 @@ row_upd_store_row( } } +#ifdef WITH_WSREP +/** Determine if a FOREIGN KEY constraint needs to be processed. +@param[in] node query node +@param[in] trx transaction +@return whether the node cannot be ignored */ + +inline bool wsrep_must_process_fk(const upd_node_t* node, const trx_t* trx) +{ + if (!wsrep_on_trx(trx)) { + return false; + } + return que_node_get_type(node->common.parent) != QUE_NODE_UPDATE + || static_cast(node->common.parent)->cascade_node + != node; +} +#endif /* WITH_WSREP */ + /***********************************************************//** Updates a secondary index entry of a row. @return DB_SUCCESS if operation successfully completed, else error @@ -1833,7 +1850,7 @@ row_upd_sec_index_entry( referenced = row_upd_index_is_referenced(index, trx); #ifdef WITH_WSREP - ibool foreign = wsrep_row_upd_index_is_foreign(index, trx); + bool foreign = wsrep_row_upd_index_is_foreign(index, trx); #endif /* WITH_WSREP */ heap = mem_heap_create(1024); @@ -1962,61 +1979,61 @@ row_upd_sec_index_entry( row_ins_sec_index_entry() below */ if (!rec_get_deleted_flag( rec, dict_table_is_comp(index->table))) { -#ifdef WITH_WSREP - que_node_t *parent = que_node_get_parent(node); -#endif /* WITH_WSREP */ err = btr_cur_del_mark_set_sec_rec( 0, btr_cur, TRUE, thr, &mtr); - if (err == DB_SUCCESS && referenced) { - - ulint* offsets; - - offsets = rec_get_offsets( - rec, index, NULL, ULINT_UNDEFINED, - &heap); - - /* NOTE that the following call loses - the position of pcur ! */ - err = row_upd_check_references_constraints( - node, &pcur, index->table, - index, offsets, thr, &mtr); + if (err != DB_SUCCESS) { + break; } + #ifdef WITH_WSREP - if (err == DB_SUCCESS && !referenced && - wsrep_on_trx(trx) && - !wsrep_thd_is_BF(trx->mysql_thd, FALSE) && - !(parent && que_node_get_type(parent) == - QUE_NODE_UPDATE && - ((upd_node_t*)parent)->cascade_node == node) && - foreign - ) { - ulint* offsets = - rec_get_offsets( + if (!referenced && foreign + && wsrep_must_process_fk(node, trx) + && !wsrep_thd_is_BF(trx->mysql_thd, FALSE)) { + ulint* offsets = rec_get_offsets( rec, index, NULL, ULINT_UNDEFINED, &heap); + err = wsrep_row_upd_check_foreign_constraints( node, &pcur, index->table, index, offsets, thr, &mtr); + switch (err) { case DB_SUCCESS: case DB_NO_REFERENCED_ROW: err = DB_SUCCESS; break; case DB_DEADLOCK: - if (wsrep_debug) fprintf (stderr, - "WSREP: sec index FK check fail for deadlock"); + if (wsrep_debug) { + ib_logf(IB_LOG_LEVEL_WARN, + "WSREP: sec index FK check fail for deadlock: " + " index %s table %s", index->name, index->table->name); + } break; default: - fprintf (stderr, - "WSREP: referenced FK check fail: %d", - (int)err); + ib_logf(IB_LOG_LEVEL_ERROR, + "WSREP: referenced FK check fail: %s index %s table %s", + ut_strerr(err), index->name, index->table->name); break; } } #endif /* WITH_WSREP */ } - break; + + if (referenced) { + + ulint* offsets; + + offsets = rec_get_offsets( + rec, index, NULL, ULINT_UNDEFINED, + &heap); + + /* NOTE that the following call loses + the position of pcur ! */ + err = row_upd_check_references_constraints( + node, &pcur, index->table, + index, offsets, thr, &mtr); + } } btr_pcur_close(&pcur); @@ -2185,9 +2202,6 @@ row_upd_clust_rec_by_insert( rec_t* rec; ulint* offsets = NULL; -#ifdef WITH_WSREP - que_node_t *parent = que_node_get_parent(node); -#endif /* WITH_WSREP */ ut_ad(node); ut_ad(dict_index_is_clust(index)); @@ -2269,35 +2283,31 @@ row_upd_clust_rec_by_insert( if (err != DB_SUCCESS) { goto err_exit; } - } #ifdef WITH_WSREP - if (!referenced && wsrep_on_trx(trx) && - !(parent && que_node_get_type(parent) == QUE_NODE_UPDATE && - ((upd_node_t*)parent)->cascade_node == node) && - foreign - ) { + } else if ((foreign && wsrep_must_process_fk(node, trx))) { err = wsrep_row_upd_check_foreign_constraints( node, pcur, table, index, offsets, thr, mtr); + switch (err) { case DB_SUCCESS: case DB_NO_REFERENCED_ROW: err = DB_SUCCESS; break; case DB_DEADLOCK: - if (wsrep_debug) fprintf (stderr, - "WSREP: insert FK check fail for deadlock"); + if (wsrep_debug) { + ib_logf(IB_LOG_LEVEL_WARN, + "WSREP: sec index FK check fail for deadlock: " + " index %s table %s", index->name, index->table->name); + } break; default: - fprintf (stderr, - "WSREP: referenced FK check fail: %d", - (int)err); + ib_logf(IB_LOG_LEVEL_ERROR, + "WSREP: referenced FK check fail: %s index %s table %s", + ut_strerr(err), index->name, index->table->name); break; } - if (err != DB_SUCCESS) { - goto err_exit; - } - } #endif /* WITH_WSREP */ + } } mtr_commit(mtr); @@ -2500,7 +2510,7 @@ row_upd_del_mark_clust_rec( dberr_t err; #ifdef WITH_WSREP rec_t* rec; - que_node_t *parent = que_node_get_parent(node); + trx_t* trx = thr_get_trx(thr) ; #endif /* WITH_WSREP */ ut_ad(node); @@ -2529,38 +2539,37 @@ row_upd_del_mark_clust_rec( btr_cur_get_block(btr_cur), btr_cur_get_rec(btr_cur), #endif /* WITH_WSREP */ index, offsets, thr, mtr); - if (err == DB_SUCCESS && referenced) { + if (err != DB_SUCCESS) { + } else if (referenced) { /* NOTE that the following call loses the position of pcur ! */ err = row_upd_check_references_constraints( node, pcur, index->table, index, offsets, thr, mtr); - } #ifdef WITH_WSREP - trx_t* trx = thr_get_trx(thr) ; - if (err == DB_SUCCESS && !referenced && wsrep_on_trx(trx) && - !(parent && que_node_get_type(parent) == QUE_NODE_UPDATE && - ((upd_node_t*)parent)->cascade_node == node) && - foreign - ) { + } else if (foreign && wsrep_must_process_fk(node, trx)) { err = wsrep_row_upd_check_foreign_constraints( node, pcur, index->table, index, offsets, thr, mtr); + switch (err) { case DB_SUCCESS: case DB_NO_REFERENCED_ROW: err = DB_SUCCESS; break; case DB_DEADLOCK: - if (wsrep_debug) fprintf (stderr, - "WSREP: clust rec FK check fail for deadlock"); + if (wsrep_debug) { + ib_logf(IB_LOG_LEVEL_WARN, + "WSREP: sec index FK check fail for deadlock: " + " index %s table %s", index->name, index->table->name); + } break; default: - fprintf (stderr, - "WSREP: clust rec referenced FK check fail: %d", - (int)err); + ib_logf(IB_LOG_LEVEL_ERROR, + "WSREP: referenced FK check fail: %s index %s table %s", + ut_strerr(err), index->name, index->table->name); break; } - } #endif /* WITH_WSREP */ + } mtr_commit(mtr); diff --git a/storage/innobase/srv/srv0srv.cc b/storage/innobase/srv/srv0srv.cc index cb003edfb..6e8ed7893 100644 --- a/storage/innobase/srv/srv0srv.cc +++ b/storage/innobase/srv/srv0srv.cc @@ -77,6 +77,12 @@ Created 10/8/1995 Heikki Tuuri #include "fil0pagecompress.h" #include "btr0scrub.h" +#include + +#ifdef WITH_WSREP +extern int wsrep_debug; +extern int wsrep_trx_is_aborting(void *thd_ptr); +#endif /* The following is the maximum allowed duration of a lock wait. */ UNIV_INTERN ulong srv_fatal_semaphore_wait_threshold = DEFAULT_SRV_FATAL_SEMAPHORE_TIMEOUT; @@ -421,16 +427,6 @@ static ulint srv_n_system_rows_read_old = 0; UNIV_INTERN ulint srv_truncated_status_writes = 0; UNIV_INTERN ulint srv_available_undo_logs = 0; -UNIV_INTERN ib_uint64_t srv_page_compression_saved = 0; -UNIV_INTERN ib_uint64_t srv_page_compression_trim_sect512 = 0; -UNIV_INTERN ib_uint64_t srv_page_compression_trim_sect4096 = 0; -UNIV_INTERN ib_uint64_t srv_index_pages_written = 0; -UNIV_INTERN ib_uint64_t srv_non_index_pages_written = 0; -UNIV_INTERN ib_uint64_t srv_pages_page_compressed = 0; -UNIV_INTERN ib_uint64_t srv_page_compressed_trim_op = 0; -UNIV_INTERN ib_uint64_t srv_page_compressed_trim_op_saved = 0; -UNIV_INTERN ib_uint64_t srv_index_page_decompressed = 0; - /* Defragmentation */ UNIV_INTERN my_bool srv_defragment = FALSE; UNIV_INTERN uint srv_defragment_n_pages = 7; @@ -2546,6 +2542,9 @@ srv_purge_should_exit(ulint n_purged) } /* Slow shutdown was requested. */ if (n_purged) { + service_manager_extend_timeout( + INNODB_EXTEND_TIMEOUT_INTERVAL, + "InnoDB " ULINTPF " pages purged", n_purged); /* The previous round still did some work. */ return(false); } @@ -2736,7 +2735,6 @@ srv_do_purge( (++count % TRX_SYS_N_RSEGS) == 0); *n_total_purged += n_pages_purged; - } while (!srv_purge_should_exit(n_pages_purged) && n_pages_purged > 0 && purge_sys->state == PURGE_STATE_RUN); diff --git a/storage/innobase/trx/trx0roll.cc b/storage/innobase/trx/trx0roll.cc index e5c57aa21..3fd71aff2 100644 --- a/storage/innobase/trx/trx0roll.cc +++ b/storage/innobase/trx/trx0roll.cc @@ -25,7 +25,7 @@ Created 3/26/1996 Heikki Tuuri *******************************************************/ #include "my_config.h" -#include +#include #include "trx0roll.h" @@ -752,11 +752,17 @@ trx_roll_must_shutdown() n_rows += t->undo_no; } } + + if (n_rows > 0) { + service_manager_extend_timeout( + INNODB_EXTEND_TIMEOUT_INTERVAL, + "To roll back: " ULINTPF " transactions, " + "%llu rows", n_trx, n_rows); + } + ib_logf(IB_LOG_LEVEL_INFO, "To roll back: " ULINTPF " transactions, " "%llu rows", n_trx, n_rows); - sd_notifyf(0, "STATUS=To roll back: " ULINTPF " transactions, " - "%llu rows", n_trx, n_rows); } mutex_exit(&recv_sys->mutex); diff --git a/storage/innobase/trx/trx0trx.cc b/storage/innobase/trx/trx0trx.cc index 1cd0b6ede..6d4bb2022 100644 --- a/storage/innobase/trx/trx0trx.cc +++ b/storage/innobase/trx/trx0trx.cc @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2015, 2017, MariaDB Corporation. +Copyright (c) 2015, 2018, MariaDB Corporation. 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 @@ -1256,6 +1256,8 @@ trx_commit_in_memory( trx->read_view = NULL; if (lsn) { + DEBUG_SYNC_C("after_trx_committed_in_memory"); + if (trx->insert_undo != NULL) { trx_undo_insert_cleanup(trx); diff --git a/storage/innobase/trx/trx0undo.cc b/storage/innobase/trx/trx0undo.cc index d6bcd131a..370b3f181 100644 --- a/storage/innobase/trx/trx0undo.cc +++ b/storage/innobase/trx/trx0undo.cc @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2014, 2017, MariaDB Corporation. +Copyright (c) 2014, 2018, MariaDB Corporation. 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 @@ -1989,7 +1989,9 @@ trx_undo_insert_cleanup( mutex_exit(&(rseg->mutex)); - trx_undo_seg_free(undo); + if (!srv_read_only_mode) { + trx_undo_seg_free(undo); + } mutex_enter(&(rseg->mutex)); diff --git a/storage/maria/ha_maria.cc b/storage/maria/ha_maria.cc index 47b24e103..eee6b502c 100644 --- a/storage/maria/ha_maria.cc +++ b/storage/maria/ha_maria.cc @@ -37,6 +37,7 @@ C_MODE_START #include "ma_checkpoint.h" #include "ma_recovery.h" C_MODE_END +#include "ma_trnman.h" //#include "sql_priv.h" #include "protocol.h" @@ -978,7 +979,7 @@ int_table_flags(HA_NULL_IN_KEY | HA_CAN_FULLTEXT | HA_CAN_SQL_HANDLER | HA_DUPLICATE_POS | HA_CAN_INDEX_BLOBS | HA_AUTO_PART_KEY | HA_FILE_BASED | HA_CAN_GEOMETRY | CANNOT_ROLLBACK_FLAG | HA_CAN_BIT_FIELD | HA_CAN_RTREEKEYS | HA_CAN_REPAIR | - HA_CAN_VIRTUAL_COLUMNS | + HA_CAN_VIRTUAL_COLUMNS | HA_CAN_EXPORT | HA_HAS_RECORDS | HA_STATS_RECORDS_IS_EXACT), can_enable_indexes(1), bulk_insert_single_undo(BULK_INSERT_NONE) {} @@ -1323,6 +1324,7 @@ int ha_maria::check(THD * thd, HA_CHECK_OPT * check_opt) old_proc_info= thd_proc_info(thd, "Checking status"); thd_progress_init(thd, 3); error= maria_chk_status(param, file); // Not fatal + /* maria_chk_size() will flush the page cache for this file */ if (maria_chk_size(param, file)) error= 1; if (!error) @@ -1381,7 +1383,8 @@ int ha_maria::check(THD * thd, HA_CHECK_OPT * check_opt) } /* Reset trn, that may have been set by repair */ - _ma_set_trn_for_table(file, old_trn); + if (old_trn && old_trn != file->trn) + _ma_set_trn_for_table(file, old_trn); thd_proc_info(thd, old_proc_info); thd_progress_end(thd); return error ? HA_ADMIN_CORRUPT : HA_ADMIN_OK; @@ -1515,7 +1518,8 @@ int ha_maria::zerofill(THD * thd, HA_CHECK_OPT *check_opt) error=maria_zerofill(param, file, share->open_file_name.str); /* Reset trn, that may have been set by repair */ - _ma_set_trn_for_table(file, old_trn); + if (old_trn && old_trn != file->trn) + _ma_set_trn_for_table(file, old_trn); if (!error) { @@ -1755,7 +1759,8 @@ int ha_maria::repair(THD *thd, HA_CHECK *param, bool do_optimize) maria_lock_database(file, F_UNLCK); /* Reset trn, that may have been set by repair */ - _ma_set_trn_for_table(file, old_trn); + if (old_trn && old_trn != file->trn) + _ma_set_trn_for_table(file, old_trn); error= error ? HA_ADMIN_FAILED : (optimize_done ? (write_log_record_for_repair(param, file) ? HA_ADMIN_FAILED : @@ -2222,6 +2227,7 @@ int ha_maria::end_bulk_insert() _ma_reenable_logging_for_table(file, bulk_insert_single_undo == BULK_INSERT_SINGLE_UNDO_AND_NO_REPAIR); + bulk_insert_single_undo= BULK_INSERT_NONE; // Safety } DBUG_RETURN(err); } @@ -2565,9 +2571,12 @@ int ha_maria::extra(enum ha_extra_function operation) without calling commit/rollback in between. If file->trn is not set we can't remove file->share from the transaction list in the extra() call. - We also ensure that we set file->trn to 0 if THD_TRN is 0 as in - this case we have already freed the trn. This can happen when one - implicit_commit() is called as part of alter table. + In current code we don't have to do this for HA_EXTRA_PREPARE_FOR_RENAME + as this is only used the intermediate table used by ALTER TABLE which + is not part of the transaction (it's not in the TRN list). Better to + keep this for now, to not break anything in a stable release. + When HA_EXTRA_PREPARE_FOR_RENAME is not handled below, we can change + the warnings in _ma_remove_table_from_trnman() to asserts. table->in_use is not set in the case this is a done as part of closefrm() as part of drop table. @@ -2580,7 +2589,7 @@ int ha_maria::extra(enum ha_extra_function operation) { THD *thd= table->in_use; TRN *trn= THD_TRN; - _ma_set_trn_for_table(file, trn); + _ma_set_tmp_trn_for_table(file, trn); } DBUG_ASSERT(file->s->base.born_transactional || file->trn == 0 || file->trn == &dummy_transaction_object); @@ -2696,6 +2705,7 @@ int ha_maria::external_lock(THD *thd, int lock_type) if (file->trn) { /* This can only happen with tables created with clone() */ + DBUG_PRINT("info",("file->trn: %p", file->trn)); trnman_increment_locked_tables(file->trn); } @@ -2716,7 +2726,7 @@ int ha_maria::external_lock(THD *thd, int lock_type) } else { - TRN *trn= THD_TRN; + TRN *trn= (file->trn != &dummy_transaction_object ? file->trn : 0); /* End of transaction */ /* @@ -2731,8 +2741,7 @@ int ha_maria::external_lock(THD *thd, int lock_type) */ if (_ma_reenable_logging_for_table(file, TRUE)) DBUG_RETURN(1); - /** @todo zero file->trn also in commit and rollback */ - _ma_set_trn_for_table(file, NULL); // Safety + _ma_reset_trn_for_table(file); /* Ensure that file->state points to the current number of rows. This is needed if someone calls maria_info() without first doing an @@ -2788,13 +2797,6 @@ int ha_maria::start_stmt(THD *thd, thr_lock_type lock_type) DBUG_ASSERT(lock_type != TL_UNLOCK); DBUG_ASSERT(file->trn == trn); - /* - If there was an implicit commit under this LOCK TABLES by a previous - statement (like a DDL), at least if that previous statement was about a - different ha_maria than 'this' then this->file->trn is a stale - pointer. We fix it: - */ - _ma_set_trn_for_table(file, trn); /* As external_lock() was already called, don't increment locked_tables. Note that we call the function below possibly several times when @@ -2819,6 +2821,23 @@ int ha_maria::start_stmt(THD *thd, thr_lock_type lock_type) } +/* + Reset THD_TRN and all file->trn related to the transaction + This is needed as some calls, like extra() or external_lock() may access + it before next transaction is started +*/ + +static void reset_thd_trn(THD *thd, MARIA_HA *first_table) +{ + DBUG_ENTER("reset_thd_trn"); + THD_TRN= NULL; + for (MARIA_HA *table= first_table; table ; + table= table->trn_next) + _ma_reset_trn_for_table(table); + DBUG_VOID_RETURN; +} + + /** Performs an implicit commit of the Maria transaction and creates a new one. @@ -2842,10 +2861,10 @@ int ha_maria::implicit_commit(THD *thd, bool new_trn) TRN *trn; int error; uint locked_tables; - DYNAMIC_ARRAY used_tables; extern my_bool plugins_are_initialized; - + MARIA_HA *used_tables, *trn_next; DBUG_ENTER("ha_maria::implicit_commit"); + if (!maria_hton || !plugins_are_initialized || !(trn= THD_TRN)) DBUG_RETURN(0); if (!new_trn && (thd->locked_tables_mode == LTM_LOCK_TABLES || @@ -2863,48 +2882,16 @@ int ha_maria::implicit_commit(THD *thd, bool new_trn) locked_tables= trnman_has_locked_tables(trn); - if (new_trn && trn && trn->used_tables) - { - MARIA_USED_TABLES *tables; - /* - Save locked tables so that we can move them to another transaction - We are using a dynamic array as locked_tables in some cases can be - smaller than the used_tables list (for example when the server does - early unlock of tables. - */ - - my_init_dynamic_array2(&used_tables, sizeof(MARIA_SHARE*), (void*) 0, - locked_tables, 8, MYF(MY_THREAD_SPECIFIC)); - for (tables= (MARIA_USED_TABLES*) trn->used_tables; - tables; - tables= tables->next) - { - if (tables->share->base.born_transactional) - { - if (insert_dynamic(&used_tables, (uchar*) &tables->share)) - { - error= HA_ERR_OUT_OF_MEM; - goto end_and_free; - } - } - } - } - else - bzero(&used_tables, sizeof(used_tables)); - + used_tables= (MARIA_HA*) trn->used_instances; error= 0; if (unlikely(ma_commit(trn))) error= 1; if (!new_trn) { - /* - To be extra safe, we should also reset file->trn for all open - tables as some calls, like extra() may access it. We take care - of this in extra() by resetting file->trn if THD_TRN is 0. - */ - THD_TRN= NULL; + reset_thd_trn(thd, used_tables); goto end; } + /* We need to create a new transaction and put it in THD_TRN. Indeed, tables may be under LOCK TABLES, and so they will start the next @@ -2914,8 +2901,9 @@ int ha_maria::implicit_commit(THD *thd, bool new_trn) THD_TRN= trn; if (unlikely(trn == NULL)) { + reset_thd_trn(thd, used_tables); error= HA_ERR_OUT_OF_MEM; - goto end_and_free; + goto end; } /* Move all locked tables to the new transaction @@ -2925,35 +2913,25 @@ int ha_maria::implicit_commit(THD *thd, bool new_trn) in check table, we use the table without calling start_stmt(). */ - uint i; - for (i= 0 ; i < used_tables.elements ; i++) + for (MARIA_HA *handler= used_tables; handler ; + handler= trn_next) { - MARIA_SHARE *share; - LIST *handlers; + trn_next= handler->trn_next; + DBUG_ASSERT(handler->s->base.born_transactional); - share= *(dynamic_element(&used_tables, i, MARIA_SHARE**)); - /* Find table instances that was used in this transaction */ - for (handlers= share->open_list; handlers; handlers= handlers->next) + /* If handler uses versioning */ + if (handler->s->lock_key_trees) { - MARIA_HA *handler= (MARIA_HA*) handlers->data; - if (handler->external_ref && - ((TABLE*) handler->external_ref)->in_use == thd) - { - _ma_set_trn_for_table(handler, trn); - /* If handler uses versioning */ - if (handler->s->lock_key_trees) - { - if (_ma_setup_live_state(handler)) - error= HA_ERR_OUT_OF_MEM; - } - } + /* _ma_set_trn_for_table() will be called indirectly */ + if (_ma_setup_live_state(handler)) + error= HA_ERR_OUT_OF_MEM; } + else + _ma_set_trn_for_table(handler, trn); } /* This is just a commit, tables stay locked if they were: */ trnman_reset_locked_tables(trn, locked_tables); -end_and_free: - delete_dynamic(&used_tables); end: DBUG_RETURN(error); } @@ -3326,10 +3304,10 @@ static int maria_commit(handlerton *hton __attribute__ ((unused)), trnman_set_flags(trn, trnman_get_flags(trn) & ~TRN_STATE_INFO_LOGGED); /* statement or transaction ? */ - if ((thd->variables.option_bits & (OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN)) && !all) + if ((thd->variables.option_bits & (OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN)) && + !all) DBUG_RETURN(0); // end of statement - DBUG_PRINT("info", ("THD_TRN set to 0x0")); - THD_TRN= 0; + reset_thd_trn(thd, (MARIA_HA*) trn->used_instances); DBUG_RETURN(ma_commit(trn)); // end of transaction } @@ -3346,8 +3324,7 @@ static int maria_rollback(handlerton *hton __attribute__ ((unused)), trnman_rollback_statement(trn); DBUG_RETURN(0); // end of statement } - DBUG_PRINT("info", ("THD_TRN set to 0x0")); - THD_TRN= 0; + reset_thd_trn(thd, (MARIA_HA*) trn->used_instances); DBUG_RETURN(trnman_rollback_trn(trn) ? HA_ERR_OUT_OF_MEM : 0); // end of transaction } diff --git a/storage/maria/ha_maria.h b/storage/maria/ha_maria.h index 65fe5f545..f3548a381 100644 --- a/storage/maria/ha_maria.h +++ b/storage/maria/ha_maria.h @@ -193,6 +193,7 @@ class ha_maria :public handler private: DsMrr_impl ds_mrr; friend ICP_RESULT index_cond_func_maria(void *arg); + friend void reset_thd_trn(THD *thd); }; #endif /* HA_MARIA_INCLUDED */ diff --git a/storage/maria/ma_bitmap.c b/storage/maria/ma_bitmap.c index 9ab5533fd..e8e2bc56b 100644 --- a/storage/maria/ma_bitmap.c +++ b/storage/maria/ma_bitmap.c @@ -145,6 +145,11 @@ static my_bool _ma_bitmap_create_missing(MARIA_HA *info, MARIA_FILE_BITMAP *bitmap, pgcache_page_no_t page); static void _ma_bitmap_unpin_all(MARIA_SHARE *share); +#ifndef DBUG_OFF +static void _ma_check_bitmap(MARIA_FILE_BITMAP *bitmap); +#else +#define _ma_check_bitmap(A) do { } while(0) +#endif /* Write bitmap page to key cache */ @@ -267,6 +272,13 @@ my_bool _ma_bitmap_init(MARIA_SHARE *share, File file, bitmap->sizes[6]= max_page_size - max_page_size * 80 / 100; bitmap->sizes[7]= 0; + /* + If a record size will fit into the smallest empty page, return first + found page in find_head() + */ + if (bitmap->sizes[3] >= share->base.max_pack_length) + bitmap->return_first_match= 1; + mysql_mutex_init(key_SHARE_BITMAP_lock, &share->bitmap.bitmap_lock, MY_MUTEX_INIT_SLOW); mysql_cond_init(key_SHARE_BITMAP_cond, @@ -677,7 +689,8 @@ void _ma_bitmap_delete_all(MARIA_SHARE *share) bzero(bitmap->map, bitmap->block_size); bitmap->changed= 1; bitmap->page= 0; - bitmap->used_size= bitmap->total_size= bitmap->max_total_size; + bitmap->used_size= bitmap->full_tail_size= bitmap->full_head_size= 0; + bitmap->total_size= bitmap->max_total_size; } DBUG_VOID_RETURN; } @@ -715,6 +728,7 @@ void _ma_bitmap_reset_cache(MARIA_SHARE *share) */ bitmap->page= ((pgcache_page_no_t) 0) - bitmap->pages_covered; bitmap->used_size= bitmap->total_size= bitmap->max_total_size; + bitmap->full_head_size= bitmap->full_tail_size= bitmap->max_total_size; bfill(bitmap->map, share->block_size, 255); #ifndef DBUG_OFF memcpy(bitmap->map + bitmap->block_size, bitmap->map, bitmap->block_size); @@ -1016,9 +1030,6 @@ static void adjust_total_size(MARIA_HA *info, pgcache_page_no_t page) bitmap Bitmap handler page Page to read - TODO - Update 'bitmap->used_size' to real size of used bitmap - NOTE We don't always have share->bitmap.bitmap_lock here (when called from_ma_check_bitmap_data() for example). @@ -1035,6 +1046,9 @@ static my_bool _ma_read_bitmap_page(MARIA_HA *info, MARIA_SHARE *share= info->s; my_bool res; DBUG_ENTER("_ma_read_bitmap_page"); + DBUG_PRINT("enter", ("page: %lld data_file_length: %lld", + (longlong) page, + (longlong) share->state.state.data_file_length)); DBUG_ASSERT(page % bitmap->pages_covered == 0); DBUG_ASSERT(!bitmap->changed); @@ -1049,13 +1063,22 @@ static my_bool _ma_read_bitmap_page(MARIA_HA *info, } adjust_total_size(info, page); - bitmap->used_size= bitmap->total_size; + bitmap->full_head_size= bitmap->full_tail_size= 0; DBUG_ASSERT(share->pagecache->block_size == bitmap->block_size); res= pagecache_read(share->pagecache, &bitmap->file, page, 0, bitmap->map, PAGECACHE_PLAIN_PAGE, PAGECACHE_LOCK_LEFT_UNLOCKED, 0) == NULL; + if (!res) + { + /* Calculate used_size */ + const uchar *data, *end= bitmap->map; + for (data= bitmap->map + bitmap->total_size; --data >= end && *data == 0; ) + {} + bitmap->used_size= (uint) ((data + 1) - end); + DBUG_ASSERT(bitmap->used_size <= bitmap->total_size); + } /* We can't check maria_bitmap_marker here as if the bitmap page previously had a true checksum and the user switched mode to not checksum @@ -1067,7 +1090,10 @@ static my_bool _ma_read_bitmap_page(MARIA_HA *info, #ifndef DBUG_OFF if (!res) + { memcpy(bitmap->map + bitmap->block_size, bitmap->map, bitmap->block_size); + _ma_check_bitmap(bitmap); + } #endif DBUG_RETURN(res); } @@ -1097,6 +1123,8 @@ static my_bool _ma_change_bitmap_page(MARIA_HA *info, { DBUG_ENTER("_ma_change_bitmap_page"); + _ma_check_bitmap(bitmap); + /* We have to mark the file changed here, as otherwise the following read/write to pagecache may force a page out from this file, which would @@ -1228,6 +1256,9 @@ static void fill_block(MARIA_FILE_BITMAP *bitmap, This is defined as the first page of the set of pages with the smallest free space that can hold 'size'. + NOTES + Updates bitmap->full_head_size while scanning data + RETURN 0 ok (block is updated) 1 error (no space in bitmap; block is not touched) @@ -1238,10 +1269,11 @@ static my_bool allocate_head(MARIA_FILE_BITMAP *bitmap, uint size, MARIA_BITMAP_BLOCK *block) { uint min_bits= size_to_head_pattern(bitmap, size); - uchar *data= bitmap->map, *end= data + bitmap->used_size; + uchar *data, *end; uchar *best_data= 0; uint best_bits= (uint) -1, UNINIT_VAR(best_pos); - uint first_pattern= 0; /* if doing insert_order */ + my_bool first_pattern= 0; /* if doing insert_order */ + my_bool first_found= 1; MARIA_SHARE *share= bitmap->share; my_bool insert_order= MY_TEST(share->base.extra_options & MA_EXTRA_OPTIONS_INSERT_ORDER); @@ -1249,16 +1281,19 @@ static my_bool allocate_head(MARIA_FILE_BITMAP *bitmap, uint size, DBUG_ASSERT(size <= FULL_PAGE_SIZE(share)); + end= bitmap->map + bitmap->used_size; if (insert_order && bitmap->page == share->last_insert_bitmap) { uint last_insert_page= share->last_insert_page; uint byte= 6 * (last_insert_page / 16); first_pattern= last_insert_page % 16; - DBUG_ASSERT(data + byte < end); - data+= byte; + data= bitmap->map+byte; + DBUG_ASSERT(data <= end); } + else + data= bitmap->map + (bitmap->full_head_size/6)*6; - for (; data < end; data+= 6) + for (; data < end; data+= 6, first_pattern= 0) { ulonglong bits= uint6korr(data); /* 6 bytes = 6*8/3= 16 patterns */ uint i; @@ -1271,17 +1306,24 @@ static my_bool allocate_head(MARIA_FILE_BITMAP *bitmap, uint size, */ if ((!bits && best_data) || ((bits & 04444444444444444LL) == 04444444444444444LL)) - { - first_pattern= 0; // always restart from 0 when moving to new 6-byte continue; - } + for (i= first_pattern, bits >>= (3 * first_pattern); i < 16 ; i++, bits >>= 3) { uint pattern= (uint) (bits & 7); + + if (pattern <= 3) /* Room for more data */ + { + if (first_found) + { + first_found= 0; + bitmap->full_head_size= (data - bitmap->map); + } + } if (pattern <= min_bits) { - /* There is enough space here */ + /* There is enough space here, check if we have found better */ if ((int) pattern > (int) best_bits) { /* @@ -1292,23 +1334,32 @@ static my_bool allocate_head(MARIA_FILE_BITMAP *bitmap, uint size, best_bits= pattern; best_data= data; best_pos= i; - if (pattern == min_bits) + if (pattern == min_bits || bitmap->return_first_match) goto found; /* Best possible match */ } } } - first_pattern= 0; // always restart from 0 when moving to new 6-byte } if (!best_data) /* Found no place */ { if (data >= bitmap->map + bitmap->total_size) DBUG_RETURN(1); /* No space in bitmap */ + DBUG_ASSERT(uint6korr(data) == 0); /* Allocate data at end of bitmap */ - bitmap->used_size+= 6; - set_if_smaller(bitmap->used_size, bitmap->total_size); + bitmap->used_size= (uint) (data - bitmap->map) + 6; best_data= data; best_pos= best_bits= 0; } + else + { + /* + This is not stricly needed as used_size should be alligned on 6, + but for easier debugging lets try to keep it more accurate + */ + uint position= (uint) (best_data - bitmap->map) + 6; + set_if_bigger(bitmap->used_size, position); + } + DBUG_ASSERT(bitmap->used_size <= bitmap->total_size); found: if (insert_order) @@ -1341,12 +1392,15 @@ static my_bool allocate_tail(MARIA_FILE_BITMAP *bitmap, uint size, MARIA_BITMAP_BLOCK *block) { uint min_bits= size_to_tail_pattern(bitmap, size); - uchar *data= bitmap->map, *end= data + bitmap->used_size; - uchar *best_data= 0; + uchar *data, *end, *best_data= 0; + my_bool first_found= 1; uint best_bits= (uint) -1, UNINIT_VAR(best_pos); DBUG_ENTER("allocate_tail"); DBUG_PRINT("enter", ("size: %u", size)); + data= bitmap->map + (bitmap->full_tail_size/6)*6; + end= bitmap->map + bitmap->used_size; + /* We have to add DIR_ENTRY_SIZE here as this is not part of the data size See call to allocate_tail() in find_tail(). @@ -1375,7 +1429,19 @@ static my_bool allocate_tail(MARIA_FILE_BITMAP *bitmap, uint size, for (i= 0; i < 16; i++, bits >>= 3) { uint pattern= (uint) (bits & 7); - if (pattern <= min_bits && (!pattern || pattern >= 5)) + + if (pattern == 0 || + (pattern > FULL_HEAD_PAGE && pattern < FULL_TAIL_PAGE)) + { + /* There is room for tail data */ + if (first_found) + { + first_found= 0; + bitmap->full_tail_size= (data - bitmap->map); + } + } + + if (pattern <= min_bits && (!pattern || pattern > FULL_HEAD_PAGE)) { if ((int) pattern > (int) best_bits) { @@ -1392,10 +1458,11 @@ static my_bool allocate_tail(MARIA_FILE_BITMAP *bitmap, uint size, { if (data >= bitmap->map + bitmap->total_size) DBUG_RETURN(1); + DBUG_ASSERT(uint6korr(data) == 0); /* Allocate data at end of bitmap */ best_data= data; - bitmap->used_size+= 6; - set_if_smaller(bitmap->used_size, bitmap->total_size); + bitmap->used_size= (uint) (data - bitmap->map) + 6; + DBUG_ASSERT(bitmap->used_size <= bitmap->total_size); best_pos= best_bits= 0; } @@ -1434,8 +1501,7 @@ static ulong allocate_full_pages(MARIA_FILE_BITMAP *bitmap, ulong pages_needed, MARIA_BITMAP_BLOCK *block, my_bool full_page) { - uchar *data= bitmap->map, *data_end= data + bitmap->used_size; - uchar *page_end= data + bitmap->total_size; + uchar *data, *data_end, *page_end; uchar *best_data= 0; uint min_size; uint best_area_size, UNINIT_VAR(best_prefix_area_size); @@ -1449,6 +1515,10 @@ static ulong allocate_full_pages(MARIA_FILE_BITMAP *bitmap, min_size= BLOB_SEGMENT_MIN_SIZE; best_area_size= ~(uint) 0; + data= bitmap->map + (bitmap->full_head_size/6)*6; + data_end= bitmap->map + bitmap->used_size; + page_end= bitmap->map + bitmap->total_size; + for (; data < page_end; data+= 6) { ulonglong bits= uint6korr(data); /* 6 bytes = 6*8/3= 16 patterns */ @@ -1466,6 +1536,12 @@ static ulong allocate_full_pages(MARIA_FILE_BITMAP *bitmap, if ((bits= uint6korr(data))) break; } + /* + Check if we are end of bitmap. In this case we know that + the rest of the bitmap is usable + */ + if (data >= data_end) + data= page_end; area_size= (uint) (data - data_start) / 6 * 16; if (area_size >= best_area_size) continue; @@ -1823,7 +1899,7 @@ static my_bool allocate_blobs(MARIA_HA *info, MARIA_ROW *row) /* - Store in the bitmap the new size for a head page + Reserve the current head page SYNOPSIS use_head() @@ -2225,7 +2301,7 @@ static my_bool set_page_bits(MARIA_HA *info, MARIA_FILE_BITMAP *bitmap, pgcache_page_no_t page, uint fill_pattern) { pgcache_page_no_t bitmap_page; - uint offset_page, offset, tmp, org_tmp; + uint offset_page, offset, tmp, org_tmp, used_offset; uchar *data; DBUG_ENTER("set_page_bits"); DBUG_ASSERT(fill_pattern <= 7); @@ -2237,6 +2313,7 @@ static my_bool set_page_bits(MARIA_HA *info, MARIA_FILE_BITMAP *bitmap, /* Find page number from start of bitmap */ offset_page= (uint) (page - bitmap->page - 1); + /* Mark place used by reading/writing 2 bytes at a time to handle bitmaps in overlapping bytes @@ -2248,11 +2325,37 @@ static my_bool set_page_bits(MARIA_HA *info, MARIA_FILE_BITMAP *bitmap, tmp= (tmp & ~(7 << offset)) | (fill_pattern << offset); if (tmp == org_tmp) DBUG_RETURN(0); /* No changes */ - int2store(data, tmp); + /* + Take care to not write bytes outside of bitmap. + fill_pattern is 3 bits, so we need to write two bytes + if bit position we write to is > (8-3) + */ + if (offset > 5) + int2store(data, tmp); + else + data[0]= tmp; + + /* + Reset full_head_size or full_tail_size if we are releasing data before + it. Increase used_size if we are allocating data. + */ + used_offset= (uint) (data - bitmap->map); + if (fill_pattern < 4) + set_if_smaller(bitmap->full_head_size, used_offset); + if (fill_pattern == 0 || (fill_pattern > 4 && fill_pattern < 7)) + set_if_smaller(bitmap->full_tail_size, used_offset); + if (fill_pattern != 0) + { + /* Calulcate which was the last changed byte */ + used_offset+= offset > 5 ? 2 : 1; + set_if_bigger(bitmap->used_size, used_offset); + } + + _ma_check_bitmap(bitmap); bitmap->changed= 1; DBUG_EXECUTE("bitmap", _ma_print_bitmap_changes(bitmap);); - if (fill_pattern != 3 && fill_pattern != 7) + if (fill_pattern != FULL_HEAD_PAGE && fill_pattern != FULL_TAIL_PAGE) set_if_smaller(info->s->state.first_bitmap_with_space, bitmap_page); /* Note that if the condition above is false (page is full), and all pages of @@ -2345,7 +2448,7 @@ my_bool _ma_bitmap_reset_full_page_bits(MARIA_HA *info, uint page_count) { ulonglong bitmap_page; - uint offset, bit_start, bit_count, tmp; + uint offset, bit_start, bit_count, tmp, byte_offset; uchar *data; DBUG_ENTER("_ma_bitmap_reset_full_page_bits"); DBUG_PRINT("enter", ("page: %lu page_count: %u", (ulong) page, page_count)); @@ -2365,7 +2468,8 @@ my_bool _ma_bitmap_reset_full_page_bits(MARIA_HA *info, bit_start= offset * 3; bit_count= page_count * 3; - data= bitmap->map + bit_start / 8; + byte_offset= bit_start/8; + data= bitmap->map + byte_offset; offset= bit_start & 7; tmp= (255 << offset); /* Bits to keep */ @@ -2376,6 +2480,9 @@ my_bool _ma_bitmap_reset_full_page_bits(MARIA_HA *info, } *data&= ~tmp; + set_if_smaller(bitmap->full_head_size, byte_offset); + set_if_smaller(bitmap->full_tail_size, byte_offset); + if ((int) (bit_count-= (8 - offset)) > 0) { uint fill; @@ -2477,6 +2584,8 @@ my_bool _ma_bitmap_set_full_page_bits(MARIA_HA *info, tmp= (1 << bit_count) - 1; *data|= tmp; } + set_if_bigger(bitmap->used_size, (uint) (data - bitmap->map) + 1); + _ma_check_bitmap(bitmap); bitmap->changed= 1; DBUG_EXECUTE("bitmap", _ma_print_bitmap_changes(bitmap);); DBUG_RETURN(0); @@ -2835,6 +2944,72 @@ my_bool _ma_check_bitmap_data(MARIA_HA *info, enum en_page_type page_type, return (bitmap_pattern != bits); } +/** + Check that bitmap looks correct + + - All data before full_head_size and full_tail_size are allocated + - There is no allocated data after used_size + All of the above need to be correct only according to 6 byte + alignment as all loops reads 6 bytes at a time and we check both + start and end position according to the current 6 byte position. +*/ + +#ifndef DBUG_OFF +static void _ma_check_bitmap(MARIA_FILE_BITMAP *bitmap) +{ + uchar *data= bitmap->map; + uchar *end= bitmap->map + bitmap->total_size; + uchar *full_head_end=0, *full_tail_end=0, *first_empty= bitmap->map; + + for (; data < end; data+= 6) + { + ulonglong bits= uint6korr(data); /* 6 bytes = 6*8/3= 16 patterns */ + uint i; + + if (bits == 04444444444444444LL || bits == 0xffffffffffffLL) + { + first_empty= data + 6; + continue; /* block fully used */ + } + if (bits == 0) + { + if (!full_head_end) + full_head_end= data; + if (!full_tail_end) + full_tail_end= data; + continue; + } + + first_empty= data + 6; + if (!full_head_end || !full_tail_end) + { + for (i= 0, bits >>= 0; i < 16 ; i++, bits >>= 3) + { + uint pattern= (uint) (bits & 7); + if (pattern == FULL_HEAD_PAGE || pattern == FULL_TAIL_PAGE) + continue; + + if (pattern < 4 && !full_head_end) + full_head_end= data; + if ((pattern == 0 || (pattern > 4 && pattern < 7)) && !full_tail_end) + full_tail_end= data; + } + } + } + if (!full_head_end) + full_head_end= data; + if (!full_tail_end) + full_tail_end= data; + + /* used_size must point after the last byte that had some data) */ + DBUG_ASSERT(bitmap->used_size <= bitmap->total_size); + DBUG_ASSERT((bitmap->map + (bitmap->used_size+5)/6*6) >= first_empty); + /* full_xxxx_size can't point after the first block that has free data */ + DBUG_ASSERT((bitmap->map + (bitmap->full_head_size/6*6)) <= full_head_end); + DBUG_ASSERT((bitmap->map + (bitmap->full_tail_size/6*6)) <= full_tail_end); +} +#endif + /* Check if the page type matches the one that we have in the bitmap @@ -3072,6 +3247,7 @@ static my_bool _ma_bitmap_create_missing(MARIA_HA *info, pgcache_page_no_t from, to; my_off_t data_file_length= share->state.state.data_file_length; DBUG_ENTER("_ma_bitmap_create_missing"); + DBUG_PRINT("enter", ("page: %lld", (longlong) page)); /* First (in offset order) bitmap page to create */ if (data_file_length < block_size) @@ -3124,7 +3300,8 @@ static my_bool _ma_bitmap_create_missing(MARIA_HA *info, only later as we are going to modify it very soon. */ bzero(bitmap->map, bitmap->block_size); - bitmap->used_size= 0; + bitmap->used_size= bitmap->full_head_size= bitmap->full_tail_size= 0; + bitmap->changed=1; #ifndef DBUG_OFF /* Make a copy of the page to be able to print out bitmap changes during diff --git a/storage/maria/ma_blockrec.c b/storage/maria/ma_blockrec.c index c4ec3cf2f..c0a934153 100644 --- a/storage/maria/ma_blockrec.c +++ b/storage/maria/ma_blockrec.c @@ -271,6 +271,7 @@ #include "maria_def.h" #include "ma_blockrec.h" #include "trnman.h" +#include "ma_trnman.h" #include "ma_key_recover.h" #include "ma_recovery_util.h" #include @@ -7525,7 +7526,7 @@ void maria_ignore_trids(MARIA_HA *info) if (info->s->base.born_transactional) { if (!info->trn) - _ma_set_trn_for_table(info, &dummy_transaction_object); + _ma_set_tmp_trn_for_table(info, &dummy_transaction_object); /* Ignore transaction id when row is read */ info->trn->min_read_from= ~(TrID) 0; } diff --git a/storage/maria/ma_close.c b/storage/maria/ma_close.c index d89a69f02..b63340e23 100644 --- a/storage/maria/ma_close.c +++ b/storage/maria/ma_close.c @@ -37,6 +37,8 @@ int maria_close(register MARIA_HA *info) /* Check that we have unlocked key delete-links properly */ DBUG_ASSERT(info->key_del_used == 0); + /* Check that file is not part of any uncommited transactions */ + DBUG_ASSERT(info->trn == 0 || info->trn == &dummy_transaction_object); if (share->reopen == 1) { diff --git a/storage/maria/ma_commit.c b/storage/maria/ma_commit.c index 358f564d3..0ae3868db 100644 --- a/storage/maria/ma_commit.c +++ b/storage/maria/ma_commit.c @@ -15,6 +15,7 @@ #include "maria_def.h" #include "trnman.h" +#include "ma_trnman.h" /** writes a COMMIT record to log and commits transaction in memory @@ -43,9 +44,9 @@ int ma_commit(TRN *trn) COMMIT record) and this is not an issue as * transaction's updates were not made visible to other transactions * "commit ok" was not sent to client - Alternatively, Recovery might commit trn (if MY_MIN(rec_lsn) is before COMMIT - record), which is ok too. All in all it means that "trn committed" is not - 100% equal to "COMMIT record written". + Alternatively, Recovery might commit trn (if MY_MIN(rec_lsn) is before + COMMIT record), which is ok too. All in all it means that "trn committed" + is not 100% equal to "COMMIT record written". - if COMMIT record is written after trnman_commit_trn(): if crash happens between the two, trn will be rolled back which is an issue (transaction's updates were made visible to other transactions). @@ -93,7 +94,12 @@ int ma_commit(TRN *trn) int maria_commit(MARIA_HA *info) { - return info->s->now_transactional ? ma_commit(info->trn) : 0; + TRN *trn; + if (!info->s->now_transactional) + return 0; + trn= info->trn; + info->trn= 0; /* checked in maria_close() */ + return ma_commit(trn); } @@ -120,10 +126,7 @@ int maria_begin(MARIA_HA *info) TRN *trn= trnman_new_trn(0); if (unlikely(!trn)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); - - DBUG_PRINT("info", ("TRN set to 0x%lx", (ulong) trn)); _ma_set_trn_for_table(info, trn); } DBUG_RETURN(0); } - diff --git a/storage/maria/ma_control_file.c b/storage/maria/ma_control_file.c index b46cf7e17..f037589db 100644 --- a/storage/maria/ma_control_file.c +++ b/storage/maria/ma_control_file.c @@ -273,7 +273,7 @@ CONTROL_FILE_ERROR ma_control_file_open(my_bool create_if_missing, " file is probably in use by another process"; uint new_cf_create_time_size, new_cf_changeable_size, new_block_size; my_off_t file_size; - int open_flags= O_BINARY | /*O_DIRECT |*/ O_RDWR; + int open_flags= O_BINARY | /*O_DIRECT |*/ O_RDWR | O_CLOEXEC; int error= CONTROL_FILE_UNKNOWN_ERROR; DBUG_ENTER("ma_control_file_open"); diff --git a/storage/maria/ma_dynrec.c b/storage/maria/ma_dynrec.c index 7f34b7308..0234eb5fb 100644 --- a/storage/maria/ma_dynrec.c +++ b/storage/maria/ma_dynrec.c @@ -275,7 +275,7 @@ my_bool _ma_update_blob_record(MARIA_HA *info, MARIA_RECORD_POS pos, { uchar *rec_buff; int error; - ulong reclength,extra; + ulong reclength,reclength2,extra; extra= (ALIGN_SIZE(MARIA_MAX_DYN_BLOCK_HEADER)+MARIA_SPLIT_LENGTH+ MARIA_DYN_DELETE_BLOCK_HEADER); @@ -293,11 +293,12 @@ my_bool _ma_update_blob_record(MARIA_HA *info, MARIA_RECORD_POS pos, my_errno= HA_ERR_OUT_OF_MEM; /* purecov: inspected */ return(1); } - reclength= _ma_rec_pack(info,rec_buff+ALIGN_SIZE(MARIA_MAX_DYN_BLOCK_HEADER), + reclength2= _ma_rec_pack(info,rec_buff+ALIGN_SIZE(MARIA_MAX_DYN_BLOCK_HEADER), record); + DBUG_ASSERT(reclength2 <= reclength); error=update_dynamic_record(info,pos, rec_buff+ALIGN_SIZE(MARIA_MAX_DYN_BLOCK_HEADER), - reclength); + reclength2); my_safe_afree(rec_buff, reclength); return(error != 0); } diff --git a/storage/maria/ma_extra.c b/storage/maria/ma_extra.c index 6c74bb52f..f3800bc36 100644 --- a/storage/maria/ma_extra.c +++ b/storage/maria/ma_extra.c @@ -345,7 +345,7 @@ int maria_extra(MARIA_HA *info, enum ha_extra_function function, _ma_decrement_open_count(info, 0); if (info->trn) { - _ma_remove_table_from_trnman(share, info->trn); + _ma_remove_table_from_trnman(info); /* Ensure we don't point to the deleted data in trn */ info->state= info->state_start= &share->state.state; } @@ -408,7 +408,7 @@ int maria_extra(MARIA_HA *info, enum ha_extra_function function, if (info->trn) { mysql_mutex_lock(&share->intern_lock); - _ma_remove_table_from_trnman(share, info->trn); + _ma_remove_table_from_trnman(info); /* Ensure we don't point to the deleted data in trn */ info->state= info->state_start= &share->state.state; mysql_mutex_unlock(&share->intern_lock); diff --git a/storage/maria/ma_loghandler.c b/storage/maria/ma_loghandler.c index 129770249..aa7ff9da7 100644 --- a/storage/maria/ma_loghandler.c +++ b/storage/maria/ma_loghandler.c @@ -935,7 +935,7 @@ static File create_logfile_by_number_no_cache(uint32 file_no) /* TODO: add O_DIRECT to open flags (when buffer is aligned) */ if ((file= mysql_file_create(key_file_translog, translog_filename_by_fileno(file_no, path), - 0, O_BINARY | O_RDWR, MYF(MY_WME))) < 0) + 0, O_BINARY | O_RDWR | O_CLOEXEC, MYF(MY_WME))) < 0) { DBUG_PRINT("error", ("Error %d during creating file '%s'", errno, path)); translog_stop_writing(); @@ -973,7 +973,7 @@ static File open_logfile_by_number_no_cache(uint32 file_no) /* TODO: use mysql_file_create() */ if ((file= mysql_file_open(key_file_translog, translog_filename_by_fileno(file_no, path), - log_descriptor.open_flags, + log_descriptor.open_flags | O_CLOEXEC, MYF(MY_WME))) < 0) { DBUG_PRINT("error", ("Error %d during opening file '%s'", errno, path)); @@ -3243,7 +3243,7 @@ static my_bool translog_get_last_page_addr(TRANSLOG_ADDRESS *addr, File fd; if ((fd= mysql_file_open(key_file_translog, translog_filename_by_fileno(file_no, path), - O_RDONLY, (no_errors ? MYF(0) : MYF(MY_WME)))) < 0) + O_RDONLY | O_CLOEXEC, (no_errors ? MYF(0) : MYF(MY_WME)))) < 0) { my_errno= errno; DBUG_PRINT("error", ("Error %d during opening file #%d", diff --git a/storage/maria/ma_open.c b/storage/maria/ma_open.c index c4a7df444..598f76a64 100644 --- a/storage/maria/ma_open.c +++ b/storage/maria/ma_open.c @@ -19,6 +19,8 @@ #include "ma_sp_defs.h" #include "ma_rt_index.h" #include "ma_blockrec.h" +#include "trnman.h" +#include "ma_trnman.h" #include #include "ma_crypt.h" @@ -184,7 +186,7 @@ static MARIA_HA *maria_clone_internal(MARIA_SHARE *share, if (!share->base.born_transactional) /* For transactional ones ... */ { /* ... force crash if no trn given */ - _ma_set_trn_for_table(&info, &dummy_transaction_object); + _ma_set_tmp_trn_for_table(&info, &dummy_transaction_object); info.state= &share->state.state; /* Change global values by default */ } else @@ -332,13 +334,13 @@ MARIA_HA *maria_open(const char *name, int mode, uint open_flags) }); DEBUG_SYNC_C("mi_open_kfile"); if ((kfile=mysql_file_open(key_file_kfile, name_buff, - (open_mode=O_RDWR) | O_SHARE | O_NOFOLLOW, + (open_mode=O_RDWR) | O_SHARE | O_NOFOLLOW | O_CLOEXEC, MYF(MY_NOSYMLINKS))) < 0) { if ((errno != EROFS && errno != EACCES) || mode != O_RDONLY || (kfile=mysql_file_open(key_file_kfile, name_buff, - (open_mode=O_RDONLY) | O_SHARE | O_NOFOLLOW, + (open_mode=O_RDONLY) | O_SHARE | O_NOFOLLOW | O_CLOEXEC, MYF(MY_NOSYMLINKS))) < 0) goto err; } @@ -1940,7 +1942,7 @@ int _ma_open_datafile(MARIA_HA *info, MARIA_SHARE *share) DEBUG_SYNC_C("mi_open_datafile"); info->dfile.file= share->bitmap.file.file= mysql_file_open(key_file_dfile, share->data_file_name.str, - share->mode | O_SHARE, MYF(flags)); + share->mode | O_SHARE | O_CLOEXEC, MYF(flags)); return info->dfile.file >= 0 ? 0 : 1; } @@ -1954,7 +1956,7 @@ int _ma_open_keyfile(MARIA_SHARE *share) mysql_mutex_lock(&share->intern_lock); share->kfile.file= mysql_file_open(key_file_kfile, share->unique_file_name.str, - share->mode | O_SHARE | O_NOFOLLOW, + share->mode | O_SHARE | O_NOFOLLOW | O_CLOEXEC, MYF(MY_WME | MY_NOSYMLINKS)); mysql_mutex_unlock(&share->intern_lock); return (share->kfile.file < 0); diff --git a/storage/maria/ma_recovery.c b/storage/maria/ma_recovery.c index b0b547a30..c06e46c10 100644 --- a/storage/maria/ma_recovery.c +++ b/storage/maria/ma_recovery.c @@ -3520,6 +3520,14 @@ void _ma_tmp_disable_logging_for_table(MARIA_HA *info, { MARIA_SHARE *share= info->s; DBUG_ENTER("_ma_tmp_disable_logging_for_table"); + + /* + We have to ensure that bitmap is flushed, as it's checking + that share->now_transactional is set + */ + if (share->now_transactional && share->data_file_type == BLOCK_RECORD) + _ma_bitmap_flush_all(share); + if (log_incomplete) { uchar log_data[FILEID_STORE_SIZE]; @@ -3583,7 +3591,10 @@ my_bool _ma_reenable_logging_for_table(MARIA_HA *info, my_bool flush_pages) if (share->now_transactional == share->base.born_transactional || !info->switched_transactional) + { + info->switched_transactional= FALSE; DBUG_RETURN(0); + } info->switched_transactional= FALSE; if ((share->now_transactional= share->base.born_transactional)) diff --git a/storage/maria/ma_state.c b/storage/maria/ma_state.c index 7404fe066..aeefd9aa1 100644 --- a/storage/maria/ma_state.c +++ b/storage/maria/ma_state.c @@ -66,7 +66,7 @@ my_bool _ma_setup_live_state(MARIA_HA *info) DBUG_RETURN(1); trn= info->trn; - for (tables= (MARIA_USED_TABLES*) info->trn->used_tables; + for (tables= (MARIA_USED_TABLES*) trn->used_tables; tables; tables= tables->next) { @@ -551,6 +551,7 @@ my_bool _ma_trnman_end_trans_hook(TRN *trn, my_bool commit, my_free(tables); } trn->used_tables= 0; + trn->used_instances= 0; DBUG_RETURN(error); } @@ -565,18 +566,25 @@ my_bool _ma_trnman_end_trans_hook(TRN *trn, my_bool commit, share->internal_lock must be locked when function is called */ -void _ma_remove_table_from_trnman(MARIA_SHARE *share, TRN *trn) +void _ma_remove_table_from_trnman(MARIA_HA *info) { + MARIA_SHARE *share= info->s; + TRN *trn= info->trn; MARIA_USED_TABLES *tables, **prev; + MARIA_HA *handler, **prev_file; DBUG_ENTER("_ma_remove_table_from_trnman"); DBUG_PRINT("enter", ("trn: %p used_tables: %p share: %p in_trans: %d", trn, trn->used_tables, share, share->in_trans)); mysql_mutex_assert_owner(&share->intern_lock); + + if (trn == &dummy_transaction_object) + DBUG_VOID_RETURN; - for (prev= (MARIA_USED_TABLES**) (char*) &trn->used_tables, tables= *prev; - tables; - tables= *prev) + /* First remove share from used_tables */ + for (prev= (MARIA_USED_TABLES**) (char*) &trn->used_tables; + (tables= *prev); + prev= &tables->next) { if (tables->share == share) { @@ -585,8 +593,36 @@ void _ma_remove_table_from_trnman(MARIA_SHARE *share, TRN *trn) my_free(tables); break; } - prev= &tables->next; } + if (tables != 0) + { + /* + This can only happens in case of rename of intermediate table as + part of alter table + */ + DBUG_PRINT("warning", ("share: %p where not in used_tables_list", share)); + } + + /* unlink table from used_instances */ + for (prev_file= (MARIA_HA**) &trn->used_instances; + (handler= *prev_file); + prev_file= &handler->trn_next) + { + if (handler == info) + { + *prev_file= info->trn_next; + break; + } + } + if (handler != 0) + { + /* + This can only happens in case of rename of intermediate table as + part of alter table + */ + DBUG_PRINT("warning", ("table: %p where not in used_instances", info)); + } + info->trn= 0; /* Not part of trans anymore */ DBUG_VOID_RETURN; } diff --git a/storage/maria/ma_state.h b/storage/maria/ma_state.h index a86aada94..8728a2113 100644 --- a/storage/maria/ma_state.h +++ b/storage/maria/ma_state.h @@ -84,5 +84,5 @@ my_bool _ma_row_visible_non_transactional_table(MARIA_HA *info); my_bool _ma_row_visible_transactional_table(MARIA_HA *info); void _ma_remove_not_visible_states_with_lock(struct st_maria_share *share, my_bool all); -void _ma_remove_table_from_trnman(struct st_maria_share *share, TRN *trn); +void _ma_remove_table_from_trnman(MARIA_HA *info); void _ma_reset_history(struct st_maria_share *share); diff --git a/storage/maria/ma_trnman.h b/storage/maria/ma_trnman.h new file mode 100644 index 000000000..9bfd1f0d0 --- /dev/null +++ b/storage/maria/ma_trnman.h @@ -0,0 +1,65 @@ +/* Copyright (C) 2006-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 + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#ifndef _ma_trnman_h +#define _ma_trnman_h + +/** + Sets table's trn and prints debug information + Links table into used_instances if new_trn is not 0 + + @param tbl MARIA_HA of table + @param newtrn what to put into tbl->trn +*/ + +static inline void _ma_set_trn_for_table(MARIA_HA *tbl, TRN *newtrn) +{ + DBUG_PRINT("info",("table: %p trn: %p -> %p", + tbl, tbl->trn, newtrn)); + + /* check that we are not calling this twice in a row */ + DBUG_ASSERT(newtrn->used_instances != (void*) tbl); + + tbl->trn= newtrn; + /* Link into used list */ + tbl->trn_next= (MARIA_HA*) newtrn->used_instances; + newtrn->used_instances= tbl; +} + + +/* + Same as _ma_set_trn_for_table(), but don't link table into used_instance list + Used when we want to temporary set trn for a table in extra() +*/ + +static inline void _ma_set_tmp_trn_for_table(MARIA_HA *tbl, TRN *newtrn) +{ + DBUG_PRINT("info",("table: %p trn: %p -> %p", + tbl, tbl->trn, newtrn)); + tbl->trn= newtrn; +} + + +/* + Reset TRN in table +*/ + +static inline void _ma_reset_trn_for_table(MARIA_HA *tbl) +{ + DBUG_PRINT("info",("table: %p trn: %p -> NULL", tbl, tbl->trn)); + tbl->trn= 0; +} + +#endif /* _ma_trnman_h */ diff --git a/storage/maria/maria_chk.c b/storage/maria/maria_chk.c index aa01f4cd8..b47f1b8c8 100644 --- a/storage/maria/maria_chk.c +++ b/storage/maria/maria_chk.c @@ -895,7 +895,7 @@ static void get_options(register int *argc,register char ***argv) { int ho_error; - load_defaults("my", load_default_groups, argc, argv); + load_defaults_or_exit("my", load_default_groups, argc, argv); default_argv= *argv; check_param.testflag= T_UPDATE_STATE; if (isatty(fileno(stdout))) diff --git a/storage/maria/maria_def.h b/storage/maria/maria_def.h index d57a42936..8262e1b5e 100644 --- a/storage/maria/maria_def.h +++ b/storage/maria/maria_def.h @@ -331,7 +331,10 @@ typedef struct st_maria_file_bitmap pgcache_page_no_t last_bitmap_page; /* Last possible bitmap page */ my_bool changed; /* 1 if page needs to be written */ my_bool changed_not_flushed; /* 1 if some bitmap is not flushed */ + my_bool return_first_match; /* Shortcut find_head() */ uint used_size; /* Size of bitmap head that is not 0 */ + uint full_head_size; /* Where to start search for head */ + uint full_tail_size; /* Where to start search for tail */ uint flush_all_requested; /**< If _ma_bitmap_flush_all waiting */ uint waiting_for_flush_all_requested; /* If someone is waiting for above */ uint non_flushable; /**< 0 if bitmap and log are in sync */ @@ -598,6 +601,7 @@ struct st_maria_handler { MARIA_SHARE *s; /* Shared between open:s */ struct st_ma_transaction *trn; /* Pointer to active transaction */ + struct st_maria_handler *trn_next; MARIA_STATUS_INFO *state, state_save; MARIA_STATUS_INFO *state_start; /* State at start of transaction */ MARIA_USED_TABLES *used_tables; @@ -857,19 +861,6 @@ struct st_maria_handler #define get_pack_length(length) ((length) >= 255 ? 3 : 1) #define _ma_have_versioning(info) ((info)->row_flag & ROW_FLAG_TRANSID) -/** - Sets table's trn and prints debug information - @param tbl MARIA_HA of table - @param newtrn what to put into tbl->trn - @note cast of newtrn is because %p of NULL gives warning (NULL is int) -*/ -#define _ma_set_trn_for_table(tbl, newtrn) do { \ - DBUG_PRINT("info",("table: %p trn: %p -> %p", \ - (tbl), (tbl)->trn, (void *)(newtrn))); \ - (tbl)->trn= (newtrn); \ - } while (0) - - #define MARIA_MIN_BLOCK_LENGTH 20 /* Because of delete-link */ /* Don't use to small record-blocks */ #define MARIA_EXTEND_BLOCK_LENGTH 20 diff --git a/storage/maria/maria_dump_log.c b/storage/maria/maria_dump_log.c index 42c694bf1..3570dede8 100644 --- a/storage/maria/maria_dump_log.c +++ b/storage/maria/maria_dump_log.c @@ -133,7 +133,7 @@ int main(int argc, char **argv) uchar buffer[TRANSLOG_PAGE_SIZE]; MY_INIT(argv[0]); - load_defaults("my", load_default_groups, &argc, &argv); + load_defaults_or_exit("my", load_default_groups, &argc, &argv); default_argv= argv; get_options(&argc, &argv); diff --git a/storage/maria/maria_pack.c b/storage/maria/maria_pack.c index 814c50e1d..28b4ff4cf 100644 --- a/storage/maria/maria_pack.c +++ b/storage/maria/maria_pack.c @@ -208,7 +208,7 @@ int main(int argc, char **argv) char **default_argv; MY_INIT(argv[0]); - load_defaults("my",load_default_groups,&argc,&argv); + load_defaults_or_exit("my", load_default_groups, &argc, &argv); default_argv= argv; get_options(&argc,&argv); maria_init(); diff --git a/storage/maria/maria_read_log.c b/storage/maria/maria_read_log.c index a0724b219..d0cf7521e 100644 --- a/storage/maria/maria_read_log.c +++ b/storage/maria/maria_read_log.c @@ -47,7 +47,7 @@ int main(int argc, char **argv) maria_data_root= (char *)"."; sf_leaking_memory=1; /* don't report memory leaks on early exits */ - load_defaults("my", load_default_groups, &argc, &argv); + load_defaults_or_exit("my", load_default_groups, &argc, &argv); default_argv= argv; get_options(&argc, &argv); diff --git a/storage/maria/trnman.c b/storage/maria/trnman.c index bc48d39ba..5b3c9f028 100644 --- a/storage/maria/trnman.c +++ b/storage/maria/trnman.c @@ -357,6 +357,7 @@ TRN *trnman_new_trn(WT_THD *wt) trn->commit_trid= MAX_TRID; trn->rec_lsn= trn->undo_lsn= trn->first_undo_lsn= 0; trn->used_tables= 0; + trn->used_instances= 0; trn->locked_tables= 0; trn->flags= 0; diff --git a/storage/maria/trnman.h b/storage/maria/trnman.h index 66139a312..11c737977 100644 --- a/storage/maria/trnman.h +++ b/storage/maria/trnman.h @@ -46,7 +46,8 @@ struct st_ma_transaction LF_PINS *pins; WT_THD *wt; mysql_mutex_t state_lock; - void *used_tables; /**< Tables used by transaction */ + void *used_tables; /**< Table shares used by transaction */ + void *used_instances; /* table files used by transaction */ TRN *next, *prev; TrID trid, min_read_from, commit_trid; LSN rec_lsn, undo_lsn; diff --git a/storage/maria/unittest/ma_test_loghandler_multigroup-t.c b/storage/maria/unittest/ma_test_loghandler_multigroup-t.c index 1ea31d228..dc7e0c79f 100644 --- a/storage/maria/unittest/ma_test_loghandler_multigroup-t.c +++ b/storage/maria/unittest/ma_test_loghandler_multigroup-t.c @@ -256,7 +256,7 @@ int main(int argc __attribute__((unused)), char *argv[]) #endif long_buffer= malloc(LONG_BUFFER_SIZE + LSN_STORE_SIZE * 2 + 2); - load_defaults("my", load_default_groups, &argc, &argv); + load_defaults_or_exit("my", load_default_groups, &argc, &argv); default_argv= argv; get_options(&argc, &argv); diff --git a/storage/mroonga/CMakeLists.txt b/storage/mroonga/CMakeLists.txt index 5d8e8c1ee..5a7d46993 100644 --- a/storage/mroonga/CMakeLists.txt +++ b/storage/mroonga/CMakeLists.txt @@ -315,6 +315,9 @@ if(MRN_BUNDLED) ${MRN_ALL_SOURCES} STORAGE_ENGINE MODULE_ONLY LINK_LIBRARIES ${MRN_LIBRARIES}) + if(NOT TARGET mroonga) + return() + endif() else() add_library(mroonga MODULE ${MRN_ALL_SOURCES}) diff --git a/storage/mroonga/vendor/groonga/CMakeLists.txt b/storage/mroonga/vendor/groonga/CMakeLists.txt index e27070f9e..ee526646c 100644 --- a/storage/mroonga/vendor/groonga/CMakeLists.txt +++ b/storage/mroonga/vendor/groonga/CMakeLists.txt @@ -361,10 +361,18 @@ if(NOT ${GRN_WITH_LZ4} STREQUAL "no") pkg_check_modules(LIBLZ4 liblz4) endif() if(LIBLZ4_FOUND) + # According to CMake documentation, this is the recommended way to force + # looking in LIBRARY_DIRS first and in regular system paths otherwise. + # + # pkg_check_modules does not guarantee that LIBLZ4_LIBRARY_DIRS will be + # set. If it's not set we won't find the library without looking through + # the regular system paths. find_library(LZ4_LIBS - NAMES ${LIBLZ4_LIBRARIES} - PATHS ${LIBLZ4_LIBRARY_DIRS} - NO_DEFAULT_PATH) + NAMES ${LIBLZ4_LIBRARIES} + PATHS ${LIBLZ4_LIBRARY_DIRS} + NO_DEFAULT_PATH) + find_library(LZ4_LIBS + NAMES ${LIBLZ4_LIBRARIES}) set(GRN_WITH_LZ4 TRUE) else() if(${GRN_WITH_LZ4} STREQUAL "yes") diff --git a/storage/mroonga/vendor/groonga/lib/CMakeLists.txt b/storage/mroonga/vendor/groonga/lib/CMakeLists.txt index 6765261fe..64fadb8bb 100644 --- a/storage/mroonga/vendor/groonga/lib/CMakeLists.txt +++ b/storage/mroonga/vendor/groonga/lib/CMakeLists.txt @@ -177,3 +177,9 @@ if(GRN_WITH_MRUBY) FILES ${EXPRESSION_TREE_RUBY_SCRIPTS} DESTINATION "${GRN_RELATIVE_RUBY_SCRIPTS_DIR}/expression_tree") endif() + +# Workaround GCC ICE on ARM64 +IF(CMAKE_COMPILER_IS_GNUCXX AND CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64" AND + CMAKE_C_COMPILER_VERSION VERSION_GREATER "5") + ADD_COMPILE_FLAGS(ts/ts_expr_node.c COMPILE_FLAGS "-fno-tree-loop-vectorize") +ENDIF() diff --git a/storage/myisam/ha_myisam.cc b/storage/myisam/ha_myisam.cc index 7f2afc313..92888e032 100644 --- a/storage/myisam/ha_myisam.cc +++ b/storage/myisam/ha_myisam.cc @@ -2470,7 +2470,7 @@ maria_declare_plugin(myisam) &myisam_storage_engine, "MyISAM", "MySQL AB", - "MyISAM storage engine", + "Non-transactional engine with good performance and small data footprint", PLUGIN_LICENSE_GPL, myisam_init, /* Plugin Init */ NULL, /* Plugin Deinit */ diff --git a/storage/myisam/mi_open.c b/storage/myisam/mi_open.c index a82f2b9e8..e692f31b2 100644 --- a/storage/myisam/mi_open.c +++ b/storage/myisam/mi_open.c @@ -139,13 +139,13 @@ MI_INFO *mi_open(const char *name, int mode, uint open_flags) DEBUG_SYNC_C("mi_open_kfile"); if ((kfile= mysql_file_open(mi_key_file_kfile, name_buff, - (open_mode= O_RDWR) | O_SHARE | O_NOFOLLOW, + (open_mode= O_RDWR) | O_SHARE | O_NOFOLLOW | O_CLOEXEC, MYF(MY_NOSYMLINKS))) < 0) { if ((errno != EROFS && errno != EACCES) || mode != O_RDONLY || (kfile= mysql_file_open(mi_key_file_kfile, name_buff, - (open_mode= O_RDONLY) | O_SHARE| O_NOFOLLOW, + (open_mode= O_RDONLY) | O_SHARE| O_NOFOLLOW | O_CLOEXEC, MYF(MY_NOSYMLINKS))) < 0) goto err; } @@ -1273,7 +1273,7 @@ int mi_open_datafile(MI_INFO *info, MYISAM_SHARE *share) myf flags= MY_WME | (share->mode & O_NOFOLLOW ? MY_NOSYMLINKS: 0); DEBUG_SYNC_C("mi_open_datafile"); info->dfile= mysql_file_open(mi_key_file_dfile, share->data_file_name, - share->mode | O_SHARE, MYF(flags)); + share->mode | O_SHARE | O_CLOEXEC, MYF(flags)); return info->dfile >= 0 ? 0 : 1; } @@ -1282,7 +1282,7 @@ int mi_open_keyfile(MYISAM_SHARE *share) { if ((share->kfile= mysql_file_open(mi_key_file_kfile, share->unique_file_name, - share->mode | O_SHARE | O_NOFOLLOW, + share->mode | O_SHARE | O_NOFOLLOW | O_CLOEXEC, MYF(MY_NOSYMLINKS | MY_WME))) < 0) return 1; return 0; diff --git a/storage/myisam/myisamchk.c b/storage/myisam/myisamchk.c index edbe235e1..dfff57208 100644 --- a/storage/myisam/myisamchk.c +++ b/storage/myisam/myisamchk.c @@ -753,9 +753,7 @@ static void get_options(register int *argc,register char ***argv) { int ho_error; - if (load_defaults("my", load_default_groups, argc, argv)) - exit(1); - + load_defaults_or_exit("my", load_default_groups, argc, argv); default_argv= *argv; if (isatty(fileno(stdout))) check_param.testflag|=T_WRITE_LOOP; diff --git a/storage/myisam/myisampack.c b/storage/myisam/myisampack.c index 966edc877..bb9f59f86 100644 --- a/storage/myisam/myisampack.c +++ b/storage/myisam/myisampack.c @@ -209,9 +209,7 @@ int main(int argc, char **argv) char **default_argv; MY_INIT(argv[0]); - if (load_defaults("my",load_default_groups,&argc,&argv)) - exit(1); - + load_defaults_or_exit("my", load_default_groups, &argc, &argv); default_argv= argv; get_options(&argc,&argv); diff --git a/storage/oqgraph/graphcore-config.h b/storage/oqgraph/graphcore-config.h index 2afb7dfbc..3ef9da152 100644 --- a/storage/oqgraph/graphcore-config.h +++ b/storage/oqgraph/graphcore-config.h @@ -27,6 +27,8 @@ #define BOOST_ALL_NO_LIB 1 #define BOOST_NO_RTTI 1 #define BOOST_NO_TYPEID 1 +#define BOOST_NO_HASH 1 +#define BOOST_NO_SLIST 1 #ifdef DBUG_OFF #define NDEBUG 1 diff --git a/storage/oqgraph/graphcore-graph.cc b/storage/oqgraph/graphcore-graph.cc index 6decce601..423667873 100644 --- a/storage/oqgraph/graphcore-graph.cc +++ b/storage/oqgraph/graphcore-graph.cc @@ -22,6 +22,5 @@ ====================================================================== */ -#include "graphcore-config.h" #include "graphcore-graph.h" diff --git a/storage/oqgraph/graphcore.cc b/storage/oqgraph/graphcore.cc index bf454aa33..1a7df6147 100644 --- a/storage/oqgraph/graphcore.cc +++ b/storage/oqgraph/graphcore.cc @@ -25,7 +25,6 @@ #include #include -#include "graphcore-config.h" #include "graphcore-graph.h" #include diff --git a/storage/oqgraph/oqgraph_shim.h b/storage/oqgraph/oqgraph_shim.h index f24732af4..aab6e7973 100644 --- a/storage/oqgraph/oqgraph_shim.h +++ b/storage/oqgraph/oqgraph_shim.h @@ -24,11 +24,8 @@ #pragma once -#include "oqgraph_thunk.h" #include "oqgraph_judy.h" - -#define BOOST_NO_HASH 1 -#define BOOST_NO_SLIST 1 +#include "oqgraph_thunk.h" #include #include diff --git a/storage/perfschema/ha_perfschema.cc b/storage/perfschema/ha_perfschema.cc index 971f0c46b..cdbbc022d 100644 --- a/storage/perfschema/ha_perfschema.cc +++ b/storage/perfschema/ha_perfschema.cc @@ -225,7 +225,7 @@ maria_declare_plugin(perfschema) 0x0001, pfs_status_vars, NULL, - "5.6.36", + "5.6.40", MariaDB_PLUGIN_MATURITY_STABLE } maria_declare_plugin_end; diff --git a/storage/sphinx/ha_sphinx.cc b/storage/sphinx/ha_sphinx.cc index 5308f780e..3f6770b5d 100644 --- a/storage/sphinx/ha_sphinx.cc +++ b/storage/sphinx/ha_sphinx.cc @@ -17,7 +17,7 @@ #pragma implementation // gcc: Class implementation #endif -#if _MSC_VER>=1400 +#if defined(_MSC_VER) && _MSC_VER>=1400 #define _CRT_SECURE_NO_DEPRECATE 1 #define _CRT_NONSTDC_NO_DEPRECATE 1 #endif @@ -64,7 +64,7 @@ #define MSG_WAITALL 0 #endif -#if _MSC_VER>=1400 +#if defined(_MSC_VER) && _MSC_VER>=1400 #pragma warning(push,4) #endif @@ -1041,8 +1041,8 @@ static bool ParseUrl ( CSphSEShare * share, TABLE * table, bool bCreate ) bool bOk = true; bool bQL = false; char * sScheme = NULL; - char * sHost = SPHINXAPI_DEFAULT_HOST; - char * sIndex = SPHINXAPI_DEFAULT_INDEX; + char * sHost = (char*) SPHINXAPI_DEFAULT_HOST; + char * sIndex = (char*) SPHINXAPI_DEFAULT_INDEX; int iPort = SPHINXAPI_DEFAULT_PORT; // parse connection string, if any @@ -1068,12 +1068,12 @@ static bool ParseUrl ( CSphSEShare * share, TABLE * table, bool bCreate ) sHost--; // reuse last slash iPort = 0; if (!( sIndex = strrchr ( sHost, ':' ) )) - sIndex = SPHINXAPI_DEFAULT_INDEX; + sIndex = (char*) SPHINXAPI_DEFAULT_INDEX; else { *sIndex++ = '\0'; if ( !*sIndex ) - sIndex = SPHINXAPI_DEFAULT_INDEX; + sIndex = (char*) SPHINXAPI_DEFAULT_INDEX; } bOk = true; break; @@ -1095,7 +1095,7 @@ static bool ParseUrl ( CSphSEShare * share, TABLE * table, bool bCreate ) if ( sIndex ) *sIndex++ = '\0'; else - sIndex = SPHINXAPI_DEFAULT_INDEX; + sIndex = (char*) SPHINXAPI_DEFAULT_INDEX; iPort = atoi(sPort); if ( !iPort ) @@ -1107,7 +1107,7 @@ static bool ParseUrl ( CSphSEShare * share, TABLE * table, bool bCreate ) if ( sIndex ) *sIndex++ = '\0'; else - sIndex = SPHINXAPI_DEFAULT_INDEX; + sIndex = (char*) SPHINXAPI_DEFAULT_INDEX; } bOk = true; break; @@ -1303,8 +1303,8 @@ CSphSEQuery::CSphSEQuery ( const char * sQuery, int iLength, const char * sIndex , m_sGeoLongAttr ( "" ) , m_fGeoLatitude ( 0.0f ) , m_fGeoLongitude ( 0.0f ) - , m_sComment ( "" ) - , m_sSelect ( "*" ) + , m_sComment ( (char*) "" ) + , m_sSelect ( (char*) "*" ) , m_pBuf ( NULL ) , m_pCur ( NULL ) @@ -1738,7 +1738,7 @@ bool CSphSEQuery::ParseField ( char * sField ) } } else if ( !strcmp ( sName, "override" ) ) // name,type,id:value,id:value,... { - char * sName = NULL; + sName = NULL; int iType = 0; CSphSEQuery::Override_t * pOverride = NULL; @@ -1794,7 +1794,7 @@ bool CSphSEQuery::ParseField ( char * sField ) *sRest++ = '\0'; if (!( sRest - sId )) break; - char * sValue = sRest; + sValue = sRest; if ( ( sRest = strchr ( sRest, ',' ) )!=NULL ) *sRest++ = '\0'; if ( !*sValue ) @@ -2213,7 +2213,7 @@ int ha_sphinx::Connect ( const char * sHost, ushort uPort ) } char sError[512]; - int iSocket = socket ( iDomain, SOCK_STREAM, 0 ); + int iSocket = (int) socket ( iDomain, SOCK_STREAM, 0 ); if ( iSocket<0 ) { @@ -2538,12 +2538,6 @@ char * ha_sphinx::UnpackString () } -static inline const char * FixNull ( const char * s ) -{ - return s ? s : "(null)"; -} - - bool ha_sphinx::UnpackSchema () { SPH_ENTER_METHOD(); @@ -2674,7 +2668,7 @@ bool ha_sphinx::UnpackStats ( CSphSEStats * pStats ) assert ( pStats ); char * pCurSave = m_pCur; - for ( uint i=0; istore ( sBuf, pCur-sBuf, &my_charset_bin ); + af->store ( sBuf, uint(pCur-sBuf), &my_charset_bin ); } break; @@ -3386,39 +3380,39 @@ ha_rows ha_sphinx::records_in_range ( uint, key_range *, key_range * ) // currently provided for doing that. // // Called from handle.cc by ha_create_table(). -int ha_sphinx::create ( const char * name, TABLE * table, HA_CREATE_INFO * ) +int ha_sphinx::create ( const char * name, TABLE * table_arg, HA_CREATE_INFO * ) { SPH_ENTER_METHOD(); char sError[256]; CSphSEShare tInfo; - if ( !ParseUrl ( &tInfo, table, true ) ) + if ( !ParseUrl ( &tInfo, table_arg, true ) ) SPH_RET(-1); // check SphinxAPI table for ( ; !tInfo.m_bSphinxQL; ) { // check system fields (count and types) - if ( table->s->fieldss->fieldsfield[0] ) ) + if ( !IsIDField ( table_arg->field[0] ) ) { my_snprintf ( sError, sizeof(sError), "%s: 1st column (docid) MUST be unsigned integer or bigint", name ); break; } - if ( !IsIntegerFieldType ( table->field[1]->type() ) ) + if ( !IsIntegerFieldType ( table_arg->field[1]->type() ) ) { my_snprintf ( sError, sizeof(sError), "%s: 2nd column (weight) MUST be integer or bigint", name ); break; } - enum_field_types f2 = table->field[2]->type(); + enum_field_types f2 = table_arg->field[2]->type(); if ( f2!=MYSQL_TYPE_VARCHAR && f2!=MYSQL_TYPE_BLOB && f2!=MYSQL_TYPE_MEDIUM_BLOB && f2!=MYSQL_TYPE_LONG_BLOB && f2!=MYSQL_TYPE_TINY_BLOB ) { @@ -3428,28 +3422,28 @@ int ha_sphinx::create ( const char * name, TABLE * table, HA_CREATE_INFO * ) // check attributes int i; - for ( i=3; i<(int)table->s->fields; i++ ) + for ( i=3; i<(int)table_arg->s->fields; i++ ) { - enum_field_types eType = table->field[i]->type(); + enum_field_types eType = table_arg->field[i]->type(); if ( eType!=MYSQL_TYPE_TIMESTAMP && !IsIntegerFieldType(eType) && eType!=MYSQL_TYPE_VARCHAR && eType!=MYSQL_TYPE_FLOAT ) { my_snprintf ( sError, sizeof(sError), "%s: %dth column (attribute %s) MUST be integer, bigint, timestamp, varchar, or float", - name, i+1, table->field[i]->field_name ); + name, i+1, table_arg->field[i]->field_name ); break; } } - if ( i!=(int)table->s->fields ) + if ( i!=(int)table_arg->s->fields ) break; // check index if ( - table->s->keys!=1 || - table->key_info[0].user_defined_key_parts!=1 || - strcasecmp ( table->key_info[0].key_part[0].field->field_name, table->field[2]->field_name ) ) + table_arg->s->keys!=1 || + table_arg->key_info[0].user_defined_key_parts!=1 || + strcasecmp ( table_arg->key_info[0].key_part[0].field->field_name, table->field[2]->field_name ) ) { my_snprintf ( sError, sizeof(sError), "%s: there must be an index on '%s' column", - name, table->field[2]->field_name ); + name, table_arg->field[2]->field_name ); break; } @@ -3464,13 +3458,13 @@ int ha_sphinx::create ( const char * name, TABLE * table, HA_CREATE_INFO * ) sError[0] = '\0'; // check that 1st column is id, is of int type, and has an index - if ( strcmp ( table->field[0]->field_name, "id" ) ) + if ( strcmp ( table_arg->field[0]->field_name, "id" ) ) { my_snprintf ( sError, sizeof(sError), "%s: 1st column must be called 'id'", name ); break; } - if ( !IsIDField ( table->field[0] ) ) + if ( !IsIDField ( table_arg->field[0] ) ) { my_snprintf ( sError, sizeof(sError), "%s: 'id' column must be INT UNSIGNED or BIGINT", name ); break; @@ -3478,22 +3472,22 @@ int ha_sphinx::create ( const char * name, TABLE * table, HA_CREATE_INFO * ) // check index if ( - table->s->keys!=1 || - table->key_info[0].user_defined_key_parts!=1 || - strcasecmp ( table->key_info[0].key_part[0].field->field_name, "id" ) ) + table_arg->s->keys!=1 || + table_arg->key_info[0].user_defined_key_parts!=1 || + strcasecmp ( table_arg->key_info[0].key_part[0].field->field_name, "id" ) ) { my_snprintf ( sError, sizeof(sError), "%s: 'id' column must be indexed", name ); break; } // check column types - for ( int i=1; i<(int)table->s->fields; i++ ) + for ( int i=1; i<(int)table_arg->s->fields; i++ ) { - enum_field_types eType = table->field[i]->type(); + enum_field_types eType = table_arg->field[i]->type(); if ( eType!=MYSQL_TYPE_TIMESTAMP && !IsIntegerFieldType(eType) && eType!=MYSQL_TYPE_VARCHAR && eType!=MYSQL_TYPE_FLOAT ) { my_snprintf ( sError, sizeof(sError), "%s: column %d(%s) is of unsupported type (use int/bigint/timestamp/varchar/float)", - name, i+1, table->field[i]->field_name ); + name, i+1, table_arg->field[i]->field_name ); break; } } @@ -3507,8 +3501,11 @@ int ha_sphinx::create ( const char * name, TABLE * table, HA_CREATE_INFO * ) // report and bail if ( sError[0] ) { - my_error ( ER_CANT_CREATE_TABLE, MYF(0), - table->s->db.str, table->s->table_name, sError ); + my_printf_error(ER_CANT_CREATE_TABLE, + "Can\'t create table %s.%s (Error: %s)", + MYF(0), + table_arg->s->db.str, + table_arg->s->table_name.str, sError); SPH_RET(-1); } diff --git a/storage/sphinx/snippets_udf.cc b/storage/sphinx/snippets_udf.cc index 2a290bd8d..ea8246c46 100644 --- a/storage/sphinx/snippets_udf.cc +++ b/storage/sphinx/snippets_udf.cc @@ -178,10 +178,10 @@ enum SEARCHD_WARNING = 3 ///< general success, warning message and command-specific reply follow }; -#define SPHINXSE_DEFAULT_SCHEME "sphinx" -#define SPHINXSE_DEFAULT_HOST "127.0.0.1" +#define SPHINXSE_DEFAULT_SCHEME (char*) "sphinx" +#define SPHINXSE_DEFAULT_HOST (char*) "127.0.0.1" #define SPHINXSE_DEFAULT_PORT 9312 -#define SPHINXSE_DEFAULT_INDEX "*" +#define SPHINXSE_DEFAULT_INDEX (char*) "*" class CSphBuffer { @@ -447,7 +447,7 @@ int CSphUrl::Connect() uint uServerVersion; uint uClientVersion = htonl ( SPHINX_SEARCHD_PROTO ); int iSocket = -1; - char * pError = NULL; + const char * pError = NULL; do { iSocket = socket ( iDomain, SOCK_STREAM, 0 ); diff --git a/storage/spider/ha_spider.cc b/storage/spider/ha_spider.cc index 7d2924ce8..c559f562e 100644 --- a/storage/spider/ha_spider.cc +++ b/storage/spider/ha_spider.cc @@ -712,7 +712,7 @@ int ha_spider::close() } } - if (!thd || !*thd_ha_data(thd, spider_hton_ptr)) + if (!thd || !thd_get_ha_data(thd, spider_hton_ptr)) { for (roop_count = 0; roop_count < (int) share->link_count; roop_count++) conns[roop_count] = NULL; diff --git a/storage/spider/spd_conn.cc b/storage/spider/spd_conn.cc index fc3d9ecc2..5de41ac0f 100644 --- a/storage/spider/spd_conn.cc +++ b/storage/spider/spd_conn.cc @@ -69,9 +69,6 @@ extern PSI_thread_key spd_key_thd_bg_crd; extern PSI_thread_key spd_key_thd_bg_mon; #endif #endif - -extern pthread_mutex_t spider_global_trx_mutex; -extern SPIDER_TRX *spider_global_trx; #endif HASH spider_open_connections; @@ -2807,9 +2804,6 @@ void *spider_bg_sts_action( DBUG_RETURN(NULL); } share->bg_sts_thd = thd; -/* - spider.trx = spider_global_trx; -*/ spider.trx = trx; spider.share = share; spider.conns = conns; @@ -2922,13 +2916,11 @@ void *spider_bg_sts_action( { if (!conns[spider.search_link_idx]) { - pthread_mutex_lock(&spider_global_trx_mutex); spider_get_conn(share, spider.search_link_idx, share->conn_keys[spider.search_link_idx], - spider_global_trx, &spider, FALSE, FALSE, SPIDER_CONN_KIND_MYSQL, + trx, &spider, FALSE, FALSE, SPIDER_CONN_KIND_MYSQL, &error_num); conns[spider.search_link_idx]->error_mode = 0; - pthread_mutex_unlock(&spider_global_trx_mutex); /* if ( error_num && @@ -2937,7 +2929,7 @@ void *spider_bg_sts_action( ) { lex_start(thd); error_num = spider_ping_table_mon_from_table( - spider_global_trx, + trx, thd, share, (uint32) share->monitoring_sid[spider.search_link_idx], @@ -2958,7 +2950,6 @@ void *spider_bg_sts_action( } if (spider.search_link_idx != -1 && conns[spider.search_link_idx]) { - DBUG_ASSERT(!conns[spider.search_link_idx]->thd); #ifdef WITH_PARTITION_STORAGE_ENGINE if (spider_get_sts(share, spider.search_link_idx, share->bg_sts_try_time, &spider, @@ -2979,7 +2970,7 @@ void *spider_bg_sts_action( ) { lex_start(thd); error_num = spider_ping_table_mon_from_table( - spider_global_trx, + trx, thd, share, (uint32) share->monitoring_sid[spider.search_link_idx], @@ -3192,9 +3183,6 @@ void *spider_bg_crd_action( table.s = share->table_share; table.field = share->table_share->field; table.key_info = share->table_share->key_info; -/* - spider.trx = spider_global_trx; -*/ spider.trx = trx; spider.change_table_ptr(&table, share->table_share); spider.share = share; @@ -3308,13 +3296,11 @@ void *spider_bg_crd_action( { if (!conns[spider.search_link_idx]) { - pthread_mutex_lock(&spider_global_trx_mutex); spider_get_conn(share, spider.search_link_idx, share->conn_keys[spider.search_link_idx], - spider_global_trx, &spider, FALSE, FALSE, SPIDER_CONN_KIND_MYSQL, + trx, &spider, FALSE, FALSE, SPIDER_CONN_KIND_MYSQL, &error_num); conns[spider.search_link_idx]->error_mode = 0; - pthread_mutex_unlock(&spider_global_trx_mutex); /* if ( error_num && @@ -3323,7 +3309,7 @@ void *spider_bg_crd_action( ) { lex_start(thd); error_num = spider_ping_table_mon_from_table( - spider_global_trx, + trx, thd, share, (uint32) share->monitoring_sid[spider.search_link_idx], @@ -3344,7 +3330,6 @@ void *spider_bg_crd_action( } if (spider.search_link_idx != -1 && conns[spider.search_link_idx]) { - DBUG_ASSERT(!conns[spider.search_link_idx]->thd); #ifdef WITH_PARTITION_STORAGE_ENGINE if (spider_get_crd(share, spider.search_link_idx, share->bg_crd_try_time, &spider, &table, @@ -3365,7 +3350,7 @@ void *spider_bg_crd_action( ) { lex_start(thd); error_num = spider_ping_table_mon_from_table( - spider_global_trx, + trx, thd, share, (uint32) share->monitoring_sid[spider.search_link_idx], @@ -3717,7 +3702,7 @@ void *spider_bg_mon_action( { lex_start(thd); error_num = spider_ping_table_mon_from_table( - spider_global_trx, + trx, thd, share, (uint32) share->monitoring_sid[link_idx], diff --git a/storage/spider/spd_db_oracle.cc b/storage/spider/spd_db_oracle.cc index c3dfe8b8c..8d7b91265 100644 --- a/storage/spider/spd_db_oracle.cc +++ b/storage/spider/spd_db_oracle.cc @@ -29,6 +29,10 @@ #endif #ifdef HAVE_ORACLE_OCI +#if (defined(WIN32) || defined(_WIN32) || defined(WINDOWS) || defined(_WINDOWS)) +#include +#define strcasestr StrStr +#endif #include #include "spd_err.h" #include "spd_param.h" @@ -3817,7 +3821,7 @@ int spider_db_oracle_util::open_item_func( { Item_func_conv_charset *item_func_conv_charset = (Item_func_conv_charset *)item_func; - CHARSET_INFO *conv_charset = item_func_conv_charset->conv_charset; + CHARSET_INFO *conv_charset = item_func_conv_charset->collation.collation; uint cset_length = strlen(conv_charset->csname); if (str->reserve(SPIDER_SQL_USING_LEN + cset_length)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); diff --git a/storage/spider/spd_direct_sql.cc b/storage/spider/spd_direct_sql.cc index 8f8928696..5c3ef9cab 100644 --- a/storage/spider/spd_direct_sql.cc +++ b/storage/spider/spd_direct_sql.cc @@ -371,6 +371,14 @@ SPIDER_CONN *spider_udf_direct_sql_create_conn( if (direct_sql->access_mode == 0) { #endif + if (direct_sql->dbton_id == SPIDER_DBTON_SIZE) + { + /* Invalid target wrapper */ + *error_num = ER_SPIDER_INVALID_CONNECT_INFO_NUM; + my_printf_error(*error_num, ER_SPIDER_INVALID_CONNECT_INFO_STR, + MYF(0), direct_sql->tgt_wrapper); + goto error_alloc_conn; + } if (!(conn = (SPIDER_CONN *) spider_bulk_malloc(spider_current_trx, 32, MYF(MY_WME | MY_ZEROFILL), &conn, sizeof(*conn), @@ -398,6 +406,14 @@ SPIDER_CONN *spider_udf_direct_sql_create_conn( conn->default_database.init_calc_mem(138); #if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET) } else { + if (direct_sql->dbton_id == SPIDER_DBTON_SIZE) + { + /* Invalid target wrapper */ + *error_num = ER_SPIDER_NOSQL_WRAPPER_IS_INVALID_NUM; + my_printf_error(*error_num, ER_SPIDER_NOSQL_WRAPPER_IS_INVALID_STR, + MYF(0), direct_sql->tgt_wrapper); + goto error_alloc_conn; + } if (!(conn = (SPIDER_CONN *) spider_bulk_malloc(spider_current_trx, 33, MYF(MY_WME | MY_ZEROFILL), &conn, sizeof(*conn), diff --git a/storage/spider/spd_malloc.h b/storage/spider/spd_malloc.h index 3c5c6e67c..697595ede 100644 --- a/storage/spider/spd_malloc.h +++ b/storage/spider/spd_malloc.h @@ -19,7 +19,7 @@ #define spider_bulk_malloc(A,B,C,...) \ spider_bulk_alloc_mem(A,B,__func__,__FILE__,__LINE__,C,__VA_ARGS__) #define spider_current_trx \ - (current_thd ? ((SPIDER_TRX *) *thd_ha_data(current_thd, spider_hton_ptr)) : NULL) + (current_thd ? ((SPIDER_TRX *) thd_get_ha_data(current_thd, spider_hton_ptr)) : NULL) #define init_calc_mem(A) init_mem_calc(A,__func__,__FILE__,__LINE__) diff --git a/storage/spider/spd_ping_table.cc b/storage/spider/spd_ping_table.cc index 77a2969d0..6f04e08dc 100644 --- a/storage/spider/spd_ping_table.cc +++ b/storage/spider/spd_ping_table.cc @@ -52,11 +52,6 @@ extern PSI_mutex_key spd_key_mutex_mon_list_update_status; extern PSI_mutex_key spd_key_mutex_mon_table_cache; #endif -#ifndef WITHOUT_SPIDER_BG_SEARCH -extern pthread_mutex_t spider_global_trx_mutex; -extern SPIDER_TRX *spider_global_trx; -#endif - HASH *spider_udf_table_mon_list_hash; uint spider_udf_table_mon_list_hash_id; const char *spider_udf_table_mon_list_hash_func_name; @@ -130,7 +125,6 @@ SPIDER_TABLE_MON_LIST *spider_get_ping_table_mon_list( ) #endif { - DBUG_ASSERT(trx != spider_global_trx); if ( table_mon_list && table_mon_list->mon_table_cache_version != mon_table_cache_version @@ -608,29 +602,17 @@ SPIDER_CONN *spider_get_ping_table_tgt_conn( ) { SPIDER_CONN *conn; DBUG_ENTER("spider_get_ping_table_tgt_conn"); -#ifndef WITHOUT_SPIDER_BG_SEARCH - if (trx == spider_global_trx) - pthread_mutex_lock(&spider_global_trx_mutex); -#endif if ( !(conn = spider_get_conn( share, 0, share->conn_keys[0], trx, NULL, FALSE, FALSE, SPIDER_CONN_KIND_MYSQL, error_num)) ) { -#ifndef WITHOUT_SPIDER_BG_SEARCH - if (trx == spider_global_trx) - pthread_mutex_unlock(&spider_global_trx_mutex); -#endif my_error(ER_CONNECT_TO_FOREIGN_DATA_SOURCE, MYF(0), share->server_names[0]); *error_num = ER_CONNECT_TO_FOREIGN_DATA_SOURCE; goto error; } #ifndef DBUG_OFF - if (trx == spider_global_trx) - { - DBUG_ASSERT(!conn->thd); - } DBUG_PRINT("info",("spider conn->thd=%p", conn->thd)); if (conn->thd) { @@ -638,10 +620,6 @@ SPIDER_CONN *spider_get_ping_table_tgt_conn( } #endif conn->error_mode = 0; -#ifndef WITHOUT_SPIDER_BG_SEARCH - if (trx == spider_global_trx) - pthread_mutex_unlock(&spider_global_trx_mutex); -#endif DBUG_RETURN(conn); error: diff --git a/storage/spider/spd_table.cc b/storage/spider/spd_table.cc index 94d9f2257..130edc5ee 100644 --- a/storage/spider/spd_table.cc +++ b/storage/spider/spd_table.cc @@ -41,6 +41,27 @@ #include "spd_direct_sql.h" #include "spd_malloc.h" +inline MYSQL_THD spider_create_thd() +{ + THD *thd; + my_thread_init(); + if (!(thd = new THD())) + my_thread_end(); + else + { +#ifdef HAVE_PSI_INTERFACE + mysql_thread_set_psi_id(thd->thread_id); +#endif + thd->thread_stack = (char *) &thd; + thd->store_globals(); + } + return thd; +} +inline void spider_destroy_thd(MYSQL_THD thd) +{ + delete thd; +} + ulong *spd_db_att_thread_id; #ifdef SPIDER_XID_USES_xid_cache_iterate #else @@ -77,9 +98,6 @@ PSI_mutex_key spd_key_mutex_conn; PSI_mutex_key spd_key_mutex_hs_r_conn; PSI_mutex_key spd_key_mutex_hs_w_conn; #endif -#ifndef WITHOUT_SPIDER_BG_SEARCH -PSI_mutex_key spd_key_mutex_global_trx; -#endif PSI_mutex_key spd_key_mutex_open_conn; PSI_mutex_key spd_key_mutex_allocated_thds; PSI_mutex_key spd_key_mutex_mon_table_cache; @@ -123,9 +141,6 @@ static PSI_mutex_info all_spider_mutexes[]= #if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET) { &spd_key_mutex_hs_r_conn, "hs_r_conn", PSI_FLAG_GLOBAL}, { &spd_key_mutex_hs_w_conn, "hs_w_conn", PSI_FLAG_GLOBAL}, -#endif -#ifndef WITHOUT_SPIDER_BG_SEARCH - { &spd_key_mutex_global_trx, "global_trx", PSI_FLAG_GLOBAL}, #endif { &spd_key_mutex_open_conn, "open_conn", PSI_FLAG_GLOBAL}, { &spd_key_mutex_allocated_thds, "allocated_thds", PSI_FLAG_GLOBAL}, @@ -280,9 +295,6 @@ pthread_mutex_t spider_allocated_thds_mutex; #ifndef WITHOUT_SPIDER_BG_SEARCH pthread_attr_t spider_pt_attr; - -pthread_mutex_t spider_global_trx_mutex; -SPIDER_TRX *spider_global_trx; #endif extern pthread_mutex_t spider_mem_calc_mutex; @@ -5994,7 +6006,7 @@ int spider_close_connection( SPIDER_CONN *conn; SPIDER_TRX *trx; DBUG_ENTER("spider_close_connection"); - if (!(trx = (SPIDER_TRX*) *thd_ha_data(thd, spider_hton_ptr))) + if (!(trx = (SPIDER_TRX*) thd_get_ha_data(thd, spider_hton_ptr))) DBUG_RETURN(0); /* transaction is not started */ trx->tmp_spider->conns = &conn; @@ -6049,6 +6061,7 @@ int spider_db_done( void *p ) { int roop_count; + bool do_delete_thd; THD *thd = current_thd, *tmp_thd; SPIDER_CONN *conn; SPIDER_INIT_ERROR_TABLE *spider_init_error_table; @@ -6056,9 +6069,17 @@ int spider_db_done( SPIDER_LGTM_TBLHND_SHARE *lgtm_tblhnd_share; DBUG_ENTER("spider_db_done"); -#ifndef WITHOUT_SPIDER_BG_SEARCH - spider_free_trx(spider_global_trx, TRUE); -#endif + /* Begin Spider plugin deinit */ + if (thd) + do_delete_thd = FALSE; + else + { + /* Create a thread for Spider plugin deinit */ + thd = spider_create_thd(); + if (!thd) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + do_delete_thd = TRUE; + } for (roop_count = SPIDER_DBTON_SIZE - 1; roop_count >= 0; roop_count--) { @@ -6098,21 +6119,22 @@ int spider_db_done( pthread_mutex_destroy(&spider_udf_table_mon_mutexes[roop_count]); spider_free(NULL, spider_udf_table_mon_mutexes, MYF(0)); - if (thd && thd_sql_command(thd) == SQLCOM_UNINSTALL_PLUGIN) { - pthread_mutex_lock(&spider_allocated_thds_mutex); - while ((tmp_thd = (THD *) my_hash_element(&spider_allocated_thds, 0))) + pthread_mutex_lock(&spider_allocated_thds_mutex); + while ((tmp_thd = (THD *) my_hash_element(&spider_allocated_thds, 0))) + { + SPIDER_TRX *trx = (SPIDER_TRX *) + thd_get_ha_data(tmp_thd, spider_hton_ptr); + if (trx) { - SPIDER_TRX *trx = (SPIDER_TRX *) *thd_ha_data(tmp_thd, spider_hton_ptr); - if (trx) - { - DBUG_ASSERT(tmp_thd == trx->thd); - spider_free_trx(trx, FALSE); - *thd_ha_data(tmp_thd, spider_hton_ptr) = (void *) NULL; - } else - my_hash_delete(&spider_allocated_thds, (uchar *) tmp_thd); + DBUG_ASSERT(tmp_thd == trx->thd); + spider_free_trx(trx, FALSE); + thd_set_ha_data(tmp_thd, spider_hton_ptr, NULL); } - pthread_mutex_unlock(&spider_allocated_thds_mutex); + else + my_hash_delete(&spider_allocated_thds, (uchar *) tmp_thd); } + pthread_mutex_unlock(&spider_allocated_thds_mutex); + #if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET) pthread_mutex_lock(&spider_hs_w_conn_mutex); while ((conn = (SPIDER_CONN*) my_hash_element(&spider_hs_w_conn_hash, 0))) @@ -6226,9 +6248,6 @@ int spider_db_done( pthread_mutex_destroy(&spider_mon_table_cache_mutex); pthread_mutex_destroy(&spider_allocated_thds_mutex); pthread_mutex_destroy(&spider_open_conn_mutex); -#ifndef WITHOUT_SPIDER_BG_SEARCH - pthread_mutex_destroy(&spider_global_trx_mutex); -#endif #if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET) pthread_mutex_destroy(&spider_hs_w_conn_mutex); pthread_mutex_destroy(&spider_hs_r_conn_mutex); @@ -6261,6 +6280,11 @@ int spider_db_done( spider_current_alloc_mem[roop_count] ? "NG" : "OK" )); } + + /* End Spider plugin deinit */ + if (do_delete_thd) + spider_destroy_thd(thd); + /* DBUG_ASSERT(0); */ @@ -6470,18 +6494,6 @@ int spider_db_init( error_num = HA_ERR_OUT_OF_MEM; goto error_conn_mutex_init; } -#ifndef WITHOUT_SPIDER_BG_SEARCH -#if MYSQL_VERSION_ID < 50500 - if (pthread_mutex_init(&spider_global_trx_mutex, MY_MUTEX_INIT_FAST)) -#else - if (mysql_mutex_init(spd_key_mutex_global_trx, - &spider_global_trx_mutex, MY_MUTEX_INIT_FAST)) -#endif - { - error_num = HA_ERR_OUT_OF_MEM; - goto error_global_trx_mutex_init; - } -#endif #if MYSQL_VERSION_ID < 50500 if (pthread_mutex_init(&spider_open_conn_mutex, MY_MUTEX_INIT_FAST)) #else @@ -6746,16 +6758,9 @@ int spider_db_init( } } -#ifndef WITHOUT_SPIDER_BG_SEARCH - if (!(spider_global_trx = spider_get_trx(NULL, FALSE, &error_num))) - goto error; -#endif - DBUG_RETURN(0); #ifndef WITHOUT_SPIDER_BG_SEARCH -error: - roop_count = SPIDER_DBTON_SIZE; error_init_dbton: for (roop_count--; roop_count >= 0; roop_count--) { @@ -6857,10 +6862,6 @@ int spider_db_init( #endif pthread_mutex_destroy(&spider_open_conn_mutex); error_open_conn_mutex_init: -#ifndef WITHOUT_SPIDER_BG_SEARCH - pthread_mutex_destroy(&spider_global_trx_mutex); -error_global_trx_mutex_init: -#endif pthread_mutex_destroy(&spider_conn_mutex); error_conn_mutex_init: pthread_mutex_destroy(&spider_lgtm_tblhnd_share_mutex); diff --git a/storage/spider/spd_trx.cc b/storage/spider/spd_trx.cc index 26c9662e0..f6bf39b81 100644 --- a/storage/spider/spd_trx.cc +++ b/storage/spider/spd_trx.cc @@ -1147,7 +1147,7 @@ SPIDER_TRX *spider_get_trx( if ( !thd || - !(trx = (SPIDER_TRX*) *thd_ha_data(thd, spider_hton_ptr)) + !(trx = (SPIDER_TRX*) thd_get_ha_data(thd, spider_hton_ptr)) ) { DBUG_PRINT("info",("spider create new trx")); if (!(trx = (SPIDER_TRX *) @@ -1185,7 +1185,7 @@ SPIDER_TRX *spider_get_trx( goto error_init_hash; spider_alloc_calc_mem_init(trx->trx_conn_hash, 151); spider_alloc_calc_mem( - thd ? ((SPIDER_TRX *) *thd_ha_data(thd, spider_hton_ptr)) : NULL, + thd ? ((SPIDER_TRX *) thd_get_ha_data(thd, spider_hton_ptr)) : NULL, trx->trx_conn_hash, trx->trx_conn_hash.array.max_element * trx->trx_conn_hash.array.size_of_element); @@ -1197,7 +1197,7 @@ SPIDER_TRX *spider_get_trx( goto error_init_another_hash; spider_alloc_calc_mem_init(trx->trx_another_conn_hash, 152); spider_alloc_calc_mem( - thd ? ((SPIDER_TRX *) *thd_ha_data(thd, spider_hton_ptr)) : NULL, + thd ? ((SPIDER_TRX *) thd_get_ha_data(thd, spider_hton_ptr)) : NULL, trx->trx_another_conn_hash, trx->trx_another_conn_hash.array.max_element * trx->trx_another_conn_hash.array.size_of_element); @@ -1210,7 +1210,7 @@ SPIDER_TRX *spider_get_trx( goto error_hs_r_init_hash; spider_alloc_calc_mem_init(trx->trx_hs_r_conn_hash, 153); spider_alloc_calc_mem( - thd ? ((SPIDER_TRX *) *thd_ha_data(thd, spider_hton_ptr)) : NULL, + thd ? ((SPIDER_TRX *) thd_get_ha_data(thd, spider_hton_ptr)) : NULL, trx->trx_hs_r_conn_hash, trx->trx_hs_r_conn_hash.array.max_element * trx->trx_hs_r_conn_hash.array.size_of_element); @@ -1222,7 +1222,7 @@ SPIDER_TRX *spider_get_trx( goto error_hs_w_init_hash; spider_alloc_calc_mem_init(trx->trx_hs_w_conn_hash, 154); spider_alloc_calc_mem( - thd ? ((SPIDER_TRX *) *thd_ha_data(thd, spider_hton_ptr)) : NULL, + thd ? ((SPIDER_TRX *) thd_get_ha_data(thd, spider_hton_ptr)) : NULL, trx->trx_hs_w_conn_hash, trx->trx_hs_w_conn_hash.array.max_element * trx->trx_hs_w_conn_hash.array.size_of_element); @@ -1236,7 +1236,7 @@ SPIDER_TRX *spider_get_trx( goto error_direct_hs_r_init_hash; spider_alloc_calc_mem_init(trx->trx_direct_hs_r_conn_hash, 155); spider_alloc_calc_mem( - thd ? ((SPIDER_TRX *) *thd_ha_data(thd, spider_hton_ptr)) : NULL, + thd ? ((SPIDER_TRX *) thd_get_ha_data(thd, spider_hton_ptr)) : NULL, trx->trx_direct_hs_r_conn_hash, trx->trx_direct_hs_r_conn_hash.array.max_element * trx->trx_direct_hs_r_conn_hash.array.size_of_element); @@ -1248,7 +1248,7 @@ SPIDER_TRX *spider_get_trx( goto error_direct_hs_w_init_hash; spider_alloc_calc_mem_init(trx->trx_direct_hs_w_conn_hash, 156); spider_alloc_calc_mem( - thd ? ((SPIDER_TRX *) *thd_ha_data(thd, spider_hton_ptr)) : NULL, + thd ? ((SPIDER_TRX *) thd_get_ha_data(thd, spider_hton_ptr)) : NULL, trx->trx_direct_hs_w_conn_hash, trx->trx_direct_hs_w_conn_hash.array.max_element * trx->trx_direct_hs_w_conn_hash.array.size_of_element); @@ -1261,7 +1261,7 @@ SPIDER_TRX *spider_get_trx( goto error_init_alter_hash; spider_alloc_calc_mem_init(trx->trx_alter_table_hash, 157); spider_alloc_calc_mem( - thd ? ((SPIDER_TRX *) *thd_ha_data(thd, spider_hton_ptr)) : NULL, + thd ? ((SPIDER_TRX *) thd_get_ha_data(thd, spider_hton_ptr)) : NULL, trx->trx_alter_table_hash, trx->trx_alter_table_hash.array.max_element * trx->trx_alter_table_hash.array.size_of_element); @@ -1273,7 +1273,7 @@ SPIDER_TRX *spider_get_trx( goto error_init_trx_ha_hash; spider_alloc_calc_mem_init(trx->trx_ha_hash, 158); spider_alloc_calc_mem( - thd ? ((SPIDER_TRX *) *thd_ha_data(thd, spider_hton_ptr)) : NULL, + thd ? ((SPIDER_TRX *) thd_get_ha_data(thd, spider_hton_ptr)) : NULL, trx->trx_ha_hash, trx->trx_ha_hash.array.max_element * trx->trx_ha_hash.array.size_of_element); @@ -1395,7 +1395,7 @@ SPIDER_TRX *spider_get_trx( pthread_mutex_unlock(&spider_allocated_thds_mutex); trx->registed_allocated_thds = TRUE; } - *thd_ha_data(thd, spider_hton_ptr) = (void *) trx; + thd_set_ha_data(thd, spider_hton_ptr, trx); } } @@ -1441,7 +1441,7 @@ SPIDER_TRX *spider_get_trx( my_hash_free(&trx->trx_ha_hash); error_init_trx_ha_hash: spider_free_mem_calc( - thd ? ((SPIDER_TRX *) *thd_ha_data(thd, spider_hton_ptr)) : NULL, + thd ? ((SPIDER_TRX *) thd_get_ha_data(thd, spider_hton_ptr)) : NULL, trx->trx_alter_table_hash_id, trx->trx_alter_table_hash.array.max_element * trx->trx_alter_table_hash.array.size_of_element); @@ -1449,14 +1449,14 @@ SPIDER_TRX *spider_get_trx( error_init_alter_hash: #if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET) spider_free_mem_calc( - thd ? ((SPIDER_TRX *) *thd_ha_data(thd, spider_hton_ptr)) : NULL, + thd ? ((SPIDER_TRX *) thd_get_ha_data(thd, spider_hton_ptr)) : NULL, trx->trx_direct_hs_w_conn_hash_id, trx->trx_direct_hs_w_conn_hash.array.max_element * trx->trx_direct_hs_w_conn_hash.array.size_of_element); my_hash_free(&trx->trx_direct_hs_w_conn_hash); error_direct_hs_w_init_hash: spider_free_mem_calc( - thd ? ((SPIDER_TRX *) *thd_ha_data(thd, spider_hton_ptr)) : NULL, + thd ? ((SPIDER_TRX *) thd_get_ha_data(thd, spider_hton_ptr)) : NULL, trx->trx_direct_hs_r_conn_hash_id, trx->trx_direct_hs_r_conn_hash.array.max_element * trx->trx_direct_hs_r_conn_hash.array.size_of_element); @@ -1465,14 +1465,14 @@ SPIDER_TRX *spider_get_trx( #endif #if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET) spider_free_mem_calc( - thd ? ((SPIDER_TRX *) *thd_ha_data(thd, spider_hton_ptr)) : NULL, + thd ? ((SPIDER_TRX *) thd_get_ha_data(thd, spider_hton_ptr)) : NULL, trx->trx_hs_w_conn_hash_id, trx->trx_hs_w_conn_hash.array.max_element * trx->trx_hs_w_conn_hash.array.size_of_element); my_hash_free(&trx->trx_hs_w_conn_hash); error_hs_w_init_hash: spider_free_mem_calc( - thd ? ((SPIDER_TRX *) *thd_ha_data(thd, spider_hton_ptr)) : NULL, + thd ? ((SPIDER_TRX *) thd_get_ha_data(thd, spider_hton_ptr)) : NULL, trx->trx_hs_r_conn_hash_id, trx->trx_hs_r_conn_hash.array.max_element * trx->trx_hs_r_conn_hash.array.size_of_element); @@ -1480,14 +1480,14 @@ SPIDER_TRX *spider_get_trx( error_hs_r_init_hash: #endif spider_free_mem_calc( - thd ? ((SPIDER_TRX *) *thd_ha_data(thd, spider_hton_ptr)) : NULL, + thd ? ((SPIDER_TRX *) thd_get_ha_data(thd, spider_hton_ptr)) : NULL, trx->trx_another_conn_hash_id, trx->trx_another_conn_hash.array.max_element * trx->trx_another_conn_hash.array.size_of_element); my_hash_free(&trx->trx_another_conn_hash); error_init_another_hash: spider_free_mem_calc( - thd ? ((SPIDER_TRX *) *thd_ha_data(thd, spider_hton_ptr)) : NULL, + thd ? ((SPIDER_TRX *) thd_get_ha_data(thd, spider_hton_ptr)) : NULL, trx->trx_conn_hash_id, trx->trx_conn_hash.array.max_element * trx->trx_conn_hash.array.size_of_element); @@ -1526,7 +1526,7 @@ int spider_free_trx( if (need_lock) pthread_mutex_unlock(&spider_allocated_thds_mutex); } - *thd_ha_data(trx->thd, spider_hton_ptr) = (void *) NULL; + thd_set_ha_data(trx->thd, spider_hton_ptr, NULL); } spider_free_trx_alloc(trx); spider_merge_mem_calc(trx, TRUE); @@ -3298,7 +3298,7 @@ int spider_commit( SPIDER_CONN *conn; DBUG_ENTER("spider_commit"); - if (!(trx = (SPIDER_TRX*) *thd_ha_data(thd, spider_hton_ptr))) + if (!(trx = (SPIDER_TRX*) thd_get_ha_data(thd, spider_hton_ptr))) DBUG_RETURN(0); /* transaction is not started */ #ifdef HA_CAN_BULK_ACCESS @@ -3388,7 +3388,7 @@ int spider_rollback( SPIDER_CONN *conn; DBUG_ENTER("spider_rollback"); - if (!(trx = (SPIDER_TRX*) *thd_ha_data(thd, spider_hton_ptr))) + if (!(trx = (SPIDER_TRX*) thd_get_ha_data(thd, spider_hton_ptr))) DBUG_RETURN(0); /* transaction is not started */ #ifdef HA_CAN_BULK_ACCESS @@ -3463,7 +3463,7 @@ int spider_xa_prepare( if (all || (!thd_test_options(thd, OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN))) { - if (!(trx = (SPIDER_TRX*) *thd_ha_data(thd, spider_hton_ptr))) + if (!(trx = (SPIDER_TRX*) thd_get_ha_data(thd, spider_hton_ptr))) DBUG_RETURN(0); /* transaction is not started */ DBUG_PRINT("info",("spider trx_start=%s", diff --git a/storage/tokudb/CMakeLists.txt b/storage/tokudb/CMakeLists.txt index 7ea987280..e90e0b0ec 100644 --- a/storage/tokudb/CMakeLists.txt +++ b/storage/tokudb/CMakeLists.txt @@ -1,9 +1,12 @@ -SET(TOKUDB_VERSION 5.6.38-83.0) +SET(TOKUDB_VERSION 5.6.39-83.1) # PerconaFT only supports x86-64 and cmake-2.8.9+ IF(CMAKE_VERSION VERSION_LESS "2.8.9") MESSAGE(STATUS "CMake 2.8.9 or higher is required by TokuDB") ELSEIF(NOT HAVE_DLOPEN) MESSAGE(STATUS "dlopen is required by TokuDB") +ELSEIF(PLUGIN_PERFSCHEMA MATCHES "^NO$") + MESSAGE(STATUS "Performance Schema is required by TokuDB") + RETURN() ELSEIF(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64" OR CMAKE_SYSTEM_PROCESSOR STREQUAL "amd64") # tokudb requires F_NOCACHE or O_DIRECT, and designated initializers @@ -41,6 +44,7 @@ IF(NOT LIBJEMALLOC) MESSAGE(WARNING "TokuDB is enabled, but jemalloc is not. This configuration is not supported") ENDIF() +MY_CHECK_AND_SET_COMPILER_FLAG("-Wno-shadow") MY_CHECK_AND_SET_COMPILER_FLAG("-Wno-vla" DEBUG) MY_CHECK_AND_SET_COMPILER_FLAG("-Wno-implicit-fallthrough") diff --git a/storage/tokudb/PerconaFT/.clang-format b/storage/tokudb/PerconaFT/.clang-format new file mode 100644 index 000000000..088818584 --- /dev/null +++ b/storage/tokudb/PerconaFT/.clang-format @@ -0,0 +1,36 @@ +Language: Cpp +BasedOnStyle: Google + +# The following parameters are default for Google style, +# but as they are important for our project they +# are set explicitly here +AlignAfterOpenBracket: Align +BreakBeforeBinaryOperators: None +ColumnLimit: 80 +PointerAlignment: Left +SpaceAfterCStyleCast: false +SpaceBeforeAssignmentOperators: true +SpaceBeforeParens: ControlStatements +SpaceInEmptyParentheses: false +SpacesBeforeTrailingComments: 2 +SpacesInAngles: false +SpacesInContainerLiterals: true +SpacesInCStyleCastParentheses: false +SpacesInParentheses: false +SpacesInSquareBrackets: false +UseTab: Never + +# Non-default parametes +NamespaceIndentation: All +IndentWidth: 4 +TabWidth: 4 +AllowShortIfStatementsOnASingleLine: false +AllowShortLoopsOnASingleLine: false +BinPackParameters: false +BinPackArguments: false +ExperimentalAutoDetectBinPacking: false +AllowAllParametersOfDeclarationOnNextLine: false +#AlignConsecutiveAssignments: yes +#AlignConsecutiveDeclarations: yes +BreakStringLiterals: false +ReflowComments: true diff --git a/storage/tokudb/PerconaFT/CMakeLists.txt b/storage/tokudb/PerconaFT/CMakeLists.txt index 3973ec71b..3b6b909f6 100644 --- a/storage/tokudb/PerconaFT/CMakeLists.txt +++ b/storage/tokudb/PerconaFT/CMakeLists.txt @@ -9,6 +9,12 @@ project(TokuDB) set(CMAKE_SHARED_LIBRARY_LINK_C_FLAGS "") set(CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS "") +# See: https://jira.percona.com/browse/TDB-93 +IF(CMAKE_CXX_COMPILER_ID MATCHES "Clang") + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-address-of-packed-member") + SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-address-of-packed-member") +ENDIF() + # detect when we are being built as a subproject if (DEFINED MYSQL_PROJECT_NAME_DOCSTRING) add_definitions( -DMYSQL_TOKUDB_ENGINE=1) diff --git a/storage/tokudb/PerconaFT/README.md b/storage/tokudb/PerconaFT/README.md index d53caf001..ffb646b67 100644 --- a/storage/tokudb/PerconaFT/README.md +++ b/storage/tokudb/PerconaFT/README.md @@ -9,20 +9,18 @@ PerconaFT is provided as a shared library with an interface similar to Berkeley DB. To build the full MySQL product, see the instructions for -[Percona/tokudb-engine][tokudb-engine]. To build TokuMX, see the instructions -for [Percona/percona-server-mongodb][mongo]. This document covers PerconaFT only. +[Percona/percona-server][percona-server]. This document covers PerconaFT only. -[tokudb-engine]: https://github.com/Percona/tokudb-engine -[mongo]: https://github.com/Percona/percona-server-mongodb +[percona-server]: https://github.com/Percona/percona-server Building -------- PerconaFT is built using CMake >= 2.8.9. Out-of-source builds are -recommended. You need a C++11 compiler, though only GCC >= 4.7 and -Apple's Clang are tested. You also need zlib development packages -(`yum install zlib-devel` or `apt-get install zlib1g-dev`). +recommended. You need a C++11 compiler, though only some versions +of GCC >= 4.7 and Clang are tested. You also need zlib development +packages (`yum install zlib-devel` or `apt-get install zlib1g-dev`). You will also need the source code for jemalloc, checked out in `third_party/`. @@ -42,16 +40,16 @@ CC=gcc47 CXX=g++47 cmake \ cmake --build . --target install ``` -This will build `libtokudb.so` and `libtokuportability.so` and install it, +This will build `libft.so` and `libtokuportability.so` and install it, some header files, and some examples to `percona-ft/prefix/`. It will also build jemalloc and install it alongside these libraries, you should link to that if you are planning to run benchmarks or in production. ### Platforms -PerconaFT is supported on 64-bit Centos, should work on other 64-bit linux -distributions, and may work on OSX 10.8 and FreeBSD. PerconaFT is not -supported on 32-bit systems. +PerconaFT is supported on 64-bit Centos, Debian, and Ubuntu and should work +on other 64-bit linux distributions, and may work on OSX 10.8 and FreeBSD. +PerconaFT is not supported on 32-bit systems. [Transparent hugepages][transparent-hugepages] is a feature in newer linux kernel versions that causes problems for the memory usage tracking @@ -97,16 +95,9 @@ We have two publicly accessible mailing lists for TokuDB: - tokudb-dev@googlegroups.com is for discussion of the development of TokuDB. -and two for TokuMX: - - - tokumx-user@googlegroups.com is for general and support related - questions about the use of TokuMX. - - tokumx-dev@googlegroups.com is for discussion of the development of - TokuMX. - All source code and test contributions must be provided under a [BSD 2-Clause][bsd-2] license. For any small change set, the license text may be contained within the commit comment and the pull request. For larger contributions, the license must be presented in a COPYING. file in the root of the PerconaFT project. Please see the [BSD 2-Clause license template][bsd-2] for the content of the license text. -[jira]: https://tokutek.atlassian.net/browse/FT/ +[jira]: https://jira.percona.com/projects/TDB [bsd-2]: http://opensource.org/licenses/BSD-2-Clause/ diff --git a/storage/tokudb/PerconaFT/cmake_modules/TokuSetupCompiler.cmake b/storage/tokudb/PerconaFT/cmake_modules/TokuSetupCompiler.cmake index 385723aeb..50d35ee49 100644 --- a/storage/tokudb/PerconaFT/cmake_modules/TokuSetupCompiler.cmake +++ b/storage/tokudb/PerconaFT/cmake_modules/TokuSetupCompiler.cmake @@ -149,7 +149,7 @@ set_cflags_if_supported( -Wmissing-prototypes -Wmissing-declarations -Wpointer-arith - -Wshadow + #-Wshadow will fail with GCC-8 ${OPTIONAL_CFLAGS} ## other flags to try: #-Wunsafe-loop-optimizations diff --git a/storage/tokudb/PerconaFT/ft/ft-ops.cc b/storage/tokudb/PerconaFT/ft/ft-ops.cc index 60885ed9f..eb8696423 100644 --- a/storage/tokudb/PerconaFT/ft/ft-ops.cc +++ b/storage/tokudb/PerconaFT/ft/ft-ops.cc @@ -821,22 +821,22 @@ int toku_ftnode_fetch_callback(CACHEFILE UU(cachefile), fprintf( stderr, "%s:%d:toku_ftnode_fetch_callback - " - "file[%s], blocknum[%ld], toku_deserialize_ftnode_from " + "file[%s], blocknum[%lld], toku_deserialize_ftnode_from " "failed with a checksum error.\n", __FILE__, __LINE__, toku_cachefile_fname_in_env(cachefile), - blocknum.b); + (longlong)blocknum.b); } else { fprintf( stderr, "%s:%d:toku_ftnode_fetch_callback - " - "file[%s], blocknum[%ld], toku_deserialize_ftnode_from " + "file[%s], blocknum[%lld], toku_deserialize_ftnode_from " "failed with %d.\n", __FILE__, __LINE__, toku_cachefile_fname_in_env(cachefile), - blocknum.b, + (longlong)blocknum.b, r); } // make absolutely sure we crash before doing anything else. @@ -4880,6 +4880,94 @@ static void toku_pfs_keys_init(const char *toku_instr_group_name) { toku_instr_probe_1 = new toku_instr_probe(*fti_probe_1_key); } +static void toku_pfs_keys_destroy(void) { + delete kibbutz_mutex_key; + delete minicron_p_mutex_key; + delete queue_result_mutex_key; + delete tpool_lock_mutex_key; + delete workset_lock_mutex_key; + delete bjm_jobs_lock_mutex_key; + delete log_internal_lock_mutex_key; + delete cachetable_ev_thread_lock_mutex_key; + delete cachetable_disk_nb_mutex_key; + delete safe_file_size_lock_mutex_key; + delete cachetable_m_mutex_key; + delete checkpoint_safe_mutex_key; + delete ft_ref_lock_mutex_key; + delete ft_open_close_lock_mutex_key; + delete loader_error_mutex_key; + delete bfs_mutex_key; + delete loader_bl_mutex_key; + delete loader_fi_lock_mutex_key; + delete loader_out_mutex_key; + delete result_output_condition_lock_mutex_key; + delete block_table_mutex_key; + delete rollback_log_node_cache_mutex_key; + delete txn_lock_mutex_key; + delete txn_state_lock_mutex_key; + delete txn_child_manager_mutex_key; + delete txn_manager_lock_mutex_key; + delete treenode_mutex_key; + delete locktree_request_info_mutex_key; + delete locktree_request_info_retry_mutex_key; + delete manager_mutex_key; + delete manager_escalation_mutex_key; + delete db_txn_struct_i_txn_mutex_key; + delete manager_escalator_mutex_key; + delete indexer_i_indexer_lock_mutex_key; + delete indexer_i_indexer_estimate_lock_mutex_key; + + delete tokudb_file_data_key; + delete tokudb_file_load_key; + delete tokudb_file_tmp_key; + delete tokudb_file_log_key; + + delete fti_probe_1_key; + + delete extractor_thread_key; + delete fractal_thread_key; + delete io_thread_key; + delete eviction_thread_key; + delete kibbutz_thread_key; + delete minicron_thread_key; + delete tp_internal_thread_key; + + delete result_state_cond_key; + delete bjm_jobs_wait_key; + delete cachetable_p_refcount_wait_key; + delete cachetable_m_flow_control_cond_key; + delete cachetable_m_ev_thread_cond_key; + delete bfs_cond_key; + delete result_output_condition_key; + delete manager_m_escalator_done_key; + delete lock_request_m_wait_cond_key; + delete queue_result_cond_key; + delete ws_worker_wait_key; + delete rwlock_wait_read_key; + delete rwlock_wait_write_key; + delete rwlock_cond_key; + delete tp_thread_wait_key; + delete tp_pool_wait_free_key; + delete frwlock_m_wait_read_key; + delete kibbutz_k_cond_key; + delete minicron_p_condvar_key; + delete locktree_request_info_retry_cv_key; + + delete multi_operation_lock_key; + delete low_priority_multi_operation_lock_key; + delete cachetable_m_list_lock_key; + delete cachetable_m_pending_lock_expensive_key; + delete cachetable_m_pending_lock_cheap_key; + delete cachetable_m_lock_key; + delete result_i_open_dbs_rwlock_key; + delete checkpoint_safe_rwlock_key; + delete cachetable_value_key; + delete safe_file_size_lock_rwlock_key; + + delete cachetable_disk_nb_rwlock_key; + delete toku_instr_probe_1; +} + int toku_ft_layer_init(void) { int r = 0; @@ -4916,8 +5004,7 @@ void toku_ft_layer_destroy(void) { toku_status_destroy(); partitioned_counters_destroy(); toku_scoped_malloc_destroy(); - - delete toku_instr_probe_1; + toku_pfs_keys_destroy(); // Portability must be cleaned up last toku_portability_destroy(); diff --git a/storage/tokudb/PerconaFT/ft/serialize/ft-serialize.cc b/storage/tokudb/PerconaFT/ft/serialize/ft-serialize.cc index b24d72a5d..0d6573972 100644 --- a/storage/tokudb/PerconaFT/ft/serialize/ft-serialize.cc +++ b/storage/tokudb/PerconaFT/ft/serialize/ft-serialize.cc @@ -656,20 +656,20 @@ int deserialize_ft_from_fd_into_rbuf(int fd, fprintf(stderr, \ "%s:%d toku_deserialize_ft_from: " \ "filename[%s] " \ - "r[%d] max_acceptable_lsn[%lu]" \ - "r0[%d] checkpoint_lsn_0[%lu] checkpoint_count_0[%lu] " \ - "r1[%d] checkpoint_lsn_1[%lu] checkpoint_count_1[%lu]\n", \ + "r[%d] max_acceptable_lsn[%llu]" \ + "r0[%d] checkpoint_lsn_0[%llu] checkpoint_count_0[%llu] " \ + "r1[%d] checkpoint_lsn_1[%llu] checkpoint_count_1[%llu]\n", \ __FILE__, \ __LINE__, \ fn, \ r, \ - max_acceptable_lsn.lsn, \ + (ulonglong)max_acceptable_lsn.lsn, \ r0, \ - checkpoint_lsn_0.lsn, \ - checkpoint_count_0, \ + (ulonglong)checkpoint_lsn_0.lsn, \ + (ulonglong)checkpoint_count_0, \ r1, \ - checkpoint_lsn_1.lsn, \ - checkpoint_count_1); + (ulonglong)checkpoint_lsn_1.lsn, \ + (ulonglong)checkpoint_count_1); int toku_deserialize_ft_from(int fd, const char *fn, diff --git a/storage/tokudb/PerconaFT/ft/serialize/ft_node-serialize.cc b/storage/tokudb/PerconaFT/ft/serialize/ft_node-serialize.cc index 55899905b..46bb8f814 100644 --- a/storage/tokudb/PerconaFT/ft/serialize/ft_node-serialize.cc +++ b/storage/tokudb/PerconaFT/ft/serialize/ft_node-serialize.cc @@ -1170,11 +1170,11 @@ int verify_ftnode_sub_block(struct sub_block *sb, fprintf( stderr, "%s:%d:verify_ftnode_sub_block - " - "file[%s], blocknum[%ld], stored_xsum[%u] != actual_xsum[%u]\n", + "file[%s], blocknum[%lld], stored_xsum[%u] != actual_xsum[%u]\n", __FILE__, __LINE__, fname ? fname : "unknown", - blocknum.b, + (longlong)blocknum.b, stored_xsum, actual_xsum); dump_bad_block((Bytef *) sb->uncompressed_ptr, sb->uncompressed_size); @@ -1197,11 +1197,11 @@ static int deserialize_ftnode_info(struct sub_block *sb, FTNODE node) { fprintf( stderr, "%s:%d:deserialize_ftnode_info - " - "file[%s], blocknum[%ld], verify_ftnode_sub_block failed with %d\n", + "file[%s], blocknum[%lld], verify_ftnode_sub_block failed with %d\n", __FILE__, __LINE__, fname ? fname : "unknown", - node->blocknum.b, + (longlong)node->blocknum.b, r); dump_bad_block(static_cast(sb->uncompressed_ptr), sb->uncompressed_size); @@ -1253,11 +1253,11 @@ static int deserialize_ftnode_info(struct sub_block *sb, FTNODE node) { fprintf( stderr, "%s:%d:deserialize_ftnode_info - " - "file[%s], blocknum[%ld], data_size[%d] != rb.ndone[%d]\n", + "file[%s], blocknum[%lld], data_size[%d] != rb.ndone[%d]\n", __FILE__, __LINE__, fname ? fname : "unknown", - node->blocknum.b, + (longlong)node->blocknum.b, data_size, rb.ndone); dump_bad_block(rb.buf, rb.size); @@ -1388,12 +1388,12 @@ static int deserialize_ftnode_partition( if (r != 0) { fprintf(stderr, "%s:%d:deserialize_ftnode_partition - " - "file[%s], blocknum[%ld], " + "file[%s], blocknum[%lld], " "verify_ftnode_sub_block failed with %d\n", __FILE__, __LINE__, fname ? fname : "unknown", - node->blocknum.b, + (longlong)node->blocknum.b, r); goto exit; } @@ -1410,12 +1410,12 @@ static int deserialize_ftnode_partition( if (ch != FTNODE_PARTITION_MSG_BUFFER) { fprintf(stderr, "%s:%d:deserialize_ftnode_partition - " - "file[%s], blocknum[%ld], ch[%d] != " + "file[%s], blocknum[%lld], ch[%d] != " "FTNODE_PARTITION_MSG_BUFFER[%d]\n", __FILE__, __LINE__, fname ? fname : "unknown", - node->blocknum.b, + (longlong)node->blocknum.b, ch, FTNODE_PARTITION_MSG_BUFFER); dump_bad_block(rb.buf, rb.size); @@ -1433,12 +1433,12 @@ static int deserialize_ftnode_partition( if (ch != FTNODE_PARTITION_DMT_LEAVES) { fprintf(stderr, "%s:%d:deserialize_ftnode_partition - " - "file[%s], blocknum[%ld], ch[%d] != " + "file[%s], blocknum[%lld], ch[%d] != " "FTNODE_PARTITION_DMT_LEAVES[%d]\n", __FILE__, __LINE__, fname ? fname : "unknown", - node->blocknum.b, + (longlong)node->blocknum.b, ch, FTNODE_PARTITION_DMT_LEAVES); dump_bad_block(rb.buf, rb.size); @@ -1457,11 +1457,11 @@ static int deserialize_ftnode_partition( if (rb.ndone != rb.size) { fprintf(stderr, "%s:%d:deserialize_ftnode_partition - " - "file[%s], blocknum[%ld], rb.ndone[%d] != rb.size[%d]\n", + "file[%s], blocknum[%lld], rb.ndone[%d] != rb.size[%d]\n", __FILE__, __LINE__, fname ? fname : "unknown", - node->blocknum.b, + (longlong)node->blocknum.b, rb.ndone, rb.size); dump_bad_block(rb.buf, rb.size); @@ -1485,12 +1485,12 @@ static int decompress_and_deserialize_worker(struct rbuf curr_rbuf, const char *fname = toku_ftnode_get_cachefile_fname_in_env(node); fprintf(stderr, "%s:%d:decompress_and_deserialize_worker - " - "file[%s], blocknum[%ld], read_and_decompress_sub_block failed " + "file[%s], blocknum[%lld], read_and_decompress_sub_block failed " "with %d\n", __FILE__, __LINE__, fname ? fname : "unknown", - node->blocknum.b, + (longlong)node->blocknum.b, r); dump_bad_block(curr_rbuf.buf, curr_rbuf.size); goto exit; @@ -1502,12 +1502,12 @@ static int decompress_and_deserialize_worker(struct rbuf curr_rbuf, const char *fname = toku_ftnode_get_cachefile_fname_in_env(node); fprintf(stderr, "%s:%d:decompress_and_deserialize_worker - " - "file[%s], blocknum[%ld], deserialize_ftnode_partition failed " + "file[%s], blocknum[%lld], deserialize_ftnode_partition failed " "with %d\n", __FILE__, __LINE__, fname ? fname : "unknown", - node->blocknum.b, + (longlong)node->blocknum.b, r); dump_bad_block(curr_rbuf.buf, curr_rbuf.size); goto exit; @@ -1582,11 +1582,11 @@ static int deserialize_ftnode_header_from_rbuf_if_small_enough( fprintf( stderr, "%s:%d:deserialize_ftnode_header_from_rbuf_if_small_enough - " - "file[%s], blocknum[%ld], rb->size[%u] < 24\n", + "file[%s], blocknum[%lld], rb->size[%u] < 24\n", __FILE__, __LINE__, fname ? fname : "unknown", - blocknum.b, + (longlong)blocknum.b, rb->size); dump_bad_block(rb->buf, rb->size); // TODO: What error do we return here? @@ -1602,12 +1602,12 @@ static int deserialize_ftnode_header_from_rbuf_if_small_enough( fprintf( stderr, "%s:%d:deserialize_ftnode_header_from_rbuf_if_small_enough - " - "file[%s], blocknum[%ld], unrecognized magic number " + "file[%s], blocknum[%lld], unrecognized magic number " "%2.2x %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x\n", __FILE__, __LINE__, fname ? fname : "unknown", - blocknum.b, + (longlong)blocknum.b, static_cast(magic)[0], static_cast(magic)[1], static_cast(magic)[2], @@ -1627,12 +1627,12 @@ static int deserialize_ftnode_header_from_rbuf_if_small_enough( fprintf( stderr, "%s:%d:deserialize_ftnode_header_from_rbuf_if_small_enough - " - "file[%s], blocknum[%ld], node->layout_version_read_from_disk[%d] " + "file[%s], blocknum[%lld], node->layout_version_read_from_disk[%d] " "< FT_FIRST_LAYOUT_VERSION_WITH_BASEMENT_NODES[%d]\n", __FILE__, __LINE__, fname ? fname : "unknown", - blocknum.b, + (longlong)blocknum.b, node->layout_version_read_from_disk, FT_FIRST_LAYOUT_VERSION_WITH_BASEMENT_NODES); dump_bad_block(rb->buf, rb->size); @@ -1667,11 +1667,11 @@ static int deserialize_ftnode_header_from_rbuf_if_small_enough( fprintf( stderr, "%s:%d:deserialize_ftnode_header_from_rbuf_if_small_enough - " - "file[%s], blocknum[%ld], needed_size[%d] > rb->size[%d]\n", + "file[%s], blocknum[%lld], needed_size[%d] > rb->size[%d]\n", __FILE__, __LINE__, fname ? fname : "unknown", - blocknum.b, + (longlong)blocknum.b, needed_size, rb->size); dump_bad_block(rb->buf, rb->size); @@ -1695,11 +1695,11 @@ static int deserialize_ftnode_header_from_rbuf_if_small_enough( fprintf( stderr, "%s:%d:deserialize_ftnode_header_from_rbuf_if_small_enough - " - "file[%s], blocknum[%ld], stored_checksum[%d] != checksum[%d]\n", + "file[%s], blocknum[%lld], stored_checksum[%d] != checksum[%d]\n", __FILE__, __LINE__, fname ? fname : "unknown", - blocknum.b, + (longlong)blocknum.b, stored_checksum, checksum); dump_bad_block(rb->buf, rb->size); @@ -1717,12 +1717,12 @@ static int deserialize_ftnode_header_from_rbuf_if_small_enough( fprintf( stderr, "%s:%d:deserialize_ftnode_header_from_rbuf_if_small_enough - " - "file[%s], blocknum[%ld], rb->size[%d] - rb->ndone[%d] < " + "file[%s], blocknum[%lld], rb->size[%d] - rb->ndone[%d] < " "sb_node_info.compressed_size[%d] + 8\n", __FILE__, __LINE__, fname ? fname : "unknown", - blocknum.b, + (longlong)blocknum.b, rb->size, rb->ndone, sb_node_info.compressed_size); @@ -1744,11 +1744,11 @@ static int deserialize_ftnode_header_from_rbuf_if_small_enough( fprintf( stderr, "%s:%d:deserialize_ftnode_header_from_rbuf_if_small_enough - " - "file[%s], blocknum[%ld], sb_node_info.xsum[%d] != actual_xsum[%d]\n", + "file[%s], blocknum[%lld], sb_node_info.xsum[%d] != actual_xsum[%d]\n", __FILE__, __LINE__, fname ? fname : "unknown", - blocknum.b, + (longlong)blocknum.b, sb_node_info.xsum, actual_xsum); dump_bad_block(rb->buf, rb->size); @@ -1774,12 +1774,12 @@ static int deserialize_ftnode_header_from_rbuf_if_small_enough( fprintf( stderr, "%s:%d:deserialize_ftnode_header_from_rbuf_if_small_enough - " - "file[%s], blocknum[%ld], deserialize_ftnode_info failed with " + "file[%s], blocknum[%lld], deserialize_ftnode_info failed with " "%d\n", __FILE__, __LINE__, fname ? fname : "unknown", - blocknum.b, + (longlong)blocknum.b, r); dump_bad_block( static_cast(sb_node_info.uncompressed_ptr), @@ -1812,12 +1812,12 @@ static int deserialize_ftnode_header_from_rbuf_if_small_enough( fprintf( stderr, "%s:%d:deserialize_ftnode_header_from_rbuf_if_small_enough - " - "file[%s], blocknum[%ld], toku_ftnode_pf_callback failed with " + "file[%s], blocknum[%lld], toku_ftnode_pf_callback failed with " "%d\n", __FILE__, __LINE__, fname ? fname : "unknown", - blocknum.b, + (longlong)blocknum.b, r); dump_bad_block(rb->buf, rb->size); goto cleanup; @@ -2164,12 +2164,12 @@ static int deserialize_and_upgrade_ftnode(FTNODE node, const char* fname = toku_cachefile_fname_in_env(bfe->ft->cf); fprintf(stderr, "%s:%d:deserialize_and_upgrade_ftnode - " - "file[%s], blocknum[%ld], " + "file[%s], blocknum[%lld], " "read_and_decompress_block_from_fd_into_rbuf failed with %d\n", __FILE__, __LINE__, fname ? fname : "unknown", - blocknum.b, + (longlong)blocknum.b, r); goto exit; } @@ -2190,12 +2190,12 @@ static int deserialize_and_upgrade_ftnode(FTNODE node, const char* fname = toku_cachefile_fname_in_env(bfe->ft->cf); fprintf(stderr, "%s:%d:deserialize_and_upgrade_ftnode - " - "file[%s], blocknum[%ld], version[%d] > " + "file[%s], blocknum[%lld], version[%d] > " "FT_LAYOUT_VERSION_14[%d]\n", __FILE__, __LINE__, fname ? fname : "unknown", - blocknum.b, + (longlong)blocknum.b, version, FT_LAYOUT_VERSION_14); dump_bad_block(rb.buf, rb.size); @@ -2278,12 +2278,12 @@ static int deserialize_ftnode_from_rbuf(FTNODE *ftnode, memcmp(magic, "tokunode", 8) != 0) { fprintf(stderr, "%s:%d:deserialize_ftnode_from_rbuf - " - "file[%s], blocknum[%ld], unrecognized magic number " + "file[%s], blocknum[%lld], unrecognized magic number " "%2.2x %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x\n", __FILE__, __LINE__, fname ? fname : "unknown", - blocknum.b, + (longlong)blocknum.b, static_cast(magic)[0], static_cast(magic)[1], static_cast(magic)[2], @@ -2309,12 +2309,12 @@ static int deserialize_ftnode_from_rbuf(FTNODE *ftnode, if (r != 0) { fprintf(stderr, "%s:%d:deserialize_ftnode_from_rbuf - " - "file[%s], blocknum[%ld], deserialize_and_upgrade_ftnode " + "file[%s], blocknum[%lld], deserialize_and_upgrade_ftnode " "failed with %d\n", __FILE__, __LINE__, fname ? fname : "unknown", - blocknum.b, + (longlong)blocknum.b, r); dump_bad_block(rb->buf, rb->size); goto cleanup; @@ -2355,11 +2355,11 @@ static int deserialize_ftnode_from_rbuf(FTNODE *ftnode, fprintf( stderr, "%s:%d:deserialize_ftnode_from_rbuf - " - "file[%s], blocknum[%ld], stored_checksum[%d] != checksum[%d]\n", + "file[%s], blocknum[%lld], stored_checksum[%d] != checksum[%d]\n", __FILE__, __LINE__, fname ? fname : "unknown", - blocknum.b, + (longlong)blocknum.b, stored_checksum, checksum); dump_bad_block(rb->buf, rb->size); @@ -2377,12 +2377,12 @@ static int deserialize_ftnode_from_rbuf(FTNODE *ftnode, fprintf( stderr, "%s:%d:deserialize_ftnode_from_rbuf - " - "file[%s], blocknum[%ld], read_and_decompress_sub_block failed " + "file[%s], blocknum[%lld], read_and_decompress_sub_block failed " "with %d\n", __FILE__, __LINE__, fname ? fname : "unknown", - blocknum.b, + (longlong)blocknum.b, r); dump_bad_block( static_cast(sb_node_info.uncompressed_ptr), @@ -2398,12 +2398,12 @@ static int deserialize_ftnode_from_rbuf(FTNODE *ftnode, fprintf( stderr, "%s:%d:deserialize_ftnode_from_rbuf - " - "file[%s], blocknum[%ld], deserialize_ftnode_info failed with " + "file[%s], blocknum[%lld], deserialize_ftnode_info failed with " "%d\n", __FILE__, __LINE__, fname ? fname : "unknown", - blocknum.b, + (longlong)blocknum.b, r); dump_bad_block(rb->buf, rb->size); goto cleanup; @@ -2470,12 +2470,12 @@ static int deserialize_ftnode_from_rbuf(FTNODE *ftnode, fprintf( stderr, "%s:%d:deserialize_ftnode_from_rbuf - " - "file[%s], blocknum[%ld], childnum[%d], " + "file[%s], blocknum[%lld], childnum[%d], " "decompress_and_deserialize_worker failed with %d\n", __FILE__, __LINE__, fname ? fname : "unknown", - blocknum.b, + (longlong)blocknum.b, i, r); dump_bad_block(rb->buf, rb->size); @@ -2490,13 +2490,13 @@ static int deserialize_ftnode_from_rbuf(FTNODE *ftnode, fprintf( stderr, "%s:%d:deserialize_ftnode_from_rbuf - " - "file[%s], blocknum[%ld], childnum[%d], " + "file[%s], blocknum[%lld], childnum[%d], " "check_and_copy_compressed_sub_block_worker failed with " "%d\n", __FILE__, __LINE__, fname ? fname : "unknown", - blocknum.b, + (longlong)blocknum.b, i, r); dump_bad_block(rb->buf, rb->size); @@ -2641,12 +2641,12 @@ int toku_deserialize_bp_from_compressed(FTNODE node, const char* fname = toku_cachefile_fname_in_env(bfe->ft->cf); fprintf(stderr, "%s:%d:toku_deserialize_bp_from_compressed - " - "file[%s], blocknum[%ld], " + "file[%s], blocknum[%lld], " "deserialize_ftnode_partition failed with %d\n", __FILE__, __LINE__, fname ? fname : "unknown", - node->blocknum.b, + (longlong)node->blocknum.b, r); dump_bad_block(static_cast(curr_sb->compressed_ptr), curr_sb->compressed_size); @@ -2689,12 +2689,12 @@ static int deserialize_ftnode_from_fd(int fd, fprintf( stderr, "%s:%d:deserialize_ftnode_from_fd - " - "file[%s], blocknum[%ld], deserialize_ftnode_from_rbuf failed with " + "file[%s], blocknum[%lld], deserialize_ftnode_from_rbuf failed with " "%d\n", __FILE__, __LINE__, fname ? fname : "unknown", - blocknum.b, + (longlong)blocknum.b, r); dump_bad_block(rb.buf, rb.size); } diff --git a/storage/tokudb/PerconaFT/ft/tests/ft-clock-test.cc b/storage/tokudb/PerconaFT/ft/tests/ft-clock-test.cc index 26a3dae67..00ff8cf20 100644 --- a/storage/tokudb/PerconaFT/ft/tests/ft-clock-test.cc +++ b/storage/tokudb/PerconaFT/ft/tests/ft-clock-test.cc @@ -184,11 +184,11 @@ static void test2(int fd, FT ft_h, FTNODE *dn) { PAIR_ATTR attr; memset(&attr, 0, sizeof(attr)); toku_ftnode_pe_callback(*dn, attr, ft_h, def_pe_finalize_impl, nullptr); - invariant(BP_STATE(*dn, 0) == (is_leaf) ? PT_ON_DISK : PT_COMPRESSED); + invariant(BP_STATE(*dn, 0) == ((is_leaf) ? PT_ON_DISK : PT_COMPRESSED)); invariant(BP_STATE(*dn, 1) == PT_AVAIL); invariant(BP_SHOULD_EVICT(*dn, 1)); toku_ftnode_pe_callback(*dn, attr, ft_h, def_pe_finalize_impl, nullptr); - invariant(BP_STATE(*dn, 1) == (is_leaf) ? PT_ON_DISK : PT_COMPRESSED); + invariant(BP_STATE(*dn, 1) == ((is_leaf) ? PT_ON_DISK : PT_COMPRESSED)); bool req = toku_ftnode_pf_req_callback(*dn, &bfe_subset); invariant(req); diff --git a/storage/tokudb/PerconaFT/ft/tests/log-test4.cc b/storage/tokudb/PerconaFT/ft/tests/log-test4.cc index e0bbedb95..019852bb7 100644 --- a/storage/tokudb/PerconaFT/ft/tests/log-test4.cc +++ b/storage/tokudb/PerconaFT/ft/tests/log-test4.cc @@ -54,7 +54,7 @@ test_main (int argc __attribute__((__unused__)), { ml_lock(&logger->input_lock); toku_logger_make_space_in_inbuf(logger, 5); - snprintf(logger->inbuf.buf+logger->inbuf.n_in_buf, 5, "a1234"); + memcpy(logger->inbuf.buf+logger->inbuf.n_in_buf, "a1234", 5); logger->inbuf.n_in_buf+=5; logger->lsn.lsn++; logger->inbuf.max_lsn_in_buf = logger->lsn; diff --git a/storage/tokudb/PerconaFT/portability/memory.h b/storage/tokudb/PerconaFT/portability/memory.h index 5ae652d39..851e4d69e 100644 --- a/storage/tokudb/PerconaFT/portability/memory.h +++ b/storage/tokudb/PerconaFT/portability/memory.h @@ -107,7 +107,7 @@ size_t toku_malloc_usable_size(void *p) __attribute__((__visibility__("default") #define XMALLOC(v) CAST_FROM_VOIDP(v, toku_xmalloc(sizeof(*v))) #define XMALLOC_N(n,v) CAST_FROM_VOIDP(v, toku_xmalloc((n)*sizeof(*v))) #define XCALLOC_N(n,v) CAST_FROM_VOIDP(v, toku_xcalloc((n), (sizeof(*v)))) -#define XCALLOC(v) XCALLOC_N(1,(v)) +#define XCALLOC(v) XCALLOC_N(1,v) #define XREALLOC(v,s) CAST_FROM_VOIDP(v, toku_xrealloc(v, s)) #define XREALLOC_N(n,v) CAST_FROM_VOIDP(v, toku_xrealloc(v, (n)*sizeof(*v))) diff --git a/storage/tokudb/PerconaFT/portability/tests/test-max-data.cc b/storage/tokudb/PerconaFT/portability/tests/test-max-data.cc index dbbea974a..fb5fc3711 100644 --- a/storage/tokudb/PerconaFT/portability/tests/test-max-data.cc +++ b/storage/tokudb/PerconaFT/portability/tests/test-max-data.cc @@ -64,7 +64,7 @@ int main(int argc, char *const argv[]) { if (verbose) printf("maxdata=%" PRIu64 " 0x%" PRIx64 "\n", maxdata, maxdata); // check the data size -#if defined(__x86_64__) || defined(__aarch64__) +#if defined(__x86_64__) || defined(__aarch64__) || defined(__powerpc64__) assert(maxdata > (1ULL << 32)); #elif __i386__ assert(maxdata < (1ULL << 32)); diff --git a/storage/tokudb/PerconaFT/portability/toku_debug_sync.h b/storage/tokudb/PerconaFT/portability/toku_debug_sync.h index b5394e58d..493075c36 100644 --- a/storage/tokudb/PerconaFT/portability/toku_debug_sync.h +++ b/storage/tokudb/PerconaFT/portability/toku_debug_sync.h @@ -62,9 +62,6 @@ inline void toku_debug_sync(struct tokutxn *txn, const char *sync_point_name) { void *client_extra; THD *thd; - if (likely(!opt_debug_sync_timeout)) - return; - toku_txn_get_client_id(txn, &client_id, &client_extra); thd = reinterpret_cast(client_extra); DEBUG_SYNC(thd, sync_point_name); diff --git a/storage/tokudb/PerconaFT/portability/toku_instrumentation.h b/storage/tokudb/PerconaFT/portability/toku_instrumentation.h index 8c9390edc..c300f9275 100644 --- a/storage/tokudb/PerconaFT/portability/toku_instrumentation.h +++ b/storage/tokudb/PerconaFT/portability/toku_instrumentation.h @@ -52,6 +52,8 @@ class toku_instr_key { UU(const char *name)) {} explicit toku_instr_key(UU(pfs_key_t key_id)) {} + + ~toku_instr_key() {} }; typedef toku_instr_probe_empty toku_instr_probe; diff --git a/storage/tokudb/PerconaFT/portability/toku_portability.h b/storage/tokudb/PerconaFT/portability/toku_portability.h index 1096467a3..8a3dcf5af 100644 --- a/storage/tokudb/PerconaFT/portability/toku_portability.h +++ b/storage/tokudb/PerconaFT/portability/toku_portability.h @@ -157,7 +157,7 @@ extern "C" { #endif // Deprecated functions. -#if !defined(TOKU_ALLOW_DEPRECATED) +#if !defined(TOKU_ALLOW_DEPRECATED) && !defined(__clang__) int creat(const char *pathname, mode_t mode) __attribute__((__deprecated__)); int fstat(int fd, struct stat *buf) __attribute__((__deprecated__)); int stat(const char *path, struct stat *buf) __attribute__((__deprecated__)); diff --git a/storage/tokudb/PerconaFT/portability/toku_pthread.h b/storage/tokudb/PerconaFT/portability/toku_pthread.h index 44de01244..a0dfcc246 100644 --- a/storage/tokudb/PerconaFT/portability/toku_pthread.h +++ b/storage/tokudb/PerconaFT/portability/toku_pthread.h @@ -162,18 +162,24 @@ typedef struct toku_mutex_aligned { #define ZERO_COND_INITIALIZER \ { 0 } #elif defined(__APPLE__) +#if TOKU_PTHREAD_DEBUG #define ZERO_COND_INITIALIZER \ { \ - { 0 } \ + { 0 , { 0 } }, \ + nullptr, \ + 0 \ } -#else // __linux__, at least +#else #define ZERO_COND_INITIALIZER \ { \ - { \ - { 0 } \ - } \ + { 0 , { 0 } }, \ + nullptr \ } #endif +#else // __linux__, at least +#define ZERO_COND_INITIALIZER \ + {} +#endif static inline void toku_mutexattr_init(toku_pthread_mutexattr_t *attr) { int r = pthread_mutexattr_init(attr); diff --git a/storage/tokudb/PerconaFT/portability/toku_race_tools.h b/storage/tokudb/PerconaFT/portability/toku_race_tools.h index 8482a164f..96712ffff 100644 --- a/storage/tokudb/PerconaFT/portability/toku_race_tools.h +++ b/storage/tokudb/PerconaFT/portability/toku_race_tools.h @@ -40,6 +40,11 @@ Copyright (c) 2006, 2015, Percona and/or its affiliates. All rights reserved. #include +#ifdef HAVE_valgrind +#undef USE_VALGRIND +#define USE_VALGRIND 1 +#endif + #if defined(__linux__) && USE_VALGRIND # include @@ -90,8 +95,8 @@ Copyright (c) 2006, 2015, Percona and/or its affiliates. All rights reserved. # define TOKU_ANNOTATE_IGNORE_WRITES_BEGIN() ((void) 0) # define TOKU_ANNOTATE_IGNORE_WRITES_END() ((void) 0) # define TOKU_VALGRIND_RESET_MUTEX_ORDERING_INFO(mutex) +#undef RUNNING_ON_VALGRIND # define RUNNING_ON_VALGRIND (0U) - #endif // Valgrind 3.10.1 (and previous versions). diff --git a/storage/tokudb/PerconaFT/portability/toku_time.h b/storage/tokudb/PerconaFT/portability/toku_time.h index a1278ef03..c4c45b8e8 100644 --- a/storage/tokudb/PerconaFT/portability/toku_time.h +++ b/storage/tokudb/PerconaFT/portability/toku_time.h @@ -43,6 +43,9 @@ Copyright (c) 2006, 2015, Percona and/or its affiliates. All rights reserved. #include #include #include +#if defined(__powerpc__) +# include +#endif static inline float toku_tdiff (struct timeval *a, struct timeval *b) { return (float)((a->tv_sec - b->tv_sec) + 1e-6 * (a->tv_usec - b->tv_usec)); @@ -106,6 +109,8 @@ static inline tokutime_t toku_time_now(void) { uint64_t result; __asm __volatile__ ("mrs %[rt], cntvct_el0" : [rt] "=r" (result)); return result; +#elif defined(__powerpc__) + return __ppc_get_timebase(); #else #error No timer implementation for this platform #endif diff --git a/storage/tokudb/PerconaFT/src/CMakeLists.txt b/storage/tokudb/PerconaFT/src/CMakeLists.txt index 65bf4814c..bae373890 100644 --- a/storage/tokudb/PerconaFT/src/CMakeLists.txt +++ b/storage/tokudb/PerconaFT/src/CMakeLists.txt @@ -18,7 +18,7 @@ set(tokudb_srcs ## make the shared library add_library(${LIBTOKUDB} SHARED ${tokudb_srcs}) add_dependencies(${LIBTOKUDB} install_tdb_h generate_log_code) -target_link_libraries(${LIBTOKUDB} LINK_PRIVATE locktree_static ft_static util_static lzma snappy ${LIBTOKUPORTABILITY}) +target_link_libraries(${LIBTOKUDB} LINK_PRIVATE locktree_static ft_static util_static lzma snappy dbug ${LIBTOKUPORTABILITY}) target_link_libraries(${LIBTOKUDB} LINK_PUBLIC ${ZLIB_LIBRARY} ) ## make the static library diff --git a/storage/tokudb/PerconaFT/src/tests/checkpoint_stress.cc b/storage/tokudb/PerconaFT/src/tests/checkpoint_stress.cc index 135a9843c..d3e5ddd50 100644 --- a/storage/tokudb/PerconaFT/src/tests/checkpoint_stress.cc +++ b/storage/tokudb/PerconaFT/src/tests/checkpoint_stress.cc @@ -351,7 +351,7 @@ test_main (int argc, char * const argv[]) { // arg that suppresses valgrind on this child process break; } - // otherwise, fall through to an error + /* fall through */ // otherwise, fall through to an error case 'h': case '?': usage(argv[0]); diff --git a/storage/tokudb/PerconaFT/src/tests/directory_lock.cc b/storage/tokudb/PerconaFT/src/tests/directory_lock.cc index f040e6809..b28a71704 100644 --- a/storage/tokudb/PerconaFT/src/tests/directory_lock.cc +++ b/storage/tokudb/PerconaFT/src/tests/directory_lock.cc @@ -69,7 +69,7 @@ static void verify_shared_ops_fail(DB_ENV* env, DB* db) { uint32_t flags = 0; DBT key,val; DBT in_key,in_val; - uint32_t in_key_data, in_val_data = 0; + uint32_t in_key_data = 0, in_val_data = 0; memset(&in_key, 0, sizeof(in_key)); memset(&in_val, 0, sizeof(in_val)); in_key.size = sizeof(in_key_data); diff --git a/storage/tokudb/PerconaFT/src/tests/loader-cleanup-test.cc b/storage/tokudb/PerconaFT/src/tests/loader-cleanup-test.cc index ea894683c..a229cb5b5 100644 --- a/storage/tokudb/PerconaFT/src/tests/loader-cleanup-test.cc +++ b/storage/tokudb/PerconaFT/src/tests/loader-cleanup-test.cc @@ -172,12 +172,12 @@ err_type_str (enum test_type t) { case einval_o: return "open"; case enospc_fc: return "fclose"; case abort_via_poll: return "abort_via_poll"; - case commit: assert(0); - case abort_txn: assert(0); - case abort_loader: assert(0); + case commit: abort(); + case abort_txn: abort(); + case abort_loader: abort(); } // I know that Barry prefers the single-return case, but writing the code this way means that the compiler will complain if I forget something in the enum. -Bradley - assert(0); + abort(); return NULL; } @@ -193,12 +193,12 @@ err_msg_type_str (enum test_type t) { case einval_o: return "EINVAL"; case enospc_fc: return "ENOSPC"; case abort_via_poll: return "non-zero"; - case commit: assert(0); - case abort_txn: assert(0); - case abort_loader: assert(0); + case commit: abort(); + case abort_txn: abort(); + case abort_loader: abort(); } // I know that Barry prefers the single-return case, but writing the code this way means that the compiler will complain if I forget something in the enum. -Bradley - assert(0); + abort(); return NULL; } @@ -873,7 +873,7 @@ static void run_test(enum test_type t, int trigger) case abort_via_poll: poll_count_trigger = trigger; break; default: - assert(0); + abort(); } diff --git a/storage/tokudb/PerconaFT/src/tests/recover-del-multiple-abort.cc b/storage/tokudb/PerconaFT/src/tests/recover-del-multiple-abort.cc index a8455c0f4..425c12e1a 100644 --- a/storage/tokudb/PerconaFT/src/tests/recover-del-multiple-abort.cc +++ b/storage/tokudb/PerconaFT/src/tests/recover-del-multiple-abort.cc @@ -81,7 +81,7 @@ put_callback(DB *dest_db, DB *src_db, DBT_ARRAY *dest_keys, DBT_ARRAY *dest_vals memcpy(dest_key->data, &pri_data[dbnum], dest_key->size); break; default: - assert(0); + abort(); } if (dest_val) { @@ -95,9 +95,9 @@ put_callback(DB *dest_db, DB *src_db, DBT_ARRAY *dest_keys, DBT_ARRAY *dest_vals } break; case DB_DBT_REALLOC: - assert(0); + abort(); default: - assert(0); + abort(); } } diff --git a/storage/tokudb/PerconaFT/src/tests/recover-del-multiple-srcdb-fdelete-all.cc b/storage/tokudb/PerconaFT/src/tests/recover-del-multiple-srcdb-fdelete-all.cc index e823a7462..75479cb69 100644 --- a/storage/tokudb/PerconaFT/src/tests/recover-del-multiple-srcdb-fdelete-all.cc +++ b/storage/tokudb/PerconaFT/src/tests/recover-del-multiple-srcdb-fdelete-all.cc @@ -85,7 +85,7 @@ put_callback(DB *dest_db, DB *src_db, DBT_ARRAY *dest_keys, DBT_ARRAY *dest_vals memcpy(dest_key->data, &pri_data[dbnum], dest_key->size); break; default: - assert(0); + abort(); } if (dest_val) { @@ -99,9 +99,9 @@ put_callback(DB *dest_db, DB *src_db, DBT_ARRAY *dest_keys, DBT_ARRAY *dest_vals } break; case DB_DBT_REALLOC: - assert(0); + abort(); default: - assert(0); + abort(); } } diff --git a/storage/tokudb/PerconaFT/src/tests/recover-del-multiple.cc b/storage/tokudb/PerconaFT/src/tests/recover-del-multiple.cc index c2ee80c43..9f4b1cd9c 100644 --- a/storage/tokudb/PerconaFT/src/tests/recover-del-multiple.cc +++ b/storage/tokudb/PerconaFT/src/tests/recover-del-multiple.cc @@ -84,7 +84,7 @@ put_callback(DB *dest_db, DB *src_db, DBT_ARRAY *dest_keys, DBT_ARRAY *dest_vals memcpy(dest_key->data, &pri_data[dbnum], dest_key->size); break; default: - assert(0); + abort(); } if (dest_val) { @@ -98,9 +98,9 @@ put_callback(DB *dest_db, DB *src_db, DBT_ARRAY *dest_keys, DBT_ARRAY *dest_vals } break; case DB_DBT_REALLOC: - assert(0); + abort(); default: - assert(0); + abort(); } } diff --git a/storage/tokudb/PerconaFT/src/tests/recover-put-multiple-abort.cc b/storage/tokudb/PerconaFT/src/tests/recover-put-multiple-abort.cc index d04580096..da40a61f2 100644 --- a/storage/tokudb/PerconaFT/src/tests/recover-put-multiple-abort.cc +++ b/storage/tokudb/PerconaFT/src/tests/recover-put-multiple-abort.cc @@ -81,7 +81,7 @@ put_callback(DB *dest_db, DB *src_db, DBT_ARRAY *dest_keys, DBT_ARRAY *dest_vals memcpy(dest_key->data, &pri_data[dbnum], dest_key->size); break; default: - assert(0); + abort(); } if (dest_val) { @@ -95,9 +95,9 @@ put_callback(DB *dest_db, DB *src_db, DBT_ARRAY *dest_keys, DBT_ARRAY *dest_vals } break; case DB_DBT_REALLOC: - assert(0); + abort(); default: - assert(0); + abort(); } } diff --git a/storage/tokudb/PerconaFT/src/tests/recovery_fileops_unit.cc b/storage/tokudb/PerconaFT/src/tests/recovery_fileops_unit.cc index cc99ab560..45f0b465d 100644 --- a/storage/tokudb/PerconaFT/src/tests/recovery_fileops_unit.cc +++ b/storage/tokudb/PerconaFT/src/tests/recovery_fileops_unit.cc @@ -158,7 +158,7 @@ do_args(int argc, char * const argv[]) { choices[i] = -1; } - char c; + signed char c; while ((c = getopt(argc, argv, "vqhcrO:A:B:C:D:E:F:G:H:I:J:X:")) != -1) { switch (c) { case 'v': @@ -217,7 +217,7 @@ do_args(int argc, char * const argv[]) { // arg that suppresses valgrind on this child process break; } - // otherwise, fall through to an error + /* fall through */ // otherwise, fall through to an error default: usage(); break; diff --git a/storage/tokudb/PerconaFT/src/tests/test-prepare3.cc b/storage/tokudb/PerconaFT/src/tests/test-prepare3.cc index 5cb3796a2..f57fc9635 100644 --- a/storage/tokudb/PerconaFT/src/tests/test-prepare3.cc +++ b/storage/tokudb/PerconaFT/src/tests/test-prepare3.cc @@ -128,6 +128,7 @@ static void check_prepared_list (enum prepared_state ps[NTXNS], long count, DB_P goto next; case PREPARED: count_prepared++; + /* fall through */ case MAYBE_COMMITTED: case MAYBE_ABORTED: count_maybe_prepared++; diff --git a/storage/tokudb/PerconaFT/third_party/xz-4.999.9beta/autogen.sh b/storage/tokudb/PerconaFT/third_party/xz-4.999.9beta/autogen.sh old mode 100644 new mode 100755 diff --git a/storage/tokudb/PerconaFT/third_party/xz-4.999.9beta/build-aux/compile b/storage/tokudb/PerconaFT/third_party/xz-4.999.9beta/build-aux/compile old mode 100644 new mode 100755 diff --git a/storage/tokudb/PerconaFT/third_party/xz-4.999.9beta/build-aux/config.guess b/storage/tokudb/PerconaFT/third_party/xz-4.999.9beta/build-aux/config.guess old mode 100644 new mode 100755 diff --git a/storage/tokudb/PerconaFT/third_party/xz-4.999.9beta/build-aux/config.rpath b/storage/tokudb/PerconaFT/third_party/xz-4.999.9beta/build-aux/config.rpath old mode 100644 new mode 100755 diff --git a/storage/tokudb/PerconaFT/third_party/xz-4.999.9beta/build-aux/config.sub b/storage/tokudb/PerconaFT/third_party/xz-4.999.9beta/build-aux/config.sub old mode 100644 new mode 100755 diff --git a/storage/tokudb/PerconaFT/third_party/xz-4.999.9beta/build-aux/depcomp b/storage/tokudb/PerconaFT/third_party/xz-4.999.9beta/build-aux/depcomp old mode 100644 new mode 100755 diff --git a/storage/tokudb/PerconaFT/third_party/xz-4.999.9beta/build-aux/install-sh b/storage/tokudb/PerconaFT/third_party/xz-4.999.9beta/build-aux/install-sh old mode 100644 new mode 100755 diff --git a/storage/tokudb/PerconaFT/third_party/xz-4.999.9beta/build-aux/ltmain.sh b/storage/tokudb/PerconaFT/third_party/xz-4.999.9beta/build-aux/ltmain.sh old mode 100644 new mode 100755 diff --git a/storage/tokudb/PerconaFT/third_party/xz-4.999.9beta/build-aux/missing b/storage/tokudb/PerconaFT/third_party/xz-4.999.9beta/build-aux/missing old mode 100644 new mode 100755 diff --git a/storage/tokudb/PerconaFT/third_party/xz-4.999.9beta/extra/7z2lzma/7z2lzma.bash b/storage/tokudb/PerconaFT/third_party/xz-4.999.9beta/extra/7z2lzma/7z2lzma.bash old mode 100644 new mode 100755 diff --git a/storage/tokudb/PerconaFT/third_party/xz-4.999.9beta/tests/test_compress.sh b/storage/tokudb/PerconaFT/third_party/xz-4.999.9beta/tests/test_compress.sh old mode 100644 new mode 100755 diff --git a/storage/tokudb/PerconaFT/third_party/xz-4.999.9beta/tests/test_files.sh b/storage/tokudb/PerconaFT/third_party/xz-4.999.9beta/tests/test_files.sh old mode 100644 new mode 100755 diff --git a/storage/tokudb/PerconaFT/util/dmt.cc b/storage/tokudb/PerconaFT/util/dmt.cc index b5b949824..642c9367d 100644 --- a/storage/tokudb/PerconaFT/util/dmt.cc +++ b/storage/tokudb/PerconaFT/util/dmt.cc @@ -80,8 +80,8 @@ void dmt::create_from_sorted_memory_of_fix paranoid_invariant(numvalues > 0); void *ptr = toku_mempool_malloc(&this->mp, aligned_memsize); paranoid_invariant_notnull(ptr); - uint8_t * const CAST_FROM_VOIDP(dest, ptr); - const uint8_t * const CAST_FROM_VOIDP(src, mem); + uint8_t * CAST_FROM_VOIDP(dest, ptr); + const uint8_t * CAST_FROM_VOIDP(src, mem); if (pad_bytes == 0) { paranoid_invariant(aligned_memsize == mem_length); memcpy(dest, src, aligned_memsize); diff --git a/storage/tokudb/PerconaFT/util/omt.h b/storage/tokudb/PerconaFT/util/omt.h index c7ed2ca54..369464013 100644 --- a/storage/tokudb/PerconaFT/util/omt.h +++ b/storage/tokudb/PerconaFT/util/omt.h @@ -127,7 +127,7 @@ class subtree_templated { paranoid_invariant(index != NODE_NULL); m_index = index; } -} __attribute__((__packed__,aligned(4))); +} ; template<> class subtree_templated { @@ -184,7 +184,7 @@ class subtree_templated { inline void disable_bit(void) { m_bitfield &= MASK_INDEX; } -} __attribute__((__packed__)) ; +} ; template class omt_node_templated { @@ -197,7 +197,7 @@ class omt_node_templated { // this needs to be in both implementations because we don't have // a "static if" the caller can use inline void clear_stolen_bits(void) {} -} __attribute__((__packed__,aligned(4))); +} ; template class omt_node_templated { @@ -234,7 +234,7 @@ class omt_node_templated { this->unset_marked_bit(); this->unset_marks_below_bit(); } -} __attribute__((__packed__,aligned(4))); +} ; } diff --git a/storage/tokudb/hatoku_hton.cc b/storage/tokudb/hatoku_hton.cc index ac0976fb1..1016ae83a 100644 --- a/storage/tokudb/hatoku_hton.cc +++ b/storage/tokudb/hatoku_hton.cc @@ -978,7 +978,7 @@ static bool tokudb_sync_on_prepare(void) { } static int tokudb_xa_prepare(handlerton* hton, THD* thd, bool all) { - TOKUDB_DBUG_ENTER(""); + TOKUDB_DBUG_ENTER("%u", all); TOKUDB_TRACE_FOR_FLAGS(TOKUDB_DEBUG_XA, "enter"); int r = 0; @@ -1006,6 +1006,22 @@ static int tokudb_xa_prepare(handlerton* hton, THD* thd, bool all) { r = txn->xa_prepare(txn, &thd_xid, syncflag); // test hook to induce a crash on a debug build DBUG_EXECUTE_IF("tokudb_crash_prepare_after", DBUG_SUICIDE();); + + // XA log entries can be interleaved in the binlog since XA prepare on the master + // flushes to the binlog. There can be log entries from different clients pushed + // into the binlog before XA commit is executed on the master. Therefore, the slave + // thread must be able to juggle multiple XA transactions. Tokudb does this by + // zapping the client transaction context on the slave when executing the XA prepare + // and expecting to process XA commit with commit_by_xid (which supplies the XID so + // that the transaction can be looked up and committed). + if (r == 0 && all && thd->slave_thread) { + TOKUDB_TRACE_FOR_FLAGS(TOKUDB_DEBUG_XA, "zap txn context %u", thd_sql_command(thd)); + if (thd_sql_command(thd) == SQLCOM_XA_PREPARE) { + trx->all = NULL; + trx->sub_sp_level = NULL; + trx->sp_level = NULL; + } + } } else { TOKUDB_TRACE_FOR_FLAGS(TOKUDB_DEBUG_XA, "nothing to prepare %d", all); } @@ -1036,6 +1052,7 @@ static int tokudb_xa_recover(handlerton* hton, XID* xid_list, uint len) { static int tokudb_commit_by_xid(handlerton* hton, XID* xid) { TOKUDB_DBUG_ENTER(""); TOKUDB_TRACE_FOR_FLAGS(TOKUDB_DEBUG_XA, "enter"); + TOKUDB_TRACE_FOR_FLAGS(TOKUDB_DEBUG_XA, "xid %p", xid); int r = 0; DB_TXN* txn = NULL; TOKU_XA_XID* toku_xid = (TOKU_XA_XID*)xid; @@ -1055,6 +1072,7 @@ static int tokudb_commit_by_xid(handlerton* hton, XID* xid) { static int tokudb_rollback_by_xid(handlerton* hton, XID* xid) { TOKUDB_DBUG_ENTER(""); TOKUDB_TRACE_FOR_FLAGS(TOKUDB_DEBUG_XA, "enter"); + TOKUDB_TRACE_FOR_FLAGS(TOKUDB_DEBUG_XA, "xid %p", xid); int r = 0; DB_TXN* txn = NULL; TOKU_XA_XID* toku_xid = (TOKU_XA_XID*)xid; diff --git a/storage/tokudb/mysql-test/tokudb_bugs/r/db917.result b/storage/tokudb/mysql-test/tokudb_bugs/r/db917.result index 9c2903342..9276664f8 100644 --- a/storage/tokudb/mysql-test/tokudb_bugs/r/db917.result +++ b/storage/tokudb/mysql-test/tokudb_bugs/r/db917.result @@ -1,8 +1,8 @@ drop table if exists t1; set @orig_table_open_cache = @@global.table_open_cache; create table t1(a int) engine = tokudb partition by key(a) partitions 2 (partition p0 engine = tokudb, partition p1 engine = tokudb); -lock tables t1 read; -set @@global.table_open_cache = 1; +lock tables t1 read,t1 as t2 read,t1 as t3 read, t1 as t4 read, t1 as t5 read, t1 as t6 read, t1 as t7 read, t1 as t8 read, t1 as t9 read, t1 as t10 read; +set @@global.table_open_cache = 10; begin; insert into t1 values(1),(1); select * from t1 where c like _ucs2 0x039C0025 collate ucs2_unicode_ci; diff --git a/storage/tokudb/mysql-test/tokudb_bugs/t/db917.test b/storage/tokudb/mysql-test/tokudb_bugs/t/db917.test index ae94d7b30..781fdb012 100644 --- a/storage/tokudb/mysql-test/tokudb_bugs/t/db917.test +++ b/storage/tokudb/mysql-test/tokudb_bugs/t/db917.test @@ -7,8 +7,8 @@ drop table if exists t1; enable_warnings; set @orig_table_open_cache = @@global.table_open_cache; create table t1(a int) engine = tokudb partition by key(a) partitions 2 (partition p0 engine = tokudb, partition p1 engine = tokudb); -lock tables t1 read; -set @@global.table_open_cache = 1; +lock tables t1 read,t1 as t2 read,t1 as t3 read, t1 as t4 read, t1 as t5 read, t1 as t6 read, t1 as t7 read, t1 as t8 read, t1 as t9 read, t1 as t10 read; +set @@global.table_open_cache = 10; begin; insert into t1 values(1),(1); # when the bug is present, this results in a lock wait timeout diff --git a/storage/tokudb/mysql-test/tokudb_mariadb/r/mdev6657.result b/storage/tokudb/mysql-test/tokudb_mariadb/r/mdev6657.result index 2e9faddba..3804a583d 100644 --- a/storage/tokudb/mysql-test/tokudb_mariadb/r/mdev6657.result +++ b/storage/tokudb/mysql-test/tokudb_mariadb/r/mdev6657.result @@ -10,7 +10,7 @@ col3 smallint(5) NOT NULL DEFAULT '1', filler varchar(255) DEFAULT NULL, KEY pk_ersatz(col1,col2,col3), KEY key1 (col1,col2) USING BTREE -) ENGINE=TokuDB DEFAULT CHARSET=latin1 PACK_KEYS=1 COMPRESSION=TOKUDB_LZMA; +) ENGINE=TokuDB DEFAULT CHARSET=latin1 PACK_KEYS=1; insert into t3 select 1300000000+a, 12345, 7890, 'data' from t2; insert into t3 select 1400000000+a, 12345, 7890, 'data' from t2; insert into t3 select 1410799999+a, 12345, 7890, 'data' from t2; @@ -34,7 +34,7 @@ from t3 where col1 <= 1410799999 order by col1 desc,col2 desc,col3 desc limit 1; id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t3 range pk_ersatz,key1 pk_ersatz 4 NULL 2001 Using where; Using index +1 SIMPLE t3 range pk_ersatz,key1 pk_ersatz 4 NULL # Using where; Using index # The same query but the constant is bigger. # The query should use range(PRIMARY), not full index scan: explain @@ -43,5 +43,5 @@ from t3 where col1 <= 1412199999 order by col1 desc, col2 desc, col3 desc limit 1; id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t3 range pk_ersatz,key1 pk_ersatz 4 NULL 15001 Using where; Using index +1 SIMPLE t3 range pk_ersatz,key1 pk_ersatz 4 NULL # Using where; Using index drop table t1,t2,t3; diff --git a/storage/tokudb/mysql-test/tokudb_mariadb/t/mdev6657.test b/storage/tokudb/mysql-test/tokudb_mariadb/t/mdev6657.test index a809c3faf..b723a5d72 100644 --- a/storage/tokudb/mysql-test/tokudb_mariadb/t/mdev6657.test +++ b/storage/tokudb/mysql-test/tokudb_mariadb/t/mdev6657.test @@ -15,7 +15,7 @@ CREATE TABLE t3 ( filler varchar(255) DEFAULT NULL, KEY pk_ersatz(col1,col2,col3), KEY key1 (col1,col2) USING BTREE -) ENGINE=TokuDB DEFAULT CHARSET=latin1 PACK_KEYS=1 COMPRESSION=TOKUDB_LZMA; +) ENGINE=TokuDB DEFAULT CHARSET=latin1 PACK_KEYS=1; insert into t3 select 1300000000+a, 12345, 7890, 'data' from t2; insert into t3 select 1400000000+a, 12345, 7890, 'data' from t2; @@ -35,6 +35,7 @@ insert into t3 select 1412099999+a, 12345, 7890, 'data' from t2; insert into t3 select 1412199999+a, 12345, 7890, 'data' from t2; --echo # The following must use range(PRIMARY): +--replace_column 9 # explain select col1,col2,col3 from t3 @@ -43,6 +44,7 @@ order by col1 desc,col2 desc,col3 desc limit 1; --echo # The same query but the constant is bigger. --echo # The query should use range(PRIMARY), not full index scan: +--replace_column 9 # explain select col1,col2,col3 from t3 diff --git a/storage/tokudb/tokudb_thread.h b/storage/tokudb/tokudb_thread.h index dec58f3fd..5df015990 100644 --- a/storage/tokudb/tokudb_thread.h +++ b/storage/tokudb/tokudb_thread.h @@ -111,7 +111,6 @@ class event_t { // wait for the event to become signalled void wait(void); - int wait(ulonglong microseconds); // signal the event void signal(void); @@ -152,7 +151,6 @@ class semaphore_t { // wait for the semaphore to become signalled E_WAIT wait(void); - E_WAIT wait(ulonglong microseconds); // signal the semaphore to increase the count // return true if signalled, false if ignored due to count @@ -372,28 +370,6 @@ inline void event_t::wait(void) { assert_debug(r == 0); return; } -inline int event_t::wait(ulonglong microseconds) { - timespec waittime = time::offset_timespec(microseconds); - int r = pthread_mutex_timedlock(&_mutex, &waittime); - if (r == ETIMEDOUT) return ETIMEDOUT; - assert_debug(r == 0); - while (_signalled == false && _pulsed == false) { - r = pthread_cond_timedwait(&_cond, &_mutex, &waittime); - if (r == ETIMEDOUT) { - r = pthread_mutex_unlock(&_mutex); - assert_debug(r == 0); - return ETIMEDOUT; - } - assert_debug(r == 0); - } - if (_manual_reset == false) - _signalled = false; - if (_pulsed) - _pulsed = false; - r = pthread_mutex_unlock(&_mutex); - assert_debug(r == 0); - return 0; -} inline void event_t::signal(void) { int r MY_ATTRIBUTE((unused)) = pthread_mutex_lock(&_mutex); assert_debug(r == 0); @@ -479,31 +455,6 @@ inline semaphore_t::E_WAIT semaphore_t::wait(void) { assert_debug(r == 0); return ret; } -inline semaphore_t::E_WAIT semaphore_t::wait(ulonglong microseconds) { - E_WAIT ret; - timespec waittime = time::offset_timespec(microseconds); - int r = pthread_mutex_timedlock(&_mutex, &waittime); - if (r == ETIMEDOUT) return E_TIMEDOUT; - assert_debug(r == 0); - while (_signalled == 0 && _interrupted == false) { - r = pthread_cond_timedwait(&_cond, &_mutex, &waittime); - if (r == ETIMEDOUT) { - r = pthread_mutex_unlock(&_mutex); - assert_debug(r == 0); - return E_TIMEDOUT; - } - assert_debug(r == 0); - } - if (_interrupted) { - ret = E_INTERRUPTED; - } else { - _signalled--; - ret = E_SIGNALLED; - } - r = pthread_mutex_unlock(&_mutex); - assert_debug(r == 0); - return ret; -} inline bool semaphore_t::signal(void) { bool ret = false; int r MY_ATTRIBUTE((unused)) = pthread_mutex_lock(&_mutex); diff --git a/storage/xtradb/CMakeLists.txt b/storage/xtradb/CMakeLists.txt index 67d068748..f5ec6fd74 100644 --- a/storage/xtradb/CMakeLists.txt +++ b/storage/xtradb/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2006, 2015, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2006, 2017, Oracle and/or its affiliates. All rights reserved. # # 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 @@ -509,9 +509,11 @@ MYSQL_ADD_PLUGIN(xtradb ${INNOBASE_SOURCES} STORAGE_ENGINE DEFAULT RECOMPILE_FOR_EMBEDDED LINK_LIBRARIES ${ZLIB_LIBRARY} ${LINKER_SCRIPT}) -IF(TARGET xtradb AND NOT XTRADB_OK) - MESSAGE(FATAL_ERROR "Percona XtraDB is not supported on this platform") +IF(TARGET xtradb) + IF(NOT XTRADB_OK) + MESSAGE(FATAL_ERROR "Percona XtraDB is not supported on this platform") + ENDIF() + ADD_DEPENDENCIES(xtradb GenError) ENDIF() ADD_SUBDIRECTORY(${CMAKE_SOURCE_DIR}/extra/mariabackup ${CMAKE_BINARY_DIR}/extra/mariabackup) - diff --git a/storage/xtradb/btr/btr0defragment.cc b/storage/xtradb/btr/btr0defragment.cc index 44acd9118..3124db650 100644 --- a/storage/xtradb/btr/btr0defragment.cc +++ b/storage/xtradb/btr/btr0defragment.cc @@ -40,56 +40,6 @@ Modified 30/07/2014 Jan Lindström jan.lindstrom@mariadb.com #include -/**************************************************//** -Custom nullptr implementation for under g++ 4.6 -*******************************************************/ -/* -// #pragma once -namespace std -{ - // based on SC22/WG21/N2431 = J16/07-0301 - struct nullptr_t - { - template operator any * () const - { - return 0; - } - template operator T any:: * () const - { - return 0; - } - -#ifdef _MSC_VER - struct pad {}; - pad __[sizeof(void*)/sizeof(pad)]; -#else - char __[sizeof(void*)]; -#endif -private: - // nullptr_t();// {} - // nullptr_t(const nullptr_t&); - // void operator = (const nullptr_t&); - void operator &() const; - template void operator +(any) const - { - // I Love MSVC 2005! - } - template void operator -(any) const - { - // I Love MSVC 2005! - } - }; -static const nullptr_t __nullptr = {}; -} - -#ifndef nullptr -#define nullptr std::__nullptr -#endif -*/ -/**************************************************//** -End of Custom nullptr implementation for under g++ 4.6 -*******************************************************/ - /* When there's no work, either because defragment is disabled, or because no query is submitted, thread checks state every BTR_DEFRAGMENT_SLEEP_IN_USECS.*/ #define BTR_DEFRAGMENT_SLEEP_IN_USECS 1000000 diff --git a/storage/xtradb/btr/btr0sea.cc b/storage/xtradb/btr/btr0sea.cc index 12c99246f..713a584ee 100644 --- a/storage/xtradb/btr/btr0sea.cc +++ b/storage/xtradb/btr/btr0sea.cc @@ -2,6 +2,7 @@ Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2008, Google Inc. +Copyright (c) 2018, MariaDB Corporation. Portions of this file contain modifications contributed and copyrighted by Google, Inc. Those modifications are gratefully acknowledged and are described @@ -1299,17 +1300,11 @@ btr_search_drop_page_hash_index( mem_free(folds); } -/********************************************************************//** -Drops a possible page hash index when a page is evicted from the buffer pool -or freed in a file segment. */ +/** Drop possible adaptive hash index entries when a page is evicted +from the buffer pool or freed in a file, or the index is being dropped. */ UNIV_INTERN void -btr_search_drop_page_hash_when_freed( -/*=================================*/ - ulint space, /*!< in: space id */ - ulint zip_size, /*!< in: compressed page size in bytes - or 0 for uncompressed pages */ - ulint page_no) /*!< in: page number */ +btr_search_drop_page_hash_when_freed(ulint space, ulint page_no) { buf_block_t* block; mtr_t mtr; @@ -1322,7 +1317,7 @@ btr_search_drop_page_hash_when_freed( are possibly holding, we cannot s-latch the page, but must (recursively) x-latch it, even though we are only reading. */ - block = buf_page_get_gen(space, zip_size, page_no, RW_X_LATCH, NULL, + block = buf_page_get_gen(space, 0, page_no, RW_X_LATCH, NULL, BUF_PEEK_IF_IN_POOL, __FILE__, __LINE__, &mtr); diff --git a/storage/xtradb/buf/buf0buf.cc b/storage/xtradb/buf/buf0buf.cc index 80ff1c14a..3ae6dd565 100644 --- a/storage/xtradb/buf/buf0buf.cc +++ b/storage/xtradb/buf/buf0buf.cc @@ -2,7 +2,7 @@ Copyright (c) 1995, 2016, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2008, Google Inc. -Copyright (c) 2013, 2017, MariaDB Corporation. +Copyright (c) 2013, 2018, MariaDB Corporation. Portions of this file contain modifications contributed and copyrighted by Google, Inc. Those modifications are gratefully acknowledged and are described @@ -77,15 +77,6 @@ Created 11/5/1995 Heikki Tuuri #include "snappy-c.h" #endif -/** Decrypt a page. -@param[in,out] bpage Page control block -@param[in,out] space tablespace -@return whether the operation was successful */ -static -bool -buf_page_decrypt_after_read(buf_page_t* bpage, fil_space_t* space) - MY_ATTRIBUTE((nonnull)); - /********************************************************************//** Mark a table with the specified space pointed by bpage->space corrupted. Also remove the bpage from LRU list. @@ -390,6 +381,143 @@ on the io_type */ ? (counter##_READ) \ : (counter##_WRITTEN)) + +/** Reserve a buffer slot for encryption, decryption or page compression. +@param[in,out] buf_pool buffer pool +@return reserved buffer slot */ +static buf_tmp_buffer_t* buf_pool_reserve_tmp_slot(buf_pool_t* buf_pool) +{ + for (ulint i = 0; i < buf_pool->tmp_arr->n_slots; i++) { + buf_tmp_buffer_t* slot = &buf_pool->tmp_arr->slots[i]; + if (slot->acquire()) { + return slot; + } + } + + /* We assume that free slot is found */ + ut_error; + return NULL; +} + +/** Reserve a buffer for encryption, decryption or decompression. +@param[in,out] slot reserved slot */ +static void buf_tmp_reserve_crypt_buf(buf_tmp_buffer_t* slot) +{ + if (!slot->crypt_buf) { + slot->crypt_buf = static_cast( + aligned_malloc(srv_page_size, srv_page_size)); + } +} + +/** Reserve a buffer for compression. +@param[in,out] slot reserved slot */ +static void buf_tmp_reserve_compression_buf(buf_tmp_buffer_t* slot) +{ + if (!slot->comp_buf) { + /* Both snappy and lzo compression methods require that + output buffer used for compression is bigger than input + buffer. Increase the allocated buffer size accordingly. */ + ulint size = srv_page_size; +#ifdef HAVE_LZO + size += LZO1X_1_15_MEM_COMPRESS; +#elif defined HAVE_SNAPPY + size = snappy_max_compressed_length(size); +#endif + slot->comp_buf = static_cast( + aligned_malloc(size, srv_page_size)); + } +} + +/** Decrypt a page. +@param[in,out] bpage Page control block +@param[in,out] space tablespace +@return whether the operation was successful */ +static bool buf_page_decrypt_after_read(buf_page_t* bpage, fil_space_t* space) +{ + ut_ad(space->n_pending_ios > 0); + ut_ad(space->id == bpage->space); + + byte* dst_frame = bpage->zip.data ? bpage->zip.data : + ((buf_block_t*) bpage)->frame; + bool page_compressed = fil_page_is_compressed(dst_frame); + buf_pool_t* buf_pool = buf_pool_from_bpage(bpage); + + if (bpage->offset == 0) { + /* File header pages are not encrypted/compressed */ + return true; + } + + /* Page is encrypted if encryption information is found from + tablespace and page contains used key_version. This is true + also for pages first compressed and then encrypted. */ + + buf_tmp_buffer_t* slot; + + if (page_compressed) { + /* the page we read is unencrypted */ + /* Find free slot from temporary memory array */ +decompress: + slot = buf_pool_reserve_tmp_slot(buf_pool); + /* For decompression, use crypt_buf. */ + buf_tmp_reserve_crypt_buf(slot); +decompress_with_slot: + ut_d(fil_page_type_validate(dst_frame)); + + bpage->write_size = fil_page_decompress(slot->crypt_buf, + dst_frame); + slot->release(); + + ut_ad(!bpage->write_size || fil_page_type_validate(dst_frame)); + ut_ad(space->n_pending_ios > 0); + return bpage->write_size != 0; + } + + if (space->crypt_data + && mach_read_from_4(FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION + + dst_frame)) { + /* Verify encryption checksum before we even try to + decrypt. */ + if (!fil_space_verify_crypt_checksum( + dst_frame, buf_page_get_zip_size(bpage), NULL, + bpage->offset)) { +decrypt_failed: + /* Mark page encrypted in case it should be. */ + if (space->crypt_data->type + != CRYPT_SCHEME_UNENCRYPTED) { + bpage->encrypted = true; + } + + return false; + } + + /* Find free slot from temporary memory array */ + slot = buf_pool_reserve_tmp_slot(buf_pool); + buf_tmp_reserve_crypt_buf(slot); + + ut_d(fil_page_type_validate(dst_frame)); + + /* decrypt using crypt_buf to dst_frame */ + if (!fil_space_decrypt(space, slot->crypt_buf, + dst_frame, &bpage->encrypted)) { + slot->release(); + goto decrypt_failed; + } + + ut_d(fil_page_type_validate(dst_frame)); + + if (fil_page_is_compressed_encrypted(dst_frame)) { + goto decompress_with_slot; + } + + slot->release(); + } else if (fil_page_is_compressed_encrypted(dst_frame)) { + goto decompress; + } + + ut_ad(space->n_pending_ios > 0); + return true; +} + /********************************************************************//** Gets the smallest oldest_modification lsn for any page in the pool. Returns zero if all modified pages have been flushed to disk. @@ -2969,17 +3097,18 @@ buf_page_get_gen( #ifdef UNIV_DEBUG switch (mode) { case BUF_EVICT_IF_IN_POOL: + case BUF_PEEK_IF_IN_POOL: /* After DISCARD TABLESPACE, the tablespace would not exist, but in IMPORT TABLESPACE, PageConverter::operator() must replace any old pages, which were not evicted during DISCARD. - Skip the assertion on zip_size. */ + Similarly, btr_search_drop_page_hash_when_freed() must + remove any old pages. Skip the assertion on zip_size. */ break; case BUF_GET_NO_LATCH: ut_ad(rw_latch == RW_NO_LATCH); /* fall through */ case BUF_GET: case BUF_GET_IF_IN_POOL: - case BUF_PEEK_IF_IN_POOL: case BUF_GET_IF_IN_POOL_OR_WATCH: case BUF_GET_POSSIBLY_FREED: ut_ad(zip_size == fil_space_get_zip_size(space)); @@ -3088,6 +3217,11 @@ buf_page_get_gen( ibuf_inside(mtr), trx); retries = 0; + } else if (mode == BUF_GET_POSSIBLY_FREED) { + if (err) { + *err = local_err; + } + return NULL; } else if (retries < BUF_PAGE_READ_MAX_RETRIES) { ++retries; @@ -3151,7 +3285,8 @@ buf_page_get_gen( fix_mutex = buf_page_get_mutex(&fix_block->page); - ut_ad(page_zip_get_size(&block->page.zip) == zip_size); + ut_ad(page_zip_get_size(&block->page.zip) == zip_size + || mode == BUF_PEEK_IF_IN_POOL); switch (mode) { case BUF_GET_IF_IN_POOL: @@ -3369,6 +3504,8 @@ buf_page_get_gen( mutex_enter(&buf_pool->LRU_list_mutex); buf_block_unfix(fix_block); mutex_exit(&buf_pool->LRU_list_mutex); + + *err = DB_PAGE_CORRUPTED; return NULL; } } @@ -4684,9 +4821,9 @@ buf_page_check_corrupt(buf_page_t* bpage, fil_space_t* space) ib_logf(IB_LOG_LEVEL_ERROR, "The page [page id: space=%u" ", page number=%u]" - " in file %s cannot be decrypted.", + " in file '%s' cannot be decrypted.", bpage->space, bpage->offset, - space->name); + space->chain.start->name); ib_logf(IB_LOG_LEVEL_INFO, "However key management plugin or used key_version " ULINTPF @@ -4721,7 +4858,6 @@ buf_page_io_complete(buf_page_t* bpage) const ibool uncompressed = (buf_page_get_state(bpage) == BUF_BLOCK_FILE_PAGE); bool have_LRU_mutex = false; - byte* frame = NULL; dberr_t err = DB_SUCCESS; ut_a(buf_page_in_file(bpage)); @@ -4739,19 +4875,18 @@ buf_page_io_complete(buf_page_t* bpage) ulint read_page_no = 0; ulint read_space_id = 0; uint key_version = 0; - - ut_ad(bpage->zip.data || ((buf_block_t*)bpage)->frame); + byte* frame = bpage->zip.data + ? bpage->zip.data + : reinterpret_cast(bpage)->frame; + ut_ad(frame); fil_space_t* space = fil_space_acquire_for_io(bpage->space); if (!space) { return(DB_TABLESPACE_DELETED); } - buf_page_decrypt_after_read(bpage, space); - - if (buf_page_get_zip_size(bpage)) { - frame = bpage->zip.data; - } else { - frame = ((buf_block_t*) bpage)->frame; + if (!buf_page_decrypt_after_read(bpage, space)) { + err = DB_DECRYPTION_FAILED; + goto database_corrupted; } if (buf_page_get_zip_size(bpage)) { @@ -4932,7 +5067,7 @@ buf_page_io_complete(buf_page_t* bpage) /* io_type == BUF_IO_WRITE */ if (bpage->slot) { /* Mark slot free */ - bpage->slot->reserved = false; + bpage->slot->release(); bpage->slot = NULL; } } @@ -6231,66 +6366,6 @@ buf_pool_mutex_exit( mutex_exit(&buf_pool->LRU_list_mutex); } -/********************************************************************//** -Reserve unused slot from temporary memory array and allocate necessary -temporary memory if not yet allocated. -@return reserved slot */ -UNIV_INTERN -buf_tmp_buffer_t* -buf_pool_reserve_tmp_slot( -/*======================*/ - buf_pool_t* buf_pool, /*!< in: buffer pool where to - reserve */ - bool compressed) /*!< in: is file space compressed */ -{ - buf_tmp_buffer_t *free_slot=NULL; - - /* Array is protected by buf_pool mutex */ - buf_pool_mutex_enter(buf_pool); - - for(ulint i = 0; i < buf_pool->tmp_arr->n_slots; i++) { - buf_tmp_buffer_t *slot = &buf_pool->tmp_arr->slots[i]; - - if(slot->reserved == false) { - free_slot = slot; - break; - } - } - - /* We assume that free slot is found */ - ut_a(free_slot != NULL); - free_slot->reserved = true; - /* Now that we have reserved this slot we can release - buf_pool mutex */ - buf_pool_mutex_exit(buf_pool); - - /* Allocate temporary memory for encryption/decryption */ - if (free_slot->crypt_buf == NULL) { - free_slot->crypt_buf = static_cast(aligned_malloc(UNIV_PAGE_SIZE, UNIV_PAGE_SIZE)); - memset(free_slot->crypt_buf, 0, UNIV_PAGE_SIZE); - } - - /* For page compressed tables allocate temporary memory for - compression/decompression */ - if (compressed && free_slot->comp_buf == NULL) { - ulint size = UNIV_PAGE_SIZE; - - /* Both snappy and lzo compression methods require that - output buffer used for compression is bigger than input - buffer. Increase the allocated buffer size accordingly. */ -#if HAVE_SNAPPY - size = snappy_max_compressed_length(size); -#endif -#if HAVE_LZO - size += LZO1X_1_15_MEM_COMPRESS; -#endif - free_slot->comp_buf = static_cast(aligned_malloc(size, UNIV_PAGE_SIZE)); - memset(free_slot->comp_buf, 0, size); - } - - return (free_slot); -} - /** Encryption and page_compression hook that is called just before a page is written to disk. @param[in,out] space tablespace @@ -6340,16 +6415,18 @@ buf_page_encrypt_before_write( } ulint zip_size = buf_page_get_zip_size(bpage); - ulint page_size = (zip_size) ? zip_size : UNIV_PAGE_SIZE; + ut_ad(!zip_size || !page_compressed); buf_pool_t* buf_pool = buf_pool_from_bpage(bpage); /* Find free slot from temporary memory array */ - buf_tmp_buffer_t* slot = buf_pool_reserve_tmp_slot(buf_pool, page_compressed); + buf_tmp_buffer_t* slot = buf_pool_reserve_tmp_slot(buf_pool); slot->out_buf = NULL; bpage->slot = slot; + buf_tmp_reserve_crypt_buf(slot); byte *dst_frame = slot->crypt_buf; if (!page_compressed) { +not_compressed: /* Encrypt page content */ byte* tmp = fil_space_encrypt(space, bpage->offset, @@ -6357,32 +6434,28 @@ buf_page_encrypt_before_write( src_frame, dst_frame); - bpage->real_size = page_size; + bpage->real_size = UNIV_PAGE_SIZE; slot->out_buf = dst_frame = tmp; ut_d(fil_page_type_validate(tmp)); } else { /* First we compress the page content */ - ulint out_len = 0; - - byte *tmp = fil_compress_page( - space, - (byte *)src_frame, - slot->comp_buf, - page_size, + buf_tmp_reserve_compression_buf(slot); + byte* tmp = slot->comp_buf; + ulint out_len = fil_page_compress( + src_frame, tmp, fsp_flags_get_page_compression_level(space->flags), fil_space_get_block_size(space, bpage->offset), - encrypted, - &out_len); + encrypted); + if (!out_len) { + goto not_compressed; + } bpage->real_size = out_len; -#ifdef UNIV_DEBUG - fil_page_type_validate(tmp); -#endif - - if(encrypted) { + ut_d(fil_page_type_validate(tmp)); + if (encrypted) { /* And then we encrypt the page content */ tmp = fil_space_encrypt(space, bpage->offset, @@ -6394,130 +6467,8 @@ buf_page_encrypt_before_write( slot->out_buf = dst_frame = tmp; } -#ifdef UNIV_DEBUG - fil_page_type_validate(dst_frame); -#endif + ut_d(fil_page_type_validate(dst_frame)); // return dst_frame which will be written return dst_frame; } - -/** Decrypt a page. -@param[in,out] bpage Page control block -@param[in,out] space tablespace -@return whether the operation was successful */ -static -bool -buf_page_decrypt_after_read(buf_page_t* bpage, fil_space_t* space) -{ - ut_ad(space->n_pending_ios > 0); - ut_ad(space->id == bpage->space); - - ulint zip_size = buf_page_get_zip_size(bpage); - ulint size = (zip_size) ? zip_size : UNIV_PAGE_SIZE; - - byte* dst_frame = (zip_size) ? bpage->zip.data : - ((buf_block_t*) bpage)->frame; - unsigned key_version = - mach_read_from_4(dst_frame + FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION); - bool page_compressed = fil_page_is_compressed(dst_frame); - bool page_compressed_encrypted = fil_page_is_compressed_encrypted(dst_frame); - buf_pool_t* buf_pool = buf_pool_from_bpage(bpage); - bool success = true; - - if (bpage->offset == 0) { - /* File header pages are not encrypted/compressed */ - return (true); - } - - /* Page is encrypted if encryption information is found from - tablespace and page contains used key_version. This is true - also for pages first compressed and then encrypted. */ - if (!space->crypt_data) { - key_version = 0; - } - - if (page_compressed) { - /* the page we read is unencrypted */ - /* Find free slot from temporary memory array */ - buf_tmp_buffer_t* slot = buf_pool_reserve_tmp_slot(buf_pool, page_compressed); - -#ifdef UNIV_DEBUG - fil_page_type_validate(dst_frame); -#endif - - /* decompress using comp_buf to dst_frame */ - fil_decompress_page(slot->comp_buf, - dst_frame, - ulong(size), - &bpage->write_size); - - /* Mark this slot as free */ - slot->reserved = false; - key_version = 0; - -#ifdef UNIV_DEBUG - fil_page_type_validate(dst_frame); -#endif - } else { - buf_tmp_buffer_t* slot = NULL; - - if (key_version) { - /* Verify encryption checksum before we even try to - decrypt. */ - if (!fil_space_verify_crypt_checksum(dst_frame, - zip_size, NULL, bpage->offset)) { - - /* Mark page encrypted in case it should - be. */ - if (space->crypt_data->type - != CRYPT_SCHEME_UNENCRYPTED) { - bpage->encrypted = true; - } - - return (false); - } - - /* Find free slot from temporary memory array */ - slot = buf_pool_reserve_tmp_slot(buf_pool, page_compressed); - -#ifdef UNIV_DEBUG - fil_page_type_validate(dst_frame); -#endif - - /* decrypt using crypt_buf to dst_frame */ - if (!fil_space_decrypt(space, slot->crypt_buf, - dst_frame, &bpage->encrypted)) { - success = false; - } - -#ifdef UNIV_DEBUG - fil_page_type_validate(dst_frame); -#endif - } - - if (page_compressed_encrypted && success) { - if (!slot) { - slot = buf_pool_reserve_tmp_slot(buf_pool, page_compressed); - } - -#ifdef UNIV_DEBUG - fil_page_type_validate(dst_frame); -#endif - /* decompress using comp_buf to dst_frame */ - fil_decompress_page(slot->comp_buf, - dst_frame, - ulong(size), - &bpage->write_size); - ut_d(fil_page_type_validate(dst_frame)); - } - - /* Mark this slot as free */ - if (slot) { - slot->reserved = false; - } - } - - ut_ad(space->n_pending_ios > 0); - return (success); -} diff --git a/storage/xtradb/buf/buf0dblwr.cc b/storage/xtradb/buf/buf0dblwr.cc index ee8c85446..0ec23cbdb 100644 --- a/storage/xtradb/buf/buf0dblwr.cc +++ b/storage/xtradb/buf/buf0dblwr.cc @@ -510,10 +510,11 @@ buf_dblwr_process() "Restoring possible half-written data pages " "from the doublewrite buffer..."); - unaligned_read_buf = static_cast(ut_malloc(2 * UNIV_PAGE_SIZE)); + unaligned_read_buf = static_cast(ut_malloc(3 * UNIV_PAGE_SIZE)); read_buf = static_cast( ut_align(unaligned_read_buf, UNIV_PAGE_SIZE)); + byte* const buf = read_buf + UNIV_PAGE_SIZE; for (std::list::iterator i = recv_dblwr.pages.begin(); i != recv_dblwr.pages.end(); ++i, ++page_no_dblwr ) { @@ -562,24 +563,26 @@ buf_dblwr_process() ignore this page (there should be redo log records to initialize it). */ } else { - if (fil_page_is_compressed_encrypted(read_buf) || - fil_page_is_compressed(read_buf)) { - /* Decompress the page before - validating the checksum. */ - fil_decompress_page( - NULL, read_buf, srv_page_size, - NULL, true); + /* Decompress the page before + validating the checksum. */ + ulint decomp = fil_page_decompress(buf, read_buf); + if (!decomp) { + goto bad; + } + if (!decomp || (decomp != srv_page_size && zip_size)) { + goto bad; } if (fil_space_verify_crypt_checksum( - read_buf, zip_size, NULL, page_no) - || !buf_page_is_corrupted( - true, read_buf, zip_size, space())) { + read_buf, zip_size, NULL, page_no) + || !buf_page_is_corrupted( + true, read_buf, zip_size, space())) { /* The page is good; there is no need to consult the doublewrite buffer. */ continue; } +bad: /* We intentionally skip this message for is_all_zero pages. */ ib_logf(IB_LOG_LEVEL_INFO, @@ -588,18 +591,15 @@ buf_dblwr_process() space_id, page_no); } - /* Next, validate the doublewrite page. */ - if (fil_page_is_compressed_encrypted(page) || - fil_page_is_compressed(page)) { - /* Decompress the page before - validating the checksum. */ - fil_decompress_page( - NULL, page, srv_page_size, NULL, true); + ulint decomp = fil_page_decompress(buf, page); + if (!decomp || (decomp != srv_page_size && zip_size)) { + goto bad_doublewrite; } - - if (!fil_space_verify_crypt_checksum(page, zip_size, NULL, page_no) + if (!fil_space_verify_crypt_checksum(page, zip_size, NULL, + page_no) && buf_page_is_corrupted(true, page, zip_size, space)) { if (!is_all_zero) { +bad_doublewrite: ib_logf(IB_LOG_LEVEL_WARN, "A doublewrite copy of page " ULINTPF ":" ULINTPF " is corrupted.", diff --git a/storage/xtradb/buf/buf0dump.cc b/storage/xtradb/buf/buf0dump.cc index bf384390a..ce21a3089 100644 --- a/storage/xtradb/buf/buf0dump.cc +++ b/storage/xtradb/buf/buf0dump.cc @@ -42,6 +42,7 @@ Created April 08, 2011 Vasil Dimov #include "ut0byte.h" /* ut_ull_create() */ #include "ut0sort.h" /* UT_SORT_FUNCTION_BODY */ #include "mysql/service_wsrep.h" /* wsrep_recovery */ +#include enum status_severity { STATUS_INFO, @@ -216,7 +217,20 @@ buf_dump( buf_dump_status(STATUS_NOTICE, "Dumping buffer pool(s) to %s", full_filename); - f = fopen(tmp_filename, "w"); +#if defined(__GLIBC__) || defined(__WIN__) || O_CLOEXEC == 0 + f = fopen(tmp_filename, "w" STR_O_CLOEXEC); +#else + { + int fd; + fd = open(tmp_filename, O_CREAT | O_TRUNC | O_CLOEXEC | O_WRONLY, 0640); + if (fd >= 0) { + f = fdopen(fd, "w"); + } + else { + f = NULL; + } + } +#endif if (f == NULL) { buf_dump_status(STATUS_ERR, "Cannot open '%s' for writing: %s", @@ -320,6 +334,14 @@ buf_dump( i + 1, srv_buf_pool_instances, j + 1, n_pages); } + if ( (j % 1024) == 0) { + service_manager_extend_timeout(INNODB_EXTEND_TIMEOUT_INTERVAL, + "Dumping buffer pool " + ULINTPF "/" ULINTPF ", " + "page " ULINTPF "/" ULINTPF, + i + 1, srv_buf_pool_instances, + j + 1, n_pages); + } } ut_free(dump); diff --git a/storage/xtradb/buf/buf0flu.cc b/storage/xtradb/buf/buf0flu.cc index abbcd5141..de59bbcd4 100644 --- a/storage/xtradb/buf/buf0flu.cc +++ b/storage/xtradb/buf/buf0flu.cc @@ -54,6 +54,8 @@ Created 11/11/1995 Heikki Tuuri #include "mysql/service_thd_wait.h" #include "fil0pagecompress.h" +#include + /** Number of pages flushed through non flush_list flushes. */ // static ulint buf_lru_flush_page_count = 0; @@ -575,6 +577,17 @@ buf_flush_remove( buf_pool_t* buf_pool = buf_pool_from_bpage(bpage); ulint zip_size; +#if 0 // FIXME: Rate-limit the output. Move this to the page cleaner? + if (UNIV_UNLIKELY(srv_shutdown_state == SRV_SHUTDOWN_FLUSH_PHASE)) { + service_manager_extend_timeout( + INNODB_EXTEND_TIMEOUT_INTERVAL, + "Flush and remove page with tablespace id %u" + ", Poolid " ULINTPF ", flush list length " ULINTPF, + bpage->space, buf_pool->instance_no, + UT_LIST_GET_LEN(buf_pool->flush_list)); + } +#endif + ut_ad(mutex_own(buf_page_get_mutex(bpage))); #if defined UNIV_DEBUG || defined UNIV_BUF_DEBUG ut_ad(buf_page_get_state(bpage) != BUF_BLOCK_ZIP_DIRTY diff --git a/storage/xtradb/buf/buf0lru.cc b/storage/xtradb/buf/buf0lru.cc index 7bf423ed7..2c4a4049d 100644 --- a/storage/xtradb/buf/buf0lru.cc +++ b/storage/xtradb/buf/buf0lru.cc @@ -238,8 +238,6 @@ void buf_LRU_drop_page_hash_batch( /*=========================*/ ulint space_id, /*!< in: space id */ - ulint zip_size, /*!< in: compressed page size in bytes - or 0 for uncompressed pages */ const ulint* arr, /*!< in: array of page_no */ ulint count) /*!< in: number of entries in array */ { @@ -249,8 +247,7 @@ buf_LRU_drop_page_hash_batch( ut_ad(count <= BUF_LRU_DROP_SEARCH_SIZE); for (i = 0; i < count; ++i) { - btr_search_drop_page_hash_when_freed(space_id, zip_size, - arr[i]); + btr_search_drop_page_hash_when_freed(space_id, arr[i]); } } @@ -269,15 +266,6 @@ buf_LRU_drop_page_hash_for_tablespace( buf_page_t* bpage; ulint* page_arr; ulint num_entries; - ulint zip_size; - - zip_size = fil_space_get_zip_size(id); - - if (UNIV_UNLIKELY(zip_size == ULINT_UNDEFINED)) { - /* Somehow, the tablespace does not exist. Nothing to drop. */ - ut_ad(0); - return; - } page_arr = static_cast(ut_malloc( sizeof(ulint) * BUF_LRU_DROP_SEARCH_SIZE)); @@ -331,8 +319,7 @@ buf_LRU_drop_page_hash_for_tablespace( the latching order. */ mutex_exit(&buf_pool->LRU_list_mutex); - buf_LRU_drop_page_hash_batch( - id, zip_size, page_arr, num_entries); + buf_LRU_drop_page_hash_batch(id, page_arr, num_entries); num_entries = 0; @@ -363,10 +350,32 @@ buf_LRU_drop_page_hash_for_tablespace( mutex_exit(&buf_pool->LRU_list_mutex); /* Drop any remaining batch of search hashed pages. */ - buf_LRU_drop_page_hash_batch(id, zip_size, page_arr, num_entries); + buf_LRU_drop_page_hash_batch(id, page_arr, num_entries); ut_free(page_arr); } +/** Drop the adaptive hash index for a tablespace. +@param[in,out] table table */ +UNIV_INTERN void buf_LRU_drop_page_hash_for_tablespace(dict_table_t* table) +{ + for (dict_index_t* index = dict_table_get_first_index(table); + index != NULL; + index = dict_table_get_next_index(index)) { + if (btr_search_info_get_ref_count(btr_search_get_info(index), + index)) { + goto drop_ahi; + } + } + + return; +drop_ahi: + ulint id = table->space; + for (ulint i = 0; i < srv_buf_pool_instances; i++) { + buf_LRU_drop_page_hash_for_tablespace(buf_pool_from_array(i), + id); + } +} + /******************************************************************//** While flushing (or removing dirty) pages from a tablespace we don't want to hog the CPU and resources. Release the buffer pool and block @@ -733,18 +742,11 @@ buf_flush_dirty_pages(buf_pool_t* buf_pool, ulint id, const trx_t* trx) /** Empty the flush list for all pages belonging to a tablespace. @param[in] id tablespace identifier @param[in] trx transaction, for checking for user interrupt; - or NULL if nothing is to be written -@param[in] drop_ahi whether to drop the adaptive hash index */ -UNIV_INTERN -void -buf_LRU_flush_or_remove_pages(ulint id, const trx_t* trx, bool drop_ahi) + or NULL if nothing is to be written */ +UNIV_INTERN void buf_LRU_flush_or_remove_pages(ulint id, const trx_t* trx) { for (ulint i = 0; i < srv_buf_pool_instances; i++) { - buf_pool_t* buf_pool = buf_pool_from_array(i); - if (drop_ahi) { - buf_LRU_drop_page_hash_for_tablespace(buf_pool, id); - } - buf_flush_dirty_pages(buf_pool, id, trx); + buf_flush_dirty_pages(buf_pool_from_array(i), id, trx); } if (trx && !trx_is_interrupted(trx)) { diff --git a/storage/xtradb/dict/dict0crea.cc b/storage/xtradb/dict/dict0crea.cc index 6d5b12474..2fe9f8af4 100644 --- a/storage/xtradb/dict/dict0crea.cc +++ b/storage/xtradb/dict/dict0crea.cc @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2017, MariaDB Corporation. +Copyright (c) 2017, 2018, MariaDB Corporation. 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 @@ -327,10 +327,8 @@ dict_build_table_def_step( mtr_commit(&mtr); } else { - /* Create in the system tablespace: disallow Barracuda - features by keeping only the first bit which says whether - the row format is redundant or compact */ - table->flags &= DICT_TF_COMPACT; + /* Create in the system tablespace */ + ut_ad(table->space == TRX_SYS_SPACE); } row = dict_create_sys_tables_tuple(table, node->heap); diff --git a/storage/xtradb/dict/dict0dict.cc b/storage/xtradb/dict/dict0dict.cc index 9257321c7..7ade6d79a 100644 --- a/storage/xtradb/dict/dict0dict.cc +++ b/storage/xtradb/dict/dict0dict.cc @@ -1,8 +1,8 @@ /***************************************************************************** -Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 1996, 2017, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2012, Facebook Inc. -Copyright (c) 2013, 2017, MariaDB Corporation. +Copyright (c) 2013, 2018, MariaDB Corporation. 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 @@ -507,7 +507,8 @@ dict_table_try_drop_aborted( ut_ad(table->id == table_id); } - if (table && table->n_ref_count == ref_count && table->drop_aborted) { + if (table && table->n_ref_count == ref_count && table->drop_aborted + && !UT_LIST_GET_FIRST(table->locks)) { /* Silence a debug assertion in row_merge_drop_indexes(). */ ut_d(table->n_ref_count++); row_merge_drop_indexes(trx, table, TRUE); @@ -1679,7 +1680,7 @@ dict_table_rename_in_cache( filepath = fil_make_ibd_name(table->name, false); } - fil_delete_tablespace(table->space, true); + fil_delete_tablespace(table->space); /* Delete any temp file hanging around. */ if (os_file_status(filepath, &exists, &ftype) @@ -2080,6 +2081,30 @@ dict_table_remove_from_cache_low( foreign->referenced_index = NULL; } + /* The check for dropped index should happen before we release + all the indexes */ + + if (lru_evict && table->drop_aborted) { + /* When evicting the table definition, + drop the orphan indexes from the data dictionary + and free the index pages. */ + trx_t* trx = trx_allocate_for_background(); + + ut_ad(mutex_own(&dict_sys->mutex)); +#ifdef UNIV_SYNC_DEBUG + ut_ad(rw_lock_own(&dict_operation_lock, RW_LOCK_EX)); +#endif /* UNIV_SYNC_DEBUG */ + /* Mimic row_mysql_lock_data_dictionary(). */ + trx->dict_operation_lock_mode = RW_X_LATCH; + + trx_set_dict_operation(trx, TRX_DICT_OP_INDEX); + row_merge_drop_indexes_dict(trx, table->id); + + trx_commit_for_mysql(trx); + trx->dict_operation_lock_mode = 0; + trx_free_for_background(trx); + } + /* Remove the indexes from the cache */ for (index = UT_LIST_GET_LAST(table->indexes); @@ -2112,27 +2137,6 @@ dict_table_remove_from_cache_low( dict_table_autoinc_store(table); } - if (lru_evict && table->drop_aborted) { - /* When evicting the table definition, - drop the orphan indexes from the data dictionary - and free the index pages. */ - trx_t* trx = trx_allocate_for_background(); - - ut_ad(mutex_own(&dict_sys->mutex)); -#ifdef UNIV_SYNC_DEBUG - ut_ad(rw_lock_own(&dict_operation_lock, RW_LOCK_EX)); -#endif /* UNIV_SYNC_DEBUG */ - /* Mimic row_mysql_lock_data_dictionary(). */ - trx->dict_operation_lock_mode = RW_X_LATCH; - - trx_set_dict_operation(trx, TRX_DICT_OP_INDEX); - row_merge_drop_indexes_dict(trx, table->id); - - trx_commit_for_mysql(trx); - trx->dict_operation_lock_mode = 0; - trx_free_for_background(trx); - } - dict_mem_table_free(table); } @@ -2725,36 +2729,12 @@ dict_index_remove_from_cache_low( zero. See also: dict_table_can_be_evicted() */ do { - ulint ref_count = btr_search_info_get_ref_count(info, - index); - - if (ref_count == 0) { + if (!btr_search_info_get_ref_count(info, index)) { break; } - /* Sleep for 10ms before trying again. */ - os_thread_sleep(10000); - ++retries; - - if (retries % 500 == 0) { - /* No luck after 5 seconds of wait. */ - fprintf(stderr, "InnoDB: Error: Waited for" - " %lu secs for hash index" - " ref_count (%lu) to drop" - " to 0.\n" - "index: \"%s\"" - " table: \"%s\"\n", - retries/100, - ref_count, - index->name, - table->name); - } - - /* To avoid a hang here we commit suicide if the - ref_count doesn't drop to zero in 600 seconds. */ - if (retries >= 60000) { - ut_error; - } + buf_LRU_drop_page_hash_for_tablespace(table); + ut_a(++retries < 10000); } while (srv_shutdown_state == SRV_SHUTDOWN_NONE || !lru_evict); rw_lock_free(&index->lock); diff --git a/storage/xtradb/dict/dict0load.cc b/storage/xtradb/dict/dict0load.cc index 6171bbd80..fb14a9058 100644 --- a/storage/xtradb/dict/dict0load.cc +++ b/storage/xtradb/dict/dict0load.cc @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2016, 2017, MariaDB Corporation. +Copyright (c) 2016, 2018, MariaDB Corporation. 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 @@ -2088,10 +2088,12 @@ dict_load_table_low( ulint flags2; if (rec_get_deleted_flag(rec, 0)) { + *table = NULL; return("delete-marked record in SYS_TABLES"); } if (rec_get_n_fields_old(rec) != DICT_NUM_FIELDS__SYS_TABLES) { + *table = NULL; return("wrong number of columns in SYS_TABLES record"); } @@ -2099,6 +2101,7 @@ dict_load_table_low( rec, DICT_FLD__SYS_TABLES__NAME, &len); if (len == 0 || len == UNIV_SQL_NULL) { err_len: + *table = NULL; return("incorrect column length in SYS_TABLES"); } rec_get_nth_field_offs_old( @@ -2178,6 +2181,7 @@ dict_load_table_low( "InnoDB: in InnoDB data dictionary" " has unknown type %lx.\n", (ulong) flags); + *table = NULL; return("incorrect flags in SYS_TABLES"); } diff --git a/storage/xtradb/dict/dict0mem.cc b/storage/xtradb/dict/dict0mem.cc index cf27caf6c..ab6167b92 100644 --- a/storage/xtradb/dict/dict0mem.cc +++ b/storage/xtradb/dict/dict0mem.cc @@ -1,6 +1,6 @@ /***************************************************************************** -Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 1996, 2017, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2012, Facebook Inc. Copyright (c) 2013, 2018, MariaDB Corporation. diff --git a/storage/xtradb/fil/fil0crypt.cc b/storage/xtradb/fil/fil0crypt.cc index 3095503cf..932d7b9e3 100644 --- a/storage/xtradb/fil/fil0crypt.cc +++ b/storage/xtradb/fil/fil0crypt.cc @@ -1,6 +1,6 @@ /***************************************************************************** Copyright (C) 2013, 2015, Google Inc. All Rights Reserved. -Copyright (c) 2014, 2017, MariaDB Corporation. All Rights Reserved. +Copyright (c) 2014, 2018, MariaDB Corporation. All Rights Reserved. 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 @@ -114,17 +114,17 @@ extern my_bool srv_background_scrub_data_compressed; /*********************************************************************** Check if a key needs rotation given a key_state -@param[in] encrypt_mode Encryption mode +@param[in] crypt_data Encryption information @param[in] key_version Current key version @param[in] latest_key_version Latest key version @param[in] rotate_key_age when to rotate @return true if key needs rotation, false if not */ static bool fil_crypt_needs_rotation( - fil_encryption_t encrypt_mode, - uint key_version, - uint latest_key_version, - uint rotate_key_age) + const fil_space_crypt_t* crypt_data, + uint key_version, + uint latest_key_version, + uint rotate_key_age) MY_ATTRIBUTE((warn_unused_result)); /********************************************************************* @@ -187,7 +187,8 @@ fil_crypt_get_latest_key_version( if (crypt_data->is_key_found()) { - if (fil_crypt_needs_rotation(crypt_data->encryption, + if (fil_crypt_needs_rotation( + crypt_data, crypt_data->min_key_version, key_version, srv_fil_crypt_rotate_key_age)) { @@ -707,60 +708,39 @@ fil_space_encrypt( #ifdef UNIV_DEBUG if (tmp) { /* Verify that encrypted buffer is not corrupted */ - byte* tmp_mem = (byte *)malloc(UNIV_PAGE_SIZE); dberr_t err = DB_SUCCESS; byte* src = src_frame; bool page_compressed_encrypted = (mach_read_from_2(tmp+FIL_PAGE_TYPE) == FIL_PAGE_PAGE_COMPRESSED_ENCRYPTED); - byte* comp_mem = NULL; - byte* uncomp_mem = NULL; + byte uncomp_mem[UNIV_PAGE_SIZE_MAX]; + byte tmp_mem[UNIV_PAGE_SIZE_MAX]; ulint size = (zip_size) ? zip_size : UNIV_PAGE_SIZE; if (page_compressed_encrypted) { - comp_mem = (byte *)malloc(UNIV_PAGE_SIZE); - uncomp_mem = (byte *)malloc(UNIV_PAGE_SIZE); - memcpy(comp_mem, src_frame, UNIV_PAGE_SIZE); - fil_decompress_page(uncomp_mem, comp_mem, - srv_page_size, NULL); - src = uncomp_mem; + memcpy(uncomp_mem, src, srv_page_size); + ulint unzipped1 = fil_page_decompress( + tmp_mem, uncomp_mem); + ut_ad(unzipped1); + if (unzipped1 != srv_page_size) { + src = uncomp_mem; + } } - bool corrupted1 = buf_page_is_corrupted(true, src, zip_size, space); - bool ok = fil_space_decrypt(crypt_data, tmp_mem, size, tmp, &err); + ut_ad(!buf_page_is_corrupted(true, src, zip_size, space)); + ut_ad(fil_space_decrypt(crypt_data, tmp_mem, size, tmp, &err)); + ut_ad(err == DB_SUCCESS); /* Need to decompress the page if it was also compressed */ if (page_compressed_encrypted) { - memcpy(comp_mem, tmp_mem, UNIV_PAGE_SIZE); - fil_decompress_page(tmp_mem, comp_mem, - srv_page_size, NULL); - } - - bool corrupted = buf_page_is_corrupted(true, tmp_mem, zip_size, space); - memcpy(tmp_mem+FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION, src+FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION, 8); - bool different = memcmp(src, tmp_mem, size); - - if (!ok || corrupted || corrupted1 || err != DB_SUCCESS || different) { - fprintf(stderr, "ok %d corrupted %d corrupted1 %d err %d different %d\n", - ok , corrupted, corrupted1, err, different); - fprintf(stderr, "src_frame\n"); - buf_page_print(src_frame, zip_size); - fprintf(stderr, "encrypted_frame\n"); - buf_page_print(tmp, zip_size); - fprintf(stderr, "decrypted_frame\n"); - buf_page_print(tmp_mem, zip_size); - ut_ad(0); - } - - free(tmp_mem); - - if (comp_mem) { - free(comp_mem); + byte buf[UNIV_PAGE_SIZE_MAX]; + memcpy(buf, tmp_mem, srv_page_size); + ulint unzipped2 = fil_page_decompress(tmp_mem, buf); + ut_ad(unzipped2); } - if (uncomp_mem) { - free(uncomp_mem); - } + memcpy(tmp_mem + FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION, + src + FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION, 8); + ut_ad(!memcmp(src, tmp_mem, size)); } - #endif /* UNIV_DEBUG */ return tmp; @@ -963,17 +943,17 @@ fil_crypt_get_key_state( /*********************************************************************** Check if a key needs rotation given a key_state -@param[in] encrypt_mode Encryption mode +@param[in] crypt_data Encryption information @param[in] key_version Current key version @param[in] latest_key_version Latest key version @param[in] rotate_key_age when to rotate @return true if key needs rotation, false if not */ static bool fil_crypt_needs_rotation( - fil_encryption_t encrypt_mode, - uint key_version, - uint latest_key_version, - uint rotate_key_age) + const fil_space_crypt_t* crypt_data, + uint key_version, + uint latest_key_version, + uint rotate_key_age) { if (key_version == ENCRYPTION_KEY_VERSION_INVALID) { return false; @@ -986,13 +966,20 @@ fil_crypt_needs_rotation( } if (latest_key_version == 0 && key_version != 0) { - if (encrypt_mode == FIL_ENCRYPTION_DEFAULT) { + if (crypt_data->encryption == FIL_ENCRYPTION_DEFAULT) { /* this is rotation encrypted => unencrypted */ return true; } return false; } + if (crypt_data->encryption == FIL_ENCRYPTION_DEFAULT + && crypt_data->type == CRYPT_SCHEME_1 + && srv_encrypt_tables == 0 ) { + /* This is rotation encrypted => unencrypted */ + return true; + } + /* this is rotation encrypted => encrypted, * only reencrypt if key is sufficiently old */ if (key_version + rotate_key_age < latest_key_version) { @@ -1008,10 +995,17 @@ static inline void fil_crypt_read_crypt_data(fil_space_t* space) { - if (space->crypt_data || space->size) { + if (space->crypt_data || space->size + || !fil_space_get_size(space->id)) { /* The encryption metadata has already been read, or the tablespace is not encrypted and the file has been - opened already. */ + opened already, or the file cannot be accessed, + likely due to a concurrent TRUNCATE or + RENAME or DROP (possibly as part of ALTER TABLE). + FIXME: The file can become unaccessible any time + after this check! We should really remove this + function and instead make crypt_data an integral + part of fil_space_t. */ return; } @@ -1272,9 +1266,10 @@ fil_crypt_space_needs_rotation( } bool need_key_rotation = fil_crypt_needs_rotation( - crypt_data->encryption, + crypt_data, crypt_data->min_key_version, - key_state->key_version, key_state->rotate_key_age); + key_state->key_version, + key_state->rotate_key_age); crypt_data->rotate_state.scrubbing.is_active = btr_scrub_start_space(space->id, &state->scrub_data); @@ -1862,9 +1857,10 @@ fil_crypt_rotate_page( ut_ad(kv == 0); ut_ad(page_get_space_id(frame) == 0); } else if (fil_crypt_needs_rotation( - crypt_data->encryption, - kv, key_state->key_version, - key_state->rotate_key_age)) { + crypt_data, + kv, + key_state->key_version, + key_state->rotate_key_age)) { modified = true; @@ -2002,6 +1998,12 @@ fil_crypt_rotate_pages( continue; } + /* If space is marked as stopping, stop rotating + pages. */ + if (state->space->is_stopping()) { + break; + } + fil_crypt_rotate_page(key_state, state); } } @@ -2050,20 +2052,22 @@ fil_crypt_flush_space( crypt_data->type = CRYPT_SCHEME_UNENCRYPTED; } - /* update page 0 */ - mtr_t mtr; - mtr_start(&mtr); + if (!space->is_stopping()) { + /* update page 0 */ + mtr_t mtr; + mtr_start(&mtr); - const uint zip_size = fsp_flags_get_zip_size(state->space->flags); + const uint zip_size = fsp_flags_get_zip_size(state->space->flags); - buf_block_t* block = buf_page_get_gen(space->id, zip_size, 0, + buf_block_t* block = buf_page_get_gen(space->id, zip_size, 0, RW_X_LATCH, NULL, BUF_GET, __FILE__, __LINE__, &mtr); - byte* frame = buf_block_get_frame(block); + byte* frame = buf_block_get_frame(block); - crypt_data->write_page0(frame, &mtr); + crypt_data->write_page0(frame, &mtr); - mtr_commit(&mtr); + mtr_commit(&mtr); + } } /*********************************************************************** diff --git a/storage/xtradb/fil/fil0fil.cc b/storage/xtradb/fil/fil0fil.cc index 96902cd77..a88350831 100644 --- a/storage/xtradb/fil/fil0fil.cc +++ b/storage/xtradb/fil/fil0fil.cc @@ -25,8 +25,6 @@ Created 10/25/1995 Heikki Tuuri *******************************************************/ #include "fil0fil.h" -#include "fil0pagecompress.h" -#include "fsp0pagecompress.h" #include "fil0crypt.h" #include @@ -49,12 +47,10 @@ Created 10/25/1995 Heikki Tuuri #include "page0zip.h" #include "trx0sys.h" #include "row0mysql.h" -#include "os0file.h" #ifndef UNIV_HOTBACKUP # include "buf0lru.h" # include "ibuf0ibuf.h" # include "sync0sync.h" -# include "os0sync.h" #else /* !UNIV_HOTBACKUP */ # include "srv0srv.h" static ulint srv_data_read, srv_data_written; @@ -355,19 +351,6 @@ fil_space_get_by_id( return(space); } -/****************************************************************//** -Get space id from fil node */ -ulint -fil_node_get_space_id( -/*==================*/ - fil_node_t* node) /*!< in: Compressed node*/ -{ - ut_ad(node); - ut_ad(node->space); - - return (node->space->id); -} - /*******************************************************************//** Returns the table space by a given name, NULL if not found. */ fil_space_t* @@ -704,7 +687,7 @@ fil_node_open_file( space->size += node->size; } - ulint atomic_writes = fsp_flags_get_atomic_writes(space->flags); + ulint atomic_writes = FSP_FLAGS_GET_ATOMIC_WRITES(space->flags); /* printf("Opening file %s\n", node->name); */ @@ -1102,7 +1085,6 @@ fil_mutex_enter_and_prepare_for_io( { fil_space_t* space; ulint count = 0; - ulint count2 = 0; retry: mutex_enter(&fil_system->mutex); @@ -1118,47 +1100,6 @@ fil_mutex_enter_and_prepare_for_io( return; } - if (space->stop_ios) { - ut_ad(space->id != 0); - /* We are going to do a rename file and want to stop new i/o's - for a while */ - - if (count2 > 20000) { - fputs("InnoDB: Warning: tablespace ", stderr); - ut_print_filename(stderr, space->name); - fprintf(stderr, - " has i/o ops stopped for a long time %lu\n", - (ulong) count2); - } - - mutex_exit(&fil_system->mutex); - -#ifndef UNIV_HOTBACKUP - - /* Wake the i/o-handler threads to make sure pending - i/o's are performed */ - os_aio_simulated_wake_handler_threads(); - - /* The sleep here is just to give IO helper threads a - bit of time to do some work. It is not required that - all IO related to the tablespace being renamed must - be flushed here as we do fil_flush() in - fil_rename_tablespace() as well. */ - os_thread_sleep(20000); - -#endif /* UNIV_HOTBACKUP */ - - /* Flush tablespaces so that we can close modified - files in the LRU list */ - fil_flush_file_spaces(FIL_TABLESPACE); - - os_thread_sleep(20000); - - count2++; - - goto retry; - } - fil_node_t* node = UT_LIST_GET_LAST(space->chain); ut_ad(space->id == 0 || node == UT_LIST_GET_FIRST(space->chain)); @@ -2940,7 +2881,7 @@ fil_delete_tablespace(ulint id, bool drop_ahi) To deal with potential read requests by checking the ::stop_new_ops flag in fil_io() */ - buf_LRU_flush_or_remove_pages(id, NULL, drop_ahi); + buf_LRU_flush_or_remove_pages(id, NULL); #endif /* !UNIV_HOTBACKUP */ @@ -3051,7 +2992,7 @@ fil_discard_tablespace( { dberr_t err; - switch (err = fil_delete_tablespace(id, true)) { + switch (err = fil_delete_tablespace(id)) { case DB_SUCCESS: break; @@ -3253,7 +3194,6 @@ fil_rename_tablespace( ibool success; fil_space_t* space; fil_node_t* node; - ulint count = 0; char* new_path; char* old_name; char* old_path; @@ -3261,25 +3201,10 @@ fil_rename_tablespace( ut_a(id != 0); -retry: - count++; - - if (!(count % 1000)) { - ut_print_timestamp(stderr); - fputs(" InnoDB: Warning: problems renaming ", stderr); - ut_print_filename(stderr, - old_name_in ? old_name_in : not_given); - fputs(" to ", stderr); - ut_print_filename(stderr, new_name); - fprintf(stderr, ", %lu iterations\n", (ulong) count); - } - mutex_enter(&fil_system->mutex); space = fil_space_get_by_id(id); - DBUG_EXECUTE_IF("fil_rename_tablespace_failure_1", space = NULL; ); - if (space == NULL) { ib_logf(IB_LOG_LEVEL_ERROR, "Cannot find space id %lu in the tablespace " @@ -3291,54 +3216,11 @@ fil_rename_tablespace( return(FALSE); } - if (count > 25000) { - space->stop_ios = FALSE; - mutex_exit(&fil_system->mutex); - - return(FALSE); - } - - /* We temporarily close the .ibd file because we do not trust that - operating systems can rename an open file. For the closing we have to - wait until there are no pending i/o's or flushes on the file. */ - - space->stop_ios = TRUE; - /* The following code must change when InnoDB supports multiple datafiles per tablespace. */ ut_a(UT_LIST_GET_LEN(space->chain) == 1); node = UT_LIST_GET_FIRST(space->chain); - if (node->n_pending > 0 - || node->n_pending_flushes > 0 - || node->being_extended) { - /* There are pending i/o's or flushes or the file is - currently being extended, sleep for a while and - retry */ - - mutex_exit(&fil_system->mutex); - - os_thread_sleep(20000); - - goto retry; - - } else if (node->modification_counter > node->flush_counter) { - /* Flush the space */ - - mutex_exit(&fil_system->mutex); - - os_thread_sleep(20000); - - fil_flush(id); - - goto retry; - - } else if (node->open) { - /* Close the file */ - - fil_node_close_file(node, fil_system); - } - /* Check that the old name in the space is right */ if (old_name_in) { @@ -3357,17 +3239,9 @@ fil_rename_tablespace( space, node, new_name, new_path); if (success) { - - DBUG_EXECUTE_IF("fil_rename_tablespace_failure_2", - goto skip_second_rename; ); - success = os_file_rename( innodb_file_data_key, old_path, new_path); - DBUG_EXECUTE_IF("fil_rename_tablespace_failure_2", -skip_second_rename: - success = FALSE; ); - if (!success) { /* We have to revert the changes we made to the tablespace memory cache */ @@ -3377,8 +3251,6 @@ fil_rename_tablespace( } } - space->stop_ios = FALSE; - mutex_exit(&fil_system->mutex); #ifndef UNIV_HOTBACKUP @@ -4110,7 +3982,6 @@ fil_open_single_table_tablespace( fsp_open_info remote; ulint tablespaces_found = 0; ulint valid_tablespaces_found = 0; - ulint atomic_writes = 0; fil_space_crypt_t* crypt_data = NULL; #ifdef UNIV_SYNC_DEBUG @@ -4125,7 +3996,7 @@ fil_open_single_table_tablespace( } ut_ad(fsp_flags_is_valid(flags & ~FSP_FLAGS_MEM_MASK, id)); - atomic_writes = fsp_flags_get_atomic_writes(flags); + const ulint atomic_writes = FSP_FLAGS_GET_ATOMIC_WRITES(flags); memset(&def, 0, sizeof(def)); memset(&dict, 0, sizeof(dict)); @@ -4468,17 +4339,7 @@ fil_open_single_table_tablespace( mem_free(def.filepath); - /* We need to check fsp flags when no errors has happened and - server was not started on read only mode and tablespace validation - was requested or flags contain other table options except - low order bits to FSP_FLAGS_POS_PAGE_SSIZE position. - Note that flag comparison is pessimistic. Adjust is required - only when flags contain buggy MariaDB 10.1.0 - - MariaDB 10.1.20 flags. */ - if (err == DB_SUCCESS - && !srv_read_only_mode - && (validate - || flags >= (1U << FSP_FLAGS_POS_PAGE_SSIZE))) { + if (err == DB_SUCCESS && validate && !srv_read_only_mode) { fsp_flags_try_adjust(id, flags & ~FSP_FLAGS_MEM_MASK); } @@ -6161,7 +6022,8 @@ fil_io( } else if (type == OS_FILE_WRITE) { ut_ad(!srv_read_only_mode); srv_stats.data_written.add(len); - if (fil_page_is_index_page((byte *)buf)) { + if (mach_read_from_2(static_cast(buf) + + FIL_PAGE_TYPE) == FIL_PAGE_INDEX) { srv_stats.index_pages_written.inc(); } else { srv_stats.non_index_pages_written.inc(); @@ -6693,479 +6555,6 @@ fil_close(void) fil_system = NULL; } -/********************************************************************//** -Initializes a buffer control block when the buf_pool is created. */ -static -void -fil_buf_block_init( -/*===============*/ - buf_block_t* block, /*!< in: pointer to control block */ - byte* frame) /*!< in: pointer to buffer frame */ -{ - UNIV_MEM_DESC(frame, UNIV_PAGE_SIZE); - - block->frame = frame; - - block->page.io_fix = BUF_IO_NONE; - /* There are assertions that check for this. */ - block->page.buf_fix_count = 1; - block->page.state = BUF_BLOCK_READY_FOR_USE; - - page_zip_des_init(&block->page.zip); -} - -struct fil_iterator_t { - pfs_os_file_t file; /*!< File handle */ - const char* filepath; /*!< File path name */ - os_offset_t start; /*!< From where to start */ - os_offset_t end; /*!< Where to stop */ - os_offset_t file_size; /*!< File size in bytes */ - ulint page_size; /*!< Page size */ - ulint n_io_buffers; /*!< Number of pages to use - for IO */ - byte* io_buffer; /*!< Buffer to use for IO */ - fil_space_crypt_t *crypt_data; /*!< Crypt data (if encrypted) */ - byte* crypt_io_buffer; /*!< IO buffer when encrypted */ -}; - -/********************************************************************//** -TODO: This can be made parallel trivially by chunking up the file and creating -a callback per thread. . Main benefit will be to use multiple CPUs for -checksums and compressed tables. We have to do compressed tables block by -block right now. Secondly we need to decompress/compress and copy too much -of data. These are CPU intensive. - -Iterate over all the pages in the tablespace. -@param iter - Tablespace iterator -@param block - block to use for IO -@param callback - Callback to inspect and update page contents -@retval DB_SUCCESS or error code */ -static -dberr_t -fil_iterate( -/*========*/ - const fil_iterator_t& iter, - buf_block_t* block, - PageCallback& callback) -{ - os_offset_t offset; - ulint page_no = 0; - ulint space_id = callback.get_space_id(); - ulint n_bytes = iter.n_io_buffers * iter.page_size; - - ut_ad(!srv_read_only_mode); - - /* TODO: For compressed tables we do a lot of useless - copying for non-index pages. Unfortunately, it is - required by buf_zip_decompress() */ - const bool row_compressed = callback.get_zip_size() > 0; - - for (offset = iter.start; offset < iter.end; offset += n_bytes) { - - byte* io_buffer = iter.io_buffer; - - block->frame = io_buffer; - - if (row_compressed) { - page_zip_des_init(&block->page.zip); - page_zip_set_size(&block->page.zip, iter.page_size); - block->page.zip.data = block->frame + UNIV_PAGE_SIZE; - ut_d(block->page.zip.m_external = true); - ut_ad(iter.page_size == callback.get_zip_size()); - - /* Zip IO is done in the compressed page buffer. */ - io_buffer = block->page.zip.data; - } - - /* We have to read the exact number of bytes. Otherwise the - InnoDB IO functions croak on failed reads. */ - - n_bytes = static_cast( - ut_min(static_cast(n_bytes), - iter.end - offset)); - - ut_ad(n_bytes > 0); - ut_ad(!(n_bytes % iter.page_size)); - - const bool encrypted = iter.crypt_data != NULL - && iter.crypt_data->should_encrypt(); - /* Use additional crypt io buffer if tablespace is encrypted */ - byte* const readptr = encrypted - ? iter.crypt_io_buffer : io_buffer; - byte* const writeptr = readptr; - - if (!os_file_read(iter.file, readptr, offset, (ulint) n_bytes)) { - - ib_logf(IB_LOG_LEVEL_ERROR, "os_file_read() failed"); - - return(DB_IO_ERROR); - } - - bool updated = false; - os_offset_t page_off = offset; - ulint n_pages_read = (ulint) n_bytes / iter.page_size; - bool decrypted = false; - - for (ulint i = 0; i < n_pages_read; ++i) { - ulint size = iter.page_size; - dberr_t err = DB_SUCCESS; - byte* src = readptr + (i * size); - byte* dst = io_buffer + (i * size); - bool frame_changed = false; - - ulint page_type = mach_read_from_2(src+FIL_PAGE_TYPE); - - const bool page_compressed - = page_type == FIL_PAGE_PAGE_COMPRESSED_ENCRYPTED - || page_type == FIL_PAGE_PAGE_COMPRESSED; - - /* If tablespace is encrypted, we need to decrypt - the page. Note that tablespaces are not in - fil_system during import. */ - if (encrypted) { - decrypted = fil_space_decrypt( - iter.crypt_data, - dst, //dst - iter.page_size, - src, // src - &err); // src - - if (err != DB_SUCCESS) { - return(err); - } - - if (decrypted) { - updated = true; - } else { - if (!page_compressed && !row_compressed) { - block->frame = src; - frame_changed = true; - } else { - memcpy(dst, src, size); - } - } - } - - /* If the original page is page_compressed, we need - to decompress page before we can update it. */ - if (page_compressed) { - fil_decompress_page(NULL, dst, ulong(size), - NULL); - updated = true; - } - - buf_block_set_file_page(block, space_id, page_no++); - - if ((err = callback(page_off, block)) != DB_SUCCESS) { - - return(err); - - } else if (!updated) { - updated = buf_block_get_state(block) - == BUF_BLOCK_FILE_PAGE; - } - - buf_block_set_state(block, BUF_BLOCK_NOT_USED); - buf_block_set_state(block, BUF_BLOCK_READY_FOR_USE); - - /* If tablespace is encrypted we use additional - temporary scratch area where pages are read - for decrypting readptr == crypt_io_buffer != io_buffer. - - Destination for decryption is a buffer pool block - block->frame == dst == io_buffer that is updated. - Pages that did not require decryption even when - tablespace is marked as encrypted are not copied - instead block->frame is set to src == readptr. - - For encryption we again use temporary scratch area - writeptr != io_buffer == dst - that is then written to the tablespace - - (1) For normal tables io_buffer == dst == writeptr - (2) For only page compressed tables - io_buffer == dst == writeptr - (3) For encrypted (and page compressed) - readptr != io_buffer == dst != writeptr - */ - - ut_ad(!encrypted && !page_compressed ? - src == dst && dst == writeptr + (i * size):1); - ut_ad(page_compressed && !encrypted ? - src == dst && dst == writeptr + (i * size):1); - ut_ad(encrypted ? - src != dst && dst != writeptr + (i * size):1); - - if (encrypted) { - memcpy(writeptr + (i * size), - row_compressed ? block->page.zip.data : - block->frame, size); - } - - if (frame_changed) { - block->frame = dst; - } - - src = io_buffer + (i * size); - - if (page_compressed) { - ulint len = 0; - - fil_compress_page( - NULL, - src, - NULL, - size, - 0,/* FIXME: compression level */ - 512,/* FIXME: use proper block size */ - encrypted, - &len); - - updated = true; - } - - /* If tablespace is encrypted, encrypt page before we - write it back. Note that we should not encrypt the - buffer that is in buffer pool. */ - /* NOTE: At this stage of IMPORT the - buffer pool is not being used at all! */ - if (decrypted && encrypted) { - byte *dest = writeptr + (i * size); - ulint space = mach_read_from_4( - src + FIL_PAGE_ARCH_LOG_NO_OR_SPACE_ID); - ulint offset = mach_read_from_4(src + FIL_PAGE_OFFSET); - ib_uint64_t lsn = mach_read_from_8(src + FIL_PAGE_LSN); - - byte* tmp = fil_encrypt_buf( - iter.crypt_data, - space, - offset, - lsn, - src, - iter.page_size == UNIV_PAGE_SIZE ? 0 : iter.page_size, - dest); - - if (tmp == src) { - /* TODO: remove unnecessary memcpy's */ - memcpy(dest, src, size); - } - - updated = true; - } - - page_off += iter.page_size; - block->frame += iter.page_size; - } - - /* A page was updated in the set, write back to disk. */ - if (updated - && !os_file_write( - iter.filepath, iter.file, writeptr, - offset, (ulint) n_bytes)) { - - ib_logf(IB_LOG_LEVEL_ERROR, "os_file_write() failed"); - - return(DB_IO_ERROR); - } - } - - return(DB_SUCCESS); -} - -/********************************************************************//** -Iterate over all the pages in the tablespace. -@param table - the table definiton in the server -@param n_io_buffers - number of blocks to read and write together -@param callback - functor that will do the page updates -@return DB_SUCCESS or error code */ -UNIV_INTERN -dberr_t -fil_tablespace_iterate( -/*===================*/ - dict_table_t* table, - ulint n_io_buffers, - PageCallback& callback) -{ - dberr_t err; - pfs_os_file_t file; - char* filepath; - - ut_a(n_io_buffers > 0); - ut_ad(!srv_read_only_mode); - - DBUG_EXECUTE_IF("ib_import_trigger_corruption_1", - return(DB_CORRUPTION);); - - if (DICT_TF_HAS_DATA_DIR(table->flags)) { - dict_get_and_save_data_dir_path(table, false); - ut_a(table->data_dir_path); - - filepath = os_file_make_remote_pathname( - table->data_dir_path, table->name, "ibd"); - } else { - filepath = fil_make_ibd_name(table->name, false); - } - - { - ibool success; - - file = os_file_create_simple_no_error_handling( - innodb_file_data_key, filepath, - OS_FILE_OPEN, OS_FILE_READ_WRITE, &success, FALSE); - - DBUG_EXECUTE_IF("fil_tablespace_iterate_failure", - { - static bool once; - - if (!once || ut_rnd_interval(0, 10) == 5) { - once = true; - success = FALSE; - os_file_close(file); - } - }); - - if (!success) { - /* The following call prints an error message */ - os_file_get_last_error(true); - - ib_logf(IB_LOG_LEVEL_ERROR, - "Trying to import a tablespace, but could not " - "open the tablespace file %s", filepath); - - mem_free(filepath); - - return(DB_TABLESPACE_NOT_FOUND); - - } else { - err = DB_SUCCESS; - } - } - - callback.set_file(filepath, file); - - os_offset_t file_size = os_file_get_size(file); - ut_a(file_size != (os_offset_t) -1); - - /* The block we will use for every physical page */ - buf_block_t block; - - memset(&block, 0x0, sizeof(block)); - - /* Allocate a page to read in the tablespace header, so that we - can determine the page size and zip_size (if it is compressed). - We allocate an extra page in case it is a compressed table. One - page is to ensure alignement. */ - - void* page_ptr = mem_alloc(3 * UNIV_PAGE_SIZE); - byte* page = static_cast(ut_align(page_ptr, UNIV_PAGE_SIZE)); - - fil_buf_block_init(&block, page); - - /* Read the first page and determine the page and zip size. */ - - if (!os_file_read(file, page, 0, UNIV_PAGE_SIZE)) { - - err = DB_IO_ERROR; - - } else if ((err = callback.init(file_size, &block)) == DB_SUCCESS) { - fil_iterator_t iter; - - iter.file = file; - iter.start = 0; - iter.end = file_size; - iter.filepath = filepath; - iter.file_size = file_size; - iter.n_io_buffers = n_io_buffers; - iter.page_size = callback.get_page_size(); - - /* In MariaDB/MySQL 5.6 tablespace does not exist - during import, therefore we can't use space directly - here. */ - ulint crypt_data_offset = fsp_header_get_crypt_offset( - callback.get_zip_size()); - - /* read (optional) crypt data */ - iter.crypt_data = fil_space_read_crypt_data( - 0, page, crypt_data_offset); - - /* Compressed pages can't be optimised for block IO for now. - We do the IMPORT page by page. */ - - if (callback.get_zip_size() > 0) { - iter.n_io_buffers = 1; - ut_a(iter.page_size == callback.get_zip_size()); - } - - /** If tablespace is encrypted, it needs extra buffers */ - if (iter.crypt_data != NULL) { - /* decrease io buffers so that memory - * consumption doesnt double - * note: the +1 is to avoid n_io_buffers getting down to 0 */ - iter.n_io_buffers = (iter.n_io_buffers + 1) / 2; - } - - /** Add an extra page for compressed page scratch area. */ - - void* io_buffer = mem_alloc( - (2 + iter.n_io_buffers) * UNIV_PAGE_SIZE); - - iter.io_buffer = static_cast( - ut_align(io_buffer, UNIV_PAGE_SIZE)); - - void* crypt_io_buffer = NULL; - if (iter.crypt_data != NULL) { - crypt_io_buffer = mem_alloc( - (2 + iter.n_io_buffers) * UNIV_PAGE_SIZE); - iter.crypt_io_buffer = static_cast( - ut_align(crypt_io_buffer, UNIV_PAGE_SIZE)); - } - - err = fil_iterate(iter, &block, callback); - - mem_free(io_buffer); - - if (crypt_io_buffer != NULL) { - mem_free(crypt_io_buffer); - iter.crypt_io_buffer = NULL; - fil_space_destroy_crypt_data(&iter.crypt_data); - } - } - - if (err == DB_SUCCESS) { - - ib_logf(IB_LOG_LEVEL_INFO, "Sync to disk"); - - if (!os_file_flush(file)) { - ib_logf(IB_LOG_LEVEL_INFO, "os_file_flush() failed!"); - err = DB_IO_ERROR; - } else { - ib_logf(IB_LOG_LEVEL_INFO, "Sync to disk - done!"); - } - } - - os_file_close(file); - - mem_free(page_ptr); - mem_free(filepath); - - return(err); -} - -/** -Set the tablespace compressed table size. -@return DB_SUCCESS if it is valie or DB_CORRUPTION if not */ -dberr_t -PageCallback::set_zip_size(const buf_frame_t* page) UNIV_NOTHROW -{ - m_zip_size = fsp_header_get_zip_size(page); - - if (!ut_is_2pow(m_zip_size) || m_zip_size > UNIV_ZIP_SIZE_MAX) { - return(DB_CORRUPTION); - } - - return(DB_SUCCESS); -} - /********************************************************************//** Delete the tablespace file and any related files like .cfg. This should not be called for temporary tables. */ diff --git a/storage/xtradb/fil/fil0pagecompress.cc b/storage/xtradb/fil/fil0pagecompress.cc index edc932f36..25cd8e28a 100644 --- a/storage/xtradb/fil/fil0pagecompress.cc +++ b/storage/xtradb/fil/fil0pagecompress.cc @@ -1,6 +1,6 @@ /***************************************************************************** -Copyright (C) 2013, 2017, MariaDB Corporation. All Rights Reserved. +Copyright (C) 2013, 2018, MariaDB Corporation. 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 @@ -80,73 +80,26 @@ static ulint srv_data_read, srv_data_written; #include "snappy-c.h" #endif -/* Used for debugging */ -//#define UNIV_PAGECOMPRESS_DEBUG 1 - -/****************************************************************//** -For page compressed pages compress the page before actual write -operation. -@return compressed page to be written*/ -UNIV_INTERN -byte* -fil_compress_page( -/*==============*/ - fil_space_t* space, /*!< in,out: tablespace (NULL during IMPORT) */ - byte* buf, /*!< in: buffer from which to write; in aio - this must be appropriately aligned */ - byte* out_buf, /*!< out: compressed buffer */ - ulint len, /*!< in: length of input buffer.*/ - ulint level, /* in: compression level */ - ulint block_size, /*!< in: block size */ - bool encrypted, /*!< in: is page also encrypted */ - ulint* out_len) /*!< out: actual length of compressed - page */ +/** Compress a page_compressed page before writing to a data file. +@param[in] buf page to be compressed +@param[out] out_buf compressed page +@param[in] level compression level +@param[in] block_size file system block size +@param[in] encrypted whether the page will be subsequently encrypted +@return actual length of compressed page +@retval 0 if the page was not compressed */ +UNIV_INTERN ulint fil_page_compress(const byte* buf, byte* out_buf, ulint level, + ulint block_size, bool encrypted) { - int err = Z_OK; - int comp_level = level; + int comp_level = int(level); ulint header_len = FIL_PAGE_DATA + FIL_PAGE_COMPRESSED_SIZE; - ulint write_size = 0; -#if HAVE_LZO - lzo_uint write_size_lzo = write_size; -#endif /* Cache to avoid change during function execution */ ulint comp_method = innodb_compression_algorithm; - bool allocated = false; - - /* page_compression does not apply to tables or tablespaces - that use ROW_FORMAT=COMPRESSED */ - ut_ad(!space || !FSP_FLAGS_GET_ZIP_SSIZE(space->flags)); if (encrypted) { header_len += FIL_PAGE_COMPRESSION_METHOD_SIZE; } - if (!out_buf) { - allocated = true; - ulint size = UNIV_PAGE_SIZE; - - /* Both snappy and lzo compression methods require that - output buffer used for compression is bigger than input - buffer. Increase the allocated buffer size accordingly. */ -#if HAVE_SNAPPY - if (comp_method == PAGE_SNAPPY_ALGORITHM) { - size = snappy_max_compressed_length(size); - } -#endif -#if HAVE_LZO - if (comp_method == PAGE_LZO_ALGORITHM) { - size += LZO1X_1_15_MEM_COMPRESS; - } -#endif - - out_buf = static_cast(ut_malloc(size)); - } - - ut_ad(buf); - ut_ad(out_buf); - ut_ad(len); - ut_ad(out_len); - /* Let's not compress file space header or extent descriptor */ switch (fil_page_get_type(buf)) { @@ -154,8 +107,7 @@ fil_compress_page( case FIL_PAGE_TYPE_FSP_HDR: case FIL_PAGE_TYPE_XDES: case FIL_PAGE_PAGE_COMPRESSED: - *out_len = len; - goto err_exit; + return 0; } /* If no compression level was provided to this table, use system @@ -164,204 +116,113 @@ fil_compress_page( comp_level = page_zip_level; } - DBUG_PRINT("compress", - ("Preparing for space " ULINTPF " '%s' len " ULINTPF, - space ? space->id : 0, - space ? space->name : "(import)", - len)); - - write_size = UNIV_PAGE_SIZE - header_len; + ulint write_size = srv_page_size - header_len; - switch(comp_method) { + switch (comp_method) { + default: + ut_ad(!"unknown compression method"); + /* fall through */ + case PAGE_UNCOMPRESSED: + return 0; + case PAGE_ZLIB_ALGORITHM: + { + ulong len = uLong(write_size); + if (Z_OK == compress2( + out_buf + header_len, &len, + buf, uLong(srv_page_size), comp_level)) { + write_size = len; + goto success; + } + } + break; #ifdef HAVE_LZ4 case PAGE_LZ4_ALGORITHM: - -#ifdef HAVE_LZ4_COMPRESS_DEFAULT - err = LZ4_compress_default((const char *)buf, - (char *)out_buf+header_len, len, write_size); -#else - err = LZ4_compress_limitedOutput((const char *)buf, - (char *)out_buf+header_len, len, write_size); -#endif /* HAVE_LZ4_COMPRESS_DEFAULT */ - write_size = err; - - if (err == 0) { - /* If error we leave the actual page as it was */ - -#ifndef UNIV_PAGECOMPRESS_DEBUG - if (space && !space->printed_compression_failure) { - space->printed_compression_failure = true; -#endif - ib_logf(IB_LOG_LEVEL_WARN, - "Compression failed for space " ULINTPF - " name %s len " ULINTPF - " err %d write_size " ULINTPF ".", - space->id, space->name, len, - err, write_size); -#ifndef UNIV_PAGECOMPRESS_DEBUG - } -#endif - srv_stats.pages_page_compression_error.inc(); - *out_len = len; - goto err_exit; +# ifdef HAVE_LZ4_COMPRESS_DEFAULT + write_size = LZ4_compress_default( + reinterpret_cast(buf), + reinterpret_cast(out_buf) + header_len, + int(srv_page_size), int(write_size)); +# else + write_size = LZ4_compress_limitedOutput( + reinterpret_cast(buf), + reinterpret_cast(out_buf) + header_len, + int(srv_page_size), int(write_size)); +# endif + + if (write_size) { + goto success; } break; #endif /* HAVE_LZ4 */ #ifdef HAVE_LZO - case PAGE_LZO_ALGORITHM: - err = lzo1x_1_15_compress( - buf, len, out_buf+header_len, &write_size_lzo, out_buf+UNIV_PAGE_SIZE); - - write_size = write_size_lzo; - - if (err != LZO_E_OK || write_size > UNIV_PAGE_SIZE-header_len) { - if (space && !space->printed_compression_failure) { - space->printed_compression_failure = true; - ib_logf(IB_LOG_LEVEL_WARN, - "Compression failed for space " ULINTPF - " name %s len " ULINTPF - " err %d write_size " ULINTPF ".", - space->id, space->name, len, - err, write_size); - } - - srv_stats.pages_page_compression_error.inc(); - *out_len = len; - goto err_exit; + case PAGE_LZO_ALGORITHM: { + lzo_uint len = write_size; + + if (LZO_E_OK == lzo1x_1_15_compress( + buf, srv_page_size, + out_buf + header_len, &len, + out_buf + srv_page_size) + && len <= write_size) { + write_size = len; + goto success; } - break; + } #endif /* HAVE_LZO */ #ifdef HAVE_LZMA case PAGE_LZMA_ALGORITHM: { - size_t out_pos=0; - - err = lzma_easy_buffer_encode( - comp_level, - LZMA_CHECK_NONE, - NULL, /* No custom allocator, use malloc/free */ - reinterpret_cast(buf), - len, - reinterpret_cast(out_buf + header_len), - &out_pos, - (size_t)write_size); - - if (err != LZMA_OK || out_pos > UNIV_PAGE_SIZE-header_len) { - if (space && !space->printed_compression_failure) { - space->printed_compression_failure = true; - ib_logf(IB_LOG_LEVEL_WARN, - "Compression failed for space " ULINTPF - " name %s len " ULINTPF - " err %d write_size " ULINTPF ".", - space->id, space->name, len, - err, out_pos); - } - - srv_stats.pages_page_compression_error.inc(); - *out_len = len; - goto err_exit; + size_t out_pos = 0; + + if (LZMA_OK == lzma_easy_buffer_encode( + comp_level, LZMA_CHECK_NONE, NULL, + buf, srv_page_size, out_buf + header_len, + &out_pos, write_size) + && out_pos <= write_size) { + write_size = out_pos; + goto success; } - - write_size = out_pos; - break; } #endif /* HAVE_LZMA */ #ifdef HAVE_BZIP2 case PAGE_BZIP2_ALGORITHM: { - - err = BZ2_bzBuffToBuffCompress( - (char *)(out_buf + header_len), - (unsigned int *)&write_size, - (char *)buf, - len, - 1, - 0, - 0); - - if (err != BZ_OK || write_size > UNIV_PAGE_SIZE-header_len) { - if (space && !space->printed_compression_failure) { - space->printed_compression_failure = true; - ib_logf(IB_LOG_LEVEL_WARN, - "Compression failed for space " ULINTPF - " name %s len " ULINTPF - " err %d write_size " ULINTPF ".", - space->id, space->name, len, - err, write_size); - } - - srv_stats.pages_page_compression_error.inc(); - *out_len = len; - goto err_exit; + unsigned len = unsigned(write_size); + if (BZ_OK == BZ2_bzBuffToBuffCompress( + reinterpret_cast(out_buf + header_len), + &len, + const_cast( + reinterpret_cast(buf)), + unsigned(srv_page_size), 1, 0, 0) + && len <= write_size) { + write_size = len; + goto success; } break; } #endif /* HAVE_BZIP2 */ #ifdef HAVE_SNAPPY - case PAGE_SNAPPY_ALGORITHM: - { - snappy_status cstatus; - write_size = snappy_max_compressed_length(UNIV_PAGE_SIZE); - - cstatus = snappy_compress( - (const char *)buf, - (size_t)len, - (char *)(out_buf+header_len), - (size_t*)&write_size); - - if (cstatus != SNAPPY_OK || write_size > UNIV_PAGE_SIZE-header_len) { - if (space && !space->printed_compression_failure) { - space->printed_compression_failure = true; - ib_logf(IB_LOG_LEVEL_WARN, - "Compression failed for space " ULINTPF - " name %s len " ULINTPF - " err %d write_size " ULINTPF ".", - space->id, space->name, len, - (int)cstatus, write_size); - } - - srv_stats.pages_page_compression_error.inc(); - *out_len = len; - goto err_exit; + case PAGE_SNAPPY_ALGORITHM: { + size_t len = snappy_max_compressed_length(srv_page_size); + + if (SNAPPY_OK == snappy_compress( + reinterpret_cast(buf), + srv_page_size, + reinterpret_cast(out_buf) + header_len, + &len) + && len <= write_size) { + write_size = len; + goto success; } break; } #endif /* HAVE_SNAPPY */ - - case PAGE_ZLIB_ALGORITHM: - err = compress2(out_buf+header_len, (ulong*)&write_size, buf, - uLong(len), comp_level); - - if (err != Z_OK) { - /* If error we leave the actual page as it was */ - - if (space && !space->printed_compression_failure) { - space->printed_compression_failure = true; - ib_logf(IB_LOG_LEVEL_WARN, - "Compression failed for space " ULINTPF - " name %s len " ULINTPF - " rt %d write_size " ULINTPF ".", - space->id, space->name, len, - err, write_size); - } - - srv_stats.pages_page_compression_error.inc(); - *out_len = len; - goto err_exit; - } - break; - - case PAGE_UNCOMPRESSED: - *out_len = len; - return (buf); - break; - default: - ut_error; - break; } + srv_stats.pages_page_compression_error.inc(); + return 0; +success: /* Set up the page header */ memcpy(out_buf, buf, FIL_PAGE_DATA); /* Set up the checksum */ @@ -392,22 +253,11 @@ fil_compress_page( /* Verify that page can be decompressed */ { - byte *comp_page; - byte *uncomp_page; - - comp_page = static_cast(ut_malloc(UNIV_PAGE_SIZE)); - uncomp_page = static_cast(ut_malloc(UNIV_PAGE_SIZE)); - memcpy(comp_page, out_buf, UNIV_PAGE_SIZE); - - fil_decompress_page(uncomp_page, comp_page, ulong(len), NULL); - - if (buf_page_is_corrupted(false, uncomp_page, 0, space)) { - buf_page_print(uncomp_page, 0); - ut_ad(0); - } - - ut_free(comp_page); - ut_free(uncomp_page); + page_t tmp_buf[UNIV_PAGE_SIZE_MAX]; + page_t page[UNIV_PAGE_SIZE_MAX]; + memcpy(page, out_buf, srv_page_size); + ut_ad(fil_page_decompress(tmp_buf, page)); + ut_ad(!buf_page_is_corrupted(false, page, 0, NULL)); } #endif /* UNIV_DEBUG */ @@ -431,324 +281,144 @@ fil_compress_page( #endif } - DBUG_PRINT("compress", - ("Succeeded for space " ULINTPF - " '%s' len " ULINTPF " out_len " ULINTPF, - space ? space->id : 0, - space ? space->name : "(import)", - len, write_size)); - - srv_stats.page_compression_saved.add((len - write_size)); + srv_stats.page_compression_saved.add(srv_page_size - write_size); srv_stats.pages_page_compressed.inc(); /* If we do not persistently trim rest of page, we need to write it all */ if (!srv_use_trim) { - memset(out_buf+write_size,0,len-write_size); - write_size = len; - } - - *out_len = write_size; - - if (allocated) { - /* TODO: reduce number of memcpy's */ - memcpy(buf, out_buf, len); - } else { - return(out_buf); - } - -err_exit: - if (allocated) { - ut_free(out_buf); + memset(out_buf + write_size, 0, srv_page_size - write_size); } - return (buf); - + return write_size; } -/****************************************************************//** -For page compressed pages decompress the page after actual read -operation. */ -UNIV_INTERN -void -fil_decompress_page( -/*================*/ - byte* page_buf, /*!< in: preallocated buffer or NULL */ - byte* buf, /*!< out: buffer from which to read; in aio - this must be appropriately aligned */ - ulong len, /*!< in: length of output buffer.*/ - ulint* write_size, /*!< in/out: Actual payload size of - the compressed data. */ - bool return_error) /*!< in: true if only an error should - be produced when decompression fails. - By default this parameter is false. */ +/** Decompress a page that may be subject to page_compressed compression. +@param[in,out] tmp_buf temporary buffer (of innodb_page_size) +@param[in,out] buf possibly compressed page buffer +@return size of the compressed data +@retval 0 if decompression failed +@retval srv_page_size if the page was not compressed */ +UNIV_INTERN ulint fil_page_decompress(byte* tmp_buf, byte* buf) { - int err = 0; - ulint actual_size = 0; - ulint compression_alg = 0; - byte *in_buf; - ulint ptype; - ulint header_len = FIL_PAGE_DATA + FIL_PAGE_COMPRESSED_SIZE; - - ut_ad(buf); - ut_ad(len); - - ptype = mach_read_from_2(buf+FIL_PAGE_TYPE); - - if (ptype == FIL_PAGE_PAGE_COMPRESSED_ENCRYPTED) { - header_len += FIL_PAGE_COMPRESSION_METHOD_SIZE; - } - - /* Do not try to uncompressed pages that are not compressed */ - if (ptype != FIL_PAGE_PAGE_COMPRESSED && - ptype != FIL_PAGE_PAGE_COMPRESSED_ENCRYPTED && - ptype != FIL_PAGE_TYPE_COMPRESSED) { - return; - } - - // If no buffer was given, we need to allocate temporal buffer - if (page_buf == NULL) { - in_buf = static_cast(ut_malloc(UNIV_PAGE_SIZE)); - memset(in_buf, 0, UNIV_PAGE_SIZE); - } else { - in_buf = page_buf; + const unsigned ptype = mach_read_from_2(buf+FIL_PAGE_TYPE); + ulint header_len; + ib_uint64_t compression_alg; + switch (ptype) { + case FIL_PAGE_PAGE_COMPRESSED_ENCRYPTED: + header_len = FIL_PAGE_DATA + FIL_PAGE_COMPRESSED_SIZE + + FIL_PAGE_COMPRESSION_METHOD_SIZE; + compression_alg = mach_read_from_2( + FIL_PAGE_DATA + FIL_PAGE_COMPRESSED_SIZE + buf); + break; + case FIL_PAGE_PAGE_COMPRESSED: + header_len = FIL_PAGE_DATA + FIL_PAGE_COMPRESSED_SIZE; + compression_alg = mach_read_from_8( + FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION + buf); + break; + default: + return srv_page_size; } - /* Before actual decompress, make sure that page type is correct */ - - if (mach_read_from_4(buf+FIL_PAGE_SPACE_OR_CHKSUM) != BUF_NO_CHECKSUM_MAGIC || - (ptype != FIL_PAGE_PAGE_COMPRESSED && - ptype != FIL_PAGE_PAGE_COMPRESSED_ENCRYPTED)) { - ib_logf(IB_LOG_LEVEL_ERROR, - "Corruption: We try to uncompress corrupted page" - " CRC " ULINTPF " type " ULINTPF " len " ULINTPF ".", - mach_read_from_4(buf+FIL_PAGE_SPACE_OR_CHKSUM), - mach_read_from_2(buf+FIL_PAGE_TYPE), len); - - fflush(stderr); - if (return_error) { - goto error_return; - } - ut_error; + if (mach_read_from_4(buf + FIL_PAGE_SPACE_OR_CHKSUM) + != BUF_NO_CHECKSUM_MAGIC) { + return 0; } - /* Get compression algorithm */ - if (ptype == FIL_PAGE_PAGE_COMPRESSED_ENCRYPTED) { - compression_alg = mach_read_from_2(buf+FIL_PAGE_DATA+FIL_PAGE_COMPRESSED_SIZE); - } else { - compression_alg = mach_read_from_8(buf+FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION); - } + ulint actual_size = mach_read_from_2(buf + FIL_PAGE_DATA); - /* Get the actual size of compressed page */ - actual_size = mach_read_from_2(buf+FIL_PAGE_DATA); /* Check if payload size is corrupted */ - if (actual_size == 0 || actual_size > UNIV_PAGE_SIZE) { - ib_logf(IB_LOG_LEVEL_ERROR, - "Corruption: We try to uncompress corrupted page" - " actual size " ULINTPF " compression %s.", - actual_size, fil_get_compression_alg_name(compression_alg)); - fflush(stderr); - if (return_error) { - goto error_return; - } - ut_error; + if (actual_size == 0 || actual_size > srv_page_size - header_len) { + return 0; } - /* Store actual payload size of the compressed data. This pointer - points to buffer pool. */ - if (write_size) { - *write_size = actual_size; - } - - DBUG_PRINT("compress", - ("Preparing for decompress for len " ULINTPF ".", - actual_size)); - - switch(compression_alg) { + switch (compression_alg) { + default: + ib_logf(IB_LOG_LEVEL_ERROR, + "Unknown compression algorithm " UINT64PF, + compression_alg); + return 0; case PAGE_ZLIB_ALGORITHM: - err= uncompress(in_buf, &len, buf+header_len, (unsigned long)actual_size); - - /* If uncompress fails it means that page is corrupted */ - if (err != Z_OK) { - - ib_logf(IB_LOG_LEVEL_ERROR, - "Corruption: Page is marked as compressed" - " but uncompress failed with error %d " - " size " ULINTPF " len " ULINTPF ".", - err, actual_size, len); - - fflush(stderr); - - if (return_error) { - goto error_return; + { + uLong len = srv_page_size; + if (Z_OK != uncompress(tmp_buf, &len, + buf + header_len, + uLong(actual_size)) + && len != srv_page_size) { + return 0; } - ut_error; } break; - #ifdef HAVE_LZ4 case PAGE_LZ4_ALGORITHM: - err = LZ4_decompress_fast((const char *)buf+header_len, (char *)in_buf, len); - - if (err != (int)actual_size) { - ib_logf(IB_LOG_LEVEL_ERROR, - "Corruption: Page is marked as compressed" - " but uncompress failed with error %d " - " size " ULINTPF " len " ULINTPF ".", - err, actual_size, len); - - fflush(stderr); - - if (return_error) { - goto error_return; - } - ut_error; + if (LZ4_decompress_safe(reinterpret_cast(buf) + + header_len, + reinterpret_cast(tmp_buf), + actual_size, srv_page_size) + == int(srv_page_size)) { + break; } - break; + return 0; #endif /* HAVE_LZ4 */ #ifdef HAVE_LZO case PAGE_LZO_ALGORITHM: { - ulint olen = 0; - lzo_uint olen_lzo = olen; - err = lzo1x_decompress((const unsigned char *)buf+header_len, - actual_size,(unsigned char *)in_buf, &olen_lzo, NULL); - - olen = olen_lzo; - - if (err != LZO_E_OK || (olen == 0 || olen > UNIV_PAGE_SIZE)) { - ib_logf(IB_LOG_LEVEL_ERROR, - "Corruption: Page is marked as compressed" - " but uncompress failed with error %d " - " size " ULINTPF " len " ULINTPF ".", - err, actual_size, len); - - fflush(stderr); - - if (return_error) { - goto error_return; - } - ut_error; + lzo_uint len_lzo = srv_page_size; + if (LZO_E_OK == lzo1x_decompress_safe( + buf + header_len, + actual_size, tmp_buf, &len_lzo, NULL) + && len_lzo == srv_page_size) { + break; } - break; + return 0; } #endif /* HAVE_LZO */ #ifdef HAVE_LZMA case PAGE_LZMA_ALGORITHM: { - - lzma_ret ret; size_t src_pos = 0; size_t dst_pos = 0; uint64_t memlimit = UINT64_MAX; - ret = lzma_stream_buffer_decode( - &memlimit, - 0, - NULL, - buf+header_len, - &src_pos, - actual_size, - in_buf, - &dst_pos, - len); - - - if (ret != LZMA_OK || (dst_pos == 0 || dst_pos > UNIV_PAGE_SIZE)) { - ib_logf(IB_LOG_LEVEL_ERROR, - "Corruption: Page is marked as compressed" - " but decompression read only %ld bytes" - " size " ULINTPF "len " ULINTPF ".", - dst_pos, actual_size, len); - fflush(stderr); - - if (return_error) { - goto error_return; - } - ut_error; + if (LZMA_OK == lzma_stream_buffer_decode( + &memlimit, 0, NULL, buf + header_len, + &src_pos, actual_size, tmp_buf, &dst_pos, + srv_page_size) + && dst_pos == srv_page_size) { + break; } - - break; + return 0; } #endif /* HAVE_LZMA */ #ifdef HAVE_BZIP2 case PAGE_BZIP2_ALGORITHM: { - unsigned int dst_pos = UNIV_PAGE_SIZE; - - err = BZ2_bzBuffToBuffDecompress( - (char *)in_buf, - &dst_pos, - (char *)(buf+header_len), - actual_size, - 1, - 0); - - if (err != BZ_OK || (dst_pos == 0 || dst_pos > UNIV_PAGE_SIZE)) { - ib_logf(IB_LOG_LEVEL_ERROR, - "Corruption: Page is marked as compressed" - " but decompression read only %du bytes" - " size " ULINTPF " len " ULINTPF " err %d.", - dst_pos, actual_size, len, err); - fflush(stderr); - - if (return_error) { - goto error_return; - } - ut_error; + unsigned int dst_pos = srv_page_size; + if (BZ_OK == BZ2_bzBuffToBuffDecompress( + reinterpret_cast(tmp_buf), + &dst_pos, + reinterpret_cast(buf) + header_len, + actual_size, 1, 0) + && dst_pos == srv_page_size) { + break; } - break; + return 0; } #endif /* HAVE_BZIP2 */ #ifdef HAVE_SNAPPY - case PAGE_SNAPPY_ALGORITHM: - { - snappy_status cstatus; - ulint olen = UNIV_PAGE_SIZE; - - cstatus = snappy_uncompress( - (const char *)(buf+header_len), - (size_t)actual_size, - (char *)in_buf, - (size_t*)&olen); - - if (cstatus != SNAPPY_OK || olen != UNIV_PAGE_SIZE) { - ib_logf(IB_LOG_LEVEL_ERROR, - "Corruption: Page is marked as compressed" - " but decompression read only " ULINTPF " bytes" - " size " ULINTPF " len " ULINTPF " err %d.", - olen, actual_size, len, (int)cstatus); - fflush(stderr); - - if (return_error) { - goto error_return; - } - ut_error; + case PAGE_SNAPPY_ALGORITHM: { + size_t olen = srv_page_size; + + if (SNAPPY_OK == snappy_uncompress( + reinterpret_cast(buf) + header_len, + actual_size, + reinterpret_cast(tmp_buf), &olen) + && olen == srv_page_size) { + break; } - - break; + return 0; } #endif /* HAVE_SNAPPY */ - default: - ib_logf(IB_LOG_LEVEL_ERROR, - "Corruption: Page is marked as compressed" - " but compression algorithm %s" - " is not known." - ,fil_get_compression_alg_name(compression_alg)); - - fflush(stderr); - if (return_error) { - goto error_return; - } - ut_error; - break; } srv_stats.pages_page_decompressed.inc(); - - /* Copy the uncompressed page to the buffer pool, not - really any other options. */ - memcpy(buf, in_buf, len); - -error_return: - if (page_buf != in_buf) { - ut_free(in_buf); - } + memcpy(buf, tmp_buf, srv_page_size); + return actual_size; } diff --git a/storage/xtradb/fsp/fsp0fsp.cc b/storage/xtradb/fsp/fsp0fsp.cc index ffed8a6ed..f97e0c133 100644 --- a/storage/xtradb/fsp/fsp0fsp.cc +++ b/storage/xtradb/fsp/fsp0fsp.cc @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 1995, 2016, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2017, MariaDB Corporation. +Copyright (c) 2017, 2018, MariaDB Corporation. 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 @@ -3035,7 +3035,7 @@ fseg_free_page_low( /* Drop search system page hash index if the page is found in the pool and is hashed */ - btr_search_drop_page_hash_when_freed(space, zip_size, page); + btr_search_drop_page_hash_when_freed(space, page); descr = xdes_get_descriptor(space, zip_size, page, mtr); @@ -3261,7 +3261,7 @@ fseg_free_extent( found in the pool and is hashed */ btr_search_drop_page_hash_when_freed( - space, zip_size, first_page_in_extent + i); + space, first_page_in_extent + i); } } diff --git a/storage/xtradb/fts/fts0fts.cc b/storage/xtradb/fts/fts0fts.cc index 98aaf610f..42cb2056d 100644 --- a/storage/xtradb/fts/fts0fts.cc +++ b/storage/xtradb/fts/fts0fts.cc @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 2011, 2017, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2016, 2017, MariaDB Corporation. +Copyright (c) 2016, 2018, MariaDB Corporation. 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 @@ -4627,6 +4627,7 @@ fts_sync( ib_vector_get(cache->indexes, i)); if (index_cache->index->to_be_dropped + || index_cache->index->table->to_be_dropped || fts_sync_index_check(index_cache)) { continue; } @@ -4637,17 +4638,6 @@ fts_sync( end_sync: if (error == DB_SUCCESS && !sync->interrupted) { error = fts_sync_commit(sync); - if (error == DB_SUCCESS) { - for (i = 0; i < ib_vector_size(cache->indexes); ++i) { - fts_index_cache_t* index_cache; - index_cache = static_cast( - ib_vector_get(cache->indexes, i)); - if (index_cache->index->index_fts_syncing) { - index_cache->index->index_fts_syncing - = false; - } - } - } } else { fts_sync_rollback(sync); } @@ -4656,12 +4646,9 @@ fts_sync( /* Clear fts syncing flags of any indexes incase sync is interrupeted */ for (i = 0; i < ib_vector_size(cache->indexes); ++i) { - fts_index_cache_t* index_cache; - index_cache = static_cast( - ib_vector_get(cache->indexes, i)); - if (index_cache->index->index_fts_syncing == true) { - index_cache->index->index_fts_syncing = false; - } + static_cast( + ib_vector_get(cache->indexes, i)) + ->index->index_fts_syncing = false; } sync->interrupted = false; @@ -4760,9 +4747,17 @@ fts_process_token( t_str.f_str = static_cast( mem_heap_alloc(heap, t_str.f_len)); - newlen = innobase_fts_casedn_str( - doc->charset, (char*) str.f_str, str.f_len, - (char*) t_str.f_str, t_str.f_len); + /* For binary collations, a case sensitive search is + performed. Hence don't convert to lower case. */ + if (my_binary_compare(result_doc->charset)) { + memcpy(t_str.f_str, str.f_str, str.f_len); + t_str.f_str[str.f_len]= 0; + newlen= str.f_len; + } else { + newlen = innobase_fts_casedn_str( + doc->charset, (char*) str.f_str, str.f_len, + (char*) t_str.f_str, t_str.f_len); + } t_str.f_len = newlen; t_str.f_str[newlen] = 0; diff --git a/storage/xtradb/fts/fts0que.cc b/storage/xtradb/fts/fts0que.cc index 0b0aecaea..100dbcd70 100644 --- a/storage/xtradb/fts/fts0que.cc +++ b/storage/xtradb/fts/fts0que.cc @@ -3783,10 +3783,19 @@ fts_query_str_preprocess( str_len = query_len * charset->casedn_multiply + 1; str_ptr = static_cast(ut_malloc(str_len)); - *result_len = innobase_fts_casedn_str( - charset, const_cast(reinterpret_cast( - query_str)), query_len, - reinterpret_cast(str_ptr), str_len); + /* For binary collations, a case sensitive search is + performed. Hence don't convert to lower case. */ + if (my_binary_compare(charset)) { + memcpy(str_ptr, query_str, query_len); + str_ptr[query_len]= 0; + *result_len= query_len; + } else { + *result_len = innobase_fts_casedn_str( + charset, const_cast + (reinterpret_cast( query_str)), + query_len, + reinterpret_cast(str_ptr), str_len); + } ut_ad(*result_len < str_len); diff --git a/storage/xtradb/handler/ha_innodb.cc b/storage/xtradb/handler/ha_innodb.cc index 65ac41c26..a7d066176 100644 --- a/storage/xtradb/handler/ha_innodb.cc +++ b/storage/xtradb/handler/ha_innodb.cc @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 2000, 2017, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2013, 2017, MariaDB Corporation. +Copyright (c) 2013, 2018, MariaDB Corporation. Copyright (c) 2008, 2009 Google Inc. Copyright (c) 2009, Percona Inc. Copyright (c) 2012, Facebook Inc. @@ -50,7 +50,7 @@ this program; if not, write to the Free Software Foundation, Inc., #include #endif -#include +#include /** @file ha_innodb.cc */ @@ -367,6 +367,23 @@ static TYPELIB innodb_lock_schedule_algorithm_typelib = { }; +/** Possible values for system variable "innodb_default_row_format". */ +static const char* innodb_default_row_format_names[] = { + "redundant", + "compact", + "dynamic", + NullS +}; + +/** Used to define an enumerate type of the system variable +innodb_default_row_format. */ +static TYPELIB innodb_default_row_format_typelib = { + array_elements(innodb_default_row_format_names) - 1, + "innodb_default_row_format_typelib", + innodb_default_row_format_names, + NULL +}; + /* The following counter is used to convey information to InnoDB about server activity: in case of normal DML ops it is not sensible to call srv_active_wake_master_thread after each @@ -387,6 +404,35 @@ static const char* innobase_change_buffering_values[IBUF_USE_COUNT] = { "all" /* IBUF_USE_ALL */ }; + +/** Note we cannot use rec_format_enum because we do not allow +COMPRESSED row format for innodb_default_row_format option. */ +enum default_row_format_enum { + DEFAULT_ROW_FORMAT_REDUNDANT = 0, + DEFAULT_ROW_FORMAT_COMPACT = 1, + DEFAULT_ROW_FORMAT_DYNAMIC = 2 +}; + +/** Convert an InnoDB ROW_FORMAT value. +@param[in] row_format row_format from "innodb_default_row_format" +@return converted ROW_FORMAT */ +static rec_format_t get_row_format(ulong row_format) +{ + switch (row_format) { + case DEFAULT_ROW_FORMAT_REDUNDANT: + return REC_FORMAT_REDUNDANT; + case DEFAULT_ROW_FORMAT_COMPACT: + return REC_FORMAT_COMPACT; + case DEFAULT_ROW_FORMAT_DYNAMIC: + return REC_FORMAT_DYNAMIC; + default: + ut_ad(0); + return REC_FORMAT_COMPACT; + } +} + +static ulong innodb_default_row_format; + /* Call back function array defined by MySQL and used to retrieve FTS results. */ const struct _ft_vft ft_vft_result = {NULL, @@ -1377,19 +1423,12 @@ innobase_close_connection( THD* thd); /*!< in: MySQL thread handle for which to close the connection */ +/** Cancel any pending lock request associated with the current THD. +@sa THD::awake() @sa ha_kill_query() */ +static void innobase_kill_query(handlerton*, THD* thd, enum thd_kill_levels); static void innobase_commit_ordered(handlerton *hton, THD* thd, bool all); static void innobase_checkpoint_request(handlerton *hton, void *cookie); -/*****************************************************************//** -Cancel any pending lock request associated with the current THD. */ -static -void -innobase_kill_connection( -/*======================*/ - handlerton* hton, /*!< in: innobase handlerton */ - THD* thd, /*!< in: handle to the MySQL thread being killed */ - thd_kill_levels); - /*****************************************************************//** Commits a transaction in an InnoDB database or marks an SQL statement ended. @@ -2698,8 +2737,12 @@ innobase_mysql_tmpfile( fd2 = -1; } } +#else +#ifdef F_DUPFD_CLOEXEC + fd2 = fcntl(fd, F_DUPFD_CLOEXEC, 0); #else fd2 = dup(fd); +#endif #endif if (fd2 < 0) { DBUG_PRINT("error",("Got error %d on dup",fd2)); @@ -3220,8 +3263,7 @@ ha_innobase::ha_innobase( (srv_force_primary_key ? HA_REQUIRE_PRIMARY_KEY : 0 ) | HA_CAN_FULLTEXT_EXT | HA_CAN_EXPORT), start_of_scan(0), - num_write_row(0), - ha_partition_stats(NULL) + num_write_row(0) {} /*********************************************************************//** @@ -3840,7 +3882,7 @@ innobase_init( innobase_hton->release_temporary_latches = innobase_release_temporary_latches; - innobase_hton->kill_query = innobase_kill_connection; + innobase_hton->kill_query = innobase_kill_query; if (srv_file_per_table) innobase_hton->tablefile_extensions = ha_innobase_exts; @@ -4525,6 +4567,14 @@ innobase_init( /* Turn on monitor counters that are default on */ srv_mon_default_on(); +#ifndef UNIV_HOTBACKUP +#ifdef _WIN32 + if (ut_win_init_time()) { + goto mem_free_and_error; + } +#endif /* _WIN32 */ +#endif /* !UNIV_HOTBACKUP */ + DBUG_RETURN(FALSE); error: DBUG_RETURN(TRUE); @@ -5450,23 +5500,13 @@ ha_innobase::get_row_type() const return(ROW_TYPE_NOT_USED); } -/*****************************************************************//** -Cancel any pending lock request associated with the current THD. */ -static -void -innobase_kill_connection( -/*======================*/ - handlerton* hton, /*!< in: innobase handlerton */ - THD* thd, /*!< in: handle to the MySQL thread being killed */ - thd_kill_levels) +/** Cancel any pending lock request associated with the current THD. +@sa THD::awake() @sa ha_kill_query() */ +static void innobase_kill_query(handlerton*, THD* thd, enum thd_kill_levels) { - trx_t* trx; - - DBUG_ENTER("innobase_kill_connection"); - DBUG_ASSERT(hton == innodb_hton_ptr); + DBUG_ENTER("innobase_kill_query"); #ifdef WITH_WSREP - wsrep_thd_LOCK(thd); if (wsrep_thd_get_conflict_state(thd) != NO_CONFLICT) { /* if victim has been signaled by BF thread and/or aborting is already progressing, following query aborting is not necessary @@ -5474,55 +5514,40 @@ innobase_kill_connection( Also, BF thread should own trx mutex for the victim, which would conflict with trx_mutex_enter() below */ - wsrep_thd_UNLOCK(thd); DBUG_VOID_RETURN; } - wsrep_thd_UNLOCK(thd); #endif /* WITH_WSREP */ - trx = thd_to_trx(thd); + if (trx_t* trx = thd_to_trx(thd)) { + ut_ad(trx->mysql_thd == thd); - if (trx && trx->lock.wait_lock) { - /* In wsrep BF we have already took lock_sys and trx - mutex either on wsrep_abort_transaction() or - before wsrep_kill_victim(). In replication we - could own lock_sys mutex taken in - lock_deadlock_check_and_resolve().*/ - - WSREP_DEBUG("Killing victim trx %p BF %d trx BF %d trx_id " TRX_ID_FMT " ABORT %d thd %p" - " current_thd %p BF %d wait_lock_modes: %s\n", - trx, wsrep_thd_is_BF(trx->mysql_thd, FALSE), - wsrep_thd_is_BF(thd, FALSE), - trx->id, trx->abort_type, - trx->mysql_thd, - current_thd, - wsrep_thd_is_BF(current_thd, FALSE), - lock_get_info(trx->lock.wait_lock).c_str()); - - if (!wsrep_thd_is_BF(trx->mysql_thd, FALSE) - && trx->abort_type == TRX_SERVER_ABORT) { - ut_ad(!lock_mutex_own()); - lock_mutex_enter(); - } - - if (trx->abort_type != TRX_WSREP_ABORT) { + switch (trx->abort_type) { +#ifdef WITH_WSREP + case TRX_WSREP_ABORT: + break; +#endif + case TRX_SERVER_ABORT: + if (!wsrep_thd_is_BF(trx->mysql_thd, FALSE)) { + lock_mutex_enter(); + } + /* fall through */ + case TRX_REPLICATION_ABORT: trx_mutex_enter(trx); } - - ut_ad(lock_mutex_own()); - ut_ad(trx_mutex_own(trx)); - - if (trx->lock.wait_lock) { - lock_cancel_waiting_and_release(trx->lock.wait_lock); - } - - if (trx->abort_type != TRX_WSREP_ABORT) { + /* Cancel a pending lock request if there are any */ + lock_trx_handle_wait(trx); + switch (trx->abort_type) { +#ifdef WITH_WSREP + case TRX_WSREP_ABORT: + break; +#endif + case TRX_SERVER_ABORT: + if (!wsrep_thd_is_BF(trx->mysql_thd, FALSE)) { + lock_mutex_exit(); + } + /* fall through */ + case TRX_REPLICATION_ABORT: trx_mutex_exit(trx); } - - if (!wsrep_thd_is_BF(trx->mysql_thd, FALSE) && - trx->abort_type == TRX_SERVER_ABORT) { - lock_mutex_exit(); - } } DBUG_VOID_RETURN; @@ -9000,14 +9025,12 @@ ha_innobase::write_row( user_thd); #ifdef WITH_WSREP - if (!error_result && - wsrep_thd_exec_mode(user_thd) == LOCAL_STATE && - wsrep_on(user_thd) && - !wsrep_consistency_check(user_thd) && - !wsrep_thd_ignore_table(user_thd)) - { - if (wsrep_append_keys(user_thd, false, record, NULL)) - { + if (!error_result + && wsrep_on(user_thd) + && wsrep_thd_exec_mode(user_thd) == LOCAL_STATE + && !wsrep_consistency_check(user_thd) + && !wsrep_thd_ignore_table(user_thd)) { + if (wsrep_append_keys(user_thd, false, record, NULL)) { DBUG_PRINT("wsrep", ("row key failed")); error_result = HA_ERR_INTERNAL_ERROR; goto wsrep_error; @@ -9626,7 +9649,7 @@ ha_innobase::unlock_row(void) But there are some calls to this function from the SQL layer when the transaction is in state TRX_STATE_NOT_STARTED. The check on prebuilt->select_lock_type above gets around this issue. */ - ut_ad(trx_state_eq(prebuilt->trx, TRX_STATE_ACTIVE)); + ut_ad(trx_state_eq(prebuilt->trx, TRX_STATE_ACTIVE, true)); switch (prebuilt->row_read_type) { case ROW_READ_WITH_LOCKS: @@ -11896,8 +11919,6 @@ create_options_are_invalid( CHECK_ERROR_ROW_TYPE_NEEDS_GT_ANTELOPE; break; case ROW_TYPE_DYNAMIC: - CHECK_ERROR_ROW_TYPE_NEEDS_FILE_PER_TABLE(use_tablespace); - CHECK_ERROR_ROW_TYPE_NEEDS_GT_ANTELOPE; /* ROW_FORMAT=DYNAMIC also shuns KEY_BLOCK_SIZE */ /* fall through */ case ROW_TYPE_COMPACT: @@ -12132,7 +12153,8 @@ innobase_table_flags( bool zip_allowed = true; ulint zip_ssize = 0; enum row_type row_format; - rec_format_t innodb_row_format = REC_FORMAT_COMPACT; + rec_format_t innodb_row_format = + get_row_format(innodb_default_row_format); bool use_data_dir; ha_table_option_struct *options= form->s->option_struct; @@ -12274,38 +12296,29 @@ innobase_table_flags( /* Validate the row format. Correct it if necessary */ switch (row_format) { + case ROW_TYPE_DEFAULT: + break; case ROW_TYPE_REDUNDANT: innodb_row_format = REC_FORMAT_REDUNDANT; break; - - case ROW_TYPE_COMPRESSED: case ROW_TYPE_DYNAMIC: + innodb_row_format = REC_FORMAT_DYNAMIC; + break; + case ROW_TYPE_COMPRESSED: if (!use_tablespace) { push_warning_printf( thd, Sql_condition::WARN_LEVEL_WARN, ER_ILLEGAL_HA_CREATE_OPTION, - "InnoDB: ROW_FORMAT=%s requires" - " innodb_file_per_table.", - get_row_format_name(row_format)); + "InnoDB: ROW_FORMAT=COMPRESSED requires" + " innodb_file_per_table."); } else if (file_format_allowed == UNIV_FORMAT_A) { push_warning_printf( thd, Sql_condition::WARN_LEVEL_WARN, ER_ILLEGAL_HA_CREATE_OPTION, - "InnoDB: ROW_FORMAT=%s requires" - " innodb_file_format > Antelope.", - get_row_format_name(row_format)); + "InnoDB: ROW_FORMAT=COMPRESSED requires" + " innodb_file_format > Antelope."); } else { - switch(row_format) { - case ROW_TYPE_COMPRESSED: - innodb_row_format = REC_FORMAT_COMPRESSED; - break; - case ROW_TYPE_DYNAMIC: - innodb_row_format = REC_FORMAT_DYNAMIC; - break; - default: - /* Not possible, avoid compiler warning */ - break; - } + innodb_row_format = REC_FORMAT_COMPRESSED; break; /* Correct row_format */ } zip_allowed = FALSE; @@ -12320,11 +12333,8 @@ innobase_table_flags( ER_ILLEGAL_HA_CREATE_OPTION, "InnoDB: assuming ROW_FORMAT=COMPACT."); /* fall through */ - case ROW_TYPE_DEFAULT: - /* If we fell through, set row format to Compact. */ - row_format = ROW_TYPE_COMPACT; - /* fall through */ case ROW_TYPE_COMPACT: + innodb_row_format = REC_FORMAT_COMPACT; break; } @@ -14514,6 +14524,7 @@ ha_innobase::optimize( This works OK otherwise, but MySQL locks the entire table during calls to OPTIMIZE, which is undesirable. */ + bool try_alter = true; if (srv_defragment) { int err; @@ -14521,7 +14532,7 @@ ha_innobase::optimize( err = defragment_table(prebuilt->table->name, NULL, false); if (err == 0) { - return (HA_ADMIN_OK); + try_alter = false; } else { push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, err, @@ -14529,9 +14540,7 @@ ha_innobase::optimize( prebuilt->table->name, err); if(err == ER_SP_ALREADY_EXISTS) { - return (HA_ADMIN_OK); - } else { - return (HA_ADMIN_TRY_ALTER); + try_alter = false; } } } @@ -14542,11 +14551,10 @@ ha_innobase::optimize( fts_sync_table(prebuilt->table, false, true, false); fts_optimize_table(prebuilt->table); } - return(HA_ADMIN_OK); - } else { - - return(HA_ADMIN_TRY_ALTER); + try_alter = false; } + + return try_alter ? HA_ADMIN_TRY_ALTER : HA_ADMIN_OK; } /*******************************************************************//** @@ -17518,13 +17526,6 @@ innodb_max_dirty_pages_pct_lwm_update( srv_max_dirty_pages_pct_lwm = in_val; } -UNIV_INTERN -void -ha_innobase::set_partition_owner_stats(ha_statistics *stats) -{ - ha_partition_stats= stats; -} - /************************************************************//** Validate the file format name and return its corresponding id. @return valid file format id */ @@ -19769,7 +19770,7 @@ wsrep_innobase_kill_one_trx( thd_get_thread_id(thd))); WSREP_DEBUG("kill query for: %ld", thd_get_thread_id(thd)); - /* Note that innobase_kill_connection will take lock_mutex + /* Note that innobase_kill_query will take lock_mutex and trx_mutex */ wsrep_thd_UNLOCK(thd); wsrep_thd_awake(thd, signal); @@ -21115,6 +21116,14 @@ static MYSQL_SYSVAR_BOOL(cmp_per_index_enabled, srv_cmp_per_index_enabled, "may have negative impact on performance (off by default)", NULL, innodb_cmp_per_index_update, FALSE); +static MYSQL_SYSVAR_ENUM(default_row_format, innodb_default_row_format, + PLUGIN_VAR_RQCMDARG, + "The default ROW FORMAT for all innodb tables created without explicit" + " ROW_FORMAT. Possible values are REDUNDANT, COMPACT, and DYNAMIC." + " The ROW_FORMAT value COMPRESSED is not allowed", + NULL, NULL, DEFAULT_ROW_FORMAT_COMPACT, + &innodb_default_row_format_typelib); + #ifdef UNIV_DEBUG static MYSQL_SYSVAR_UINT(trx_rseg_n_slots_debug, trx_rseg_n_slots_debug, PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_NOCMDOPT, @@ -21558,6 +21567,7 @@ static struct st_mysql_sys_var* innobase_system_variables[]= { MYSQL_SYSVAR(sync_array_size), MYSQL_SYSVAR(compression_failure_threshold_pct), MYSQL_SYSVAR(compression_pad_pct_max), + MYSQL_SYSVAR(default_row_format), #ifdef UNIV_DEBUG MYSQL_SYSVAR(trx_rseg_n_slots_debug), MYSQL_SYSVAR(limit_optimistic_insert_debug), diff --git a/storage/xtradb/handler/ha_innodb.h b/storage/xtradb/handler/ha_innodb.h index c5b0e7237..3dbbc53a0 100644 --- a/storage/xtradb/handler/ha_innodb.h +++ b/storage/xtradb/handler/ha_innodb.h @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 2000, 2017, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2013, 2017, MariaDB Corporation. +Copyright (c) 2013, 2018, MariaDB Corporation. 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 @@ -100,8 +100,6 @@ class ha_innobase: public handler or undefined */ uint num_write_row; /*!< number of write_row() calls */ - ha_statistics* ha_partition_stats; /*!< stats of the partition owner - handler (if there is one) */ uint store_key_val_for_row(uint keynr, char* buff, uint buff_len, const uchar* record); inline void update_thd(THD* thd); @@ -318,7 +316,6 @@ class ha_innobase: public handler Alter_inplace_info* ha_alter_info, bool commit); /** @} */ - void set_partition_owner_stats(ha_statistics *stats); bool check_if_incompatible_data(HA_CREATE_INFO *info, uint table_changes); diff --git a/storage/xtradb/handler/handler0alter.cc b/storage/xtradb/handler/handler0alter.cc index 2a2c466fd..131939bcd 100644 --- a/storage/xtradb/handler/handler0alter.cc +++ b/storage/xtradb/handler/handler0alter.cc @@ -1622,6 +1622,7 @@ innobase_create_index_def( if (key_clustered) { DBUG_ASSERT(!(key->flags & HA_FULLTEXT)); + DBUG_ASSERT(key->flags & HA_NOSAME); index->ind_type |= DICT_CLUSTERED; } else if (key->flags & HA_FULLTEXT) { DBUG_ASSERT(!(key->flags & HA_KEYFLAG_MASK @@ -1937,14 +1938,9 @@ innobase_create_key_defs( ulint primary_key_number; if (new_primary) { - if (n_add == 0) { - DBUG_ASSERT(got_default_clust); - DBUG_ASSERT(altered_table->s->primary_key - == 0); - primary_key_number = 0; - } else { - primary_key_number = *add; - } + DBUG_ASSERT(n_add || got_default_clust); + DBUG_ASSERT(n_add || !altered_table->s->primary_key); + primary_key_number = altered_table->s->primary_key; } else if (got_default_clust) { /* Create the GEN_CLUST_INDEX */ index_def_t* index = indexdef++; @@ -4433,12 +4429,16 @@ rollback_inplace_alter_table( row_mysql_lock_data_dictionary(ctx->trx); if (ctx->need_rebuild()) { - dberr_t err; - ulint flags = ctx->new_table->flags; - /* DML threads can access ctx->new_table via the online rebuild log. Free it first. */ innobase_online_rebuild_log_free(prebuilt->table); + } + + if (!ctx->new_table) { + ut_ad(ctx->need_rebuild()); + } else if (ctx->need_rebuild()) { + dberr_t err; + ulint flags = ctx->new_table->flags; /* Since the FTS index specific auxiliary tables has not yet registered with "table->fts" by fts_add_index(), @@ -5800,21 +5800,6 @@ ha_innobase::commit_inplace_alter_table( ut_ad(prebuilt->table == ctx0->old_table); ha_alter_info->group_commit_ctx = NULL; - /* Free the ctx->trx of other partitions, if any. We will only - use the ctx0->trx here. Others may have been allocated in - the prepare stage. */ - - for (inplace_alter_handler_ctx** pctx = &ctx_array[1]; *pctx; - pctx++) { - ha_innobase_inplace_ctx* ctx - = static_cast(*pctx); - - if (ctx->trx) { - trx_free_for_mysql(ctx->trx); - ctx->trx = NULL; - } - } - trx_start_if_not_started_xa(prebuilt->trx); for (inplace_alter_handler_ctx** pctx = ctx_array; *pctx; pctx++) { @@ -6193,10 +6178,6 @@ ha_innobase::commit_inplace_alter_table( covering all partitions. */ share->idx_trans_tbl.index_count = 0; - if (trx == ctx0->trx) { - ctx0->trx = NULL; - } - /* Tell the InnoDB server that there might be work for utility threads: */ @@ -6219,10 +6200,31 @@ ha_innobase::commit_inplace_alter_table( } row_mysql_unlock_data_dictionary(trx); - trx_free_for_mysql(trx); + if (trx != ctx0->trx) { + trx_free_for_mysql(trx); + } DBUG_RETURN(true); } + if (trx == ctx0->trx) { + ctx0->trx = NULL; + } + + /* Free the ctx->trx of other partitions, if any. We will only + use the ctx0->trx here. Others may have been allocated in + the prepare stage. */ + + for (inplace_alter_handler_ctx** pctx = &ctx_array[1]; *pctx; + pctx++) { + ha_innobase_inplace_ctx* ctx + = static_cast(*pctx); + + if (ctx->trx) { + trx_free_for_mysql(ctx->trx); + ctx->trx = NULL; + } + } + /* Release the table locks. */ trx_commit_for_mysql(prebuilt->trx); diff --git a/storage/xtradb/handler/i_s.cc b/storage/xtradb/handler/i_s.cc index 94cd6f295..dc4fa99fc 100644 --- a/storage/xtradb/handler/i_s.cc +++ b/storage/xtradb/handler/i_s.cc @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 2007, 2016, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2014, 2017, MariaDB Corporation. +Copyright (c) 2014, 2018, MariaDB Corporation. 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 @@ -4922,9 +4922,11 @@ i_s_innodb_buffer_page_fill( mutex_enter(&dict_sys->mutex); - if (const dict_index_t* index = - dict_index_get_if_in_cache_low( - page_info->index_id)) { + const dict_index_t* index = + dict_index_get_if_in_cache_low( + page_info->index_id); + + if (index) { table_name_end = innobase_convert_name( table_name, sizeof(table_name), index->table_name, @@ -4947,7 +4949,10 @@ i_s_innodb_buffer_page_fill( OK(ret); - fields[IDX_BUFFER_PAGE_TABLE_NAME]->set_notnull(); + if (index) { + fields[IDX_BUFFER_PAGE_TABLE_NAME] + ->set_notnull(); + } } OK(fields[IDX_BUFFER_PAGE_NUM_RECS]->store( @@ -5621,9 +5626,11 @@ i_s_innodb_buf_page_lru_fill( mutex_enter(&dict_sys->mutex); - if (const dict_index_t* index = - dict_index_get_if_in_cache_low( - page_info->index_id)) { + const dict_index_t* index = + dict_index_get_if_in_cache_low( + page_info->index_id); + + if (index) { table_name_end = innobase_convert_name( table_name, sizeof(table_name), index->table_name, @@ -5646,7 +5653,10 @@ i_s_innodb_buf_page_lru_fill( OK(ret); - fields[IDX_BUF_LRU_PAGE_TABLE_NAME]->set_notnull(); + if (index) { + fields[IDX_BUF_LRU_PAGE_TABLE_NAME] + ->set_notnull(); + } } OK(fields[IDX_BUF_LRU_PAGE_NUM_RECS]->store( diff --git a/storage/xtradb/ibuf/ibuf0ibuf.cc b/storage/xtradb/ibuf/ibuf0ibuf.cc index b169916c3..96a86eea4 100644 --- a/storage/xtradb/ibuf/ibuf0ibuf.cc +++ b/storage/xtradb/ibuf/ibuf0ibuf.cc @@ -5218,6 +5218,10 @@ ibuf_check_bitmap_on_import( bitmap_page = ibuf_bitmap_get_map_page( space_id, page_no, zip_size, &mtr); + if (!bitmap_page) { + mutex_exit(&ibuf_mutex); + return DB_CORRUPTION; + } for (i = FSP_IBUF_BITMAP_OFFSET + 1; i < page_size; i++) { const ulint offset = page_no + i; diff --git a/storage/xtradb/include/btr0sea.h b/storage/xtradb/include/btr0sea.h index bfe2c43de..55366d3c0 100644 --- a/storage/xtradb/include/btr0sea.h +++ b/storage/xtradb/include/btr0sea.h @@ -1,6 +1,7 @@ /***************************************************************************** Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 2018, MariaDB Corporation. 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 @@ -142,17 +143,11 @@ btr_search_drop_page_hash_index( s- or x-latched, or an index page for which we know that block->buf_fix_count == 0 */ -/********************************************************************//** -Drops a possible page hash index when a page is evicted from the buffer pool -or freed in a file segment. */ +/** Drop possible adaptive hash index entries when a page is evicted +from the buffer pool or freed in a file, or the index is being dropped. */ UNIV_INTERN void -btr_search_drop_page_hash_when_freed( -/*=================================*/ - ulint space, /*!< in: space id */ - ulint zip_size, /*!< in: compressed page size in bytes - or 0 for uncompressed pages */ - ulint page_no); /*!< in: page number */ +btr_search_drop_page_hash_when_freed(ulint space, ulint page_no); /********************************************************************//** Updates the page hash index when a single record is inserted on a page. */ UNIV_INTERN diff --git a/storage/xtradb/include/buf0buf.h b/storage/xtradb/include/buf0buf.h index 7661ba178..0944b5d40 100644 --- a/storage/xtradb/include/buf0buf.h +++ b/storage/xtradb/include/buf0buf.h @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 1995, 2016, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2013, 2017, MariaDB Corporation. +Copyright (c) 2013, 2018, MariaDB Corporation. 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 @@ -38,6 +38,7 @@ Created 11/5/1995 Heikki Tuuri #include "ut0rbt.h" #include "os0proc.h" #include "log0log.h" +#include "my_atomic.h" /** @name Modes for buf_page_get_gen */ /* @{ */ @@ -1528,45 +1529,16 @@ buf_page_encrypt_before_write( buf_page_t* bpage, byte* src_frame); -/********************************************************************** -The hook that is called after page is written to disk. -The function releases any resources needed for encryption that was allocated -in buf_page_encrypt_before_write */ -UNIV_INTERN -ibool -buf_page_encrypt_after_write( -/*=========================*/ - buf_page_t* page); /*!< in/out: buffer page that was flushed */ - -/********************************************************************//** -The hook that is called just before a page is read from disk. -The function allocates memory that is used to temporarily store disk content -before getting decrypted */ -UNIV_INTERN -byte* -buf_page_decrypt_before_read( -/*=========================*/ - buf_page_t* page, /*!< in/out: buffer page read from disk */ - ulint zip_size); /*!< in: compressed page size, or 0 */ - -/********************************************************************//** -The hook that is called just after a page is read from disk. -The function decrypt disk content into buf_page_t and releases the -temporary buffer that was allocated in buf_page_decrypt_before_read */ -UNIV_INTERN -bool -buf_page_decrypt_after_read( -/*========================*/ - buf_page_t* page); /*!< in/out: buffer page read from disk */ - /** @brief The temporary memory structure. NOTE! The definition appears here only for other modules of this directory (buf) to see it. Do not use from outside! */ typedef struct { - bool reserved; /*!< true if this slot is reserved +private: + int32 reserved; /*!< true if this slot is reserved */ +public: byte* crypt_buf; /*!< for encryption the data needs to be copied to a separate buffer before it's encrypted&written. this as a page can be @@ -1577,6 +1549,21 @@ typedef struct { byte* out_buf; /*!< resulting buffer after encryption/compression. This is a pointer and not allocated. */ + + /** Release the slot */ + void release() + { + my_atomic_store32_explicit(&reserved, false, + MY_MEMORY_ORDER_RELAXED); + } + + /** Acquire the slot + @return whether the slot was acquired */ + bool acquire() + { + return !my_atomic_fas32_explicit(&reserved, true, + MY_MEMORY_ORDER_RELAXED); + } } buf_tmp_buffer_t; /** The common buffer control block structure diff --git a/storage/xtradb/include/buf0lru.h b/storage/xtradb/include/buf0lru.h index 1bc11937f..f0ba1bb22 100644 --- a/storage/xtradb/include/buf0lru.h +++ b/storage/xtradb/include/buf0lru.h @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 1995, 2016, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2017, MariaDB Corporation. +Copyright (c) 2017, 2018, MariaDB Corporation. 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 @@ -36,6 +36,7 @@ Created 11/5/1995 Heikki Tuuri // Forward declaration struct trx_t; +struct dict_table_t; /******************************************************************//** Returns TRUE if less than 25 % of the buffer pool is available. This can be @@ -54,14 +55,15 @@ These are low-level functions /** Minimum LRU list length for which the LRU_old pointer is defined */ #define BUF_LRU_OLD_MIN_LEN 512 /* 8 megabytes of 16k pages */ +/** Drop the adaptive hash index for a tablespace. +@param[in,out] table table */ +UNIV_INTERN void buf_LRU_drop_page_hash_for_tablespace(dict_table_t* table); + /** Empty the flush list for all pages belonging to a tablespace. @param[in] id tablespace identifier @param[in] trx transaction, for checking for user interrupt; - or NULL if nothing is to be written -@param[in] drop_ahi whether to drop the adaptive hash index */ -UNIV_INTERN -void -buf_LRU_flush_or_remove_pages(ulint id, const trx_t* trx, bool drop_ahi=false); + or NULL if nothing is to be written */ +UNIV_INTERN void buf_LRU_flush_or_remove_pages(ulint id, const trx_t* trx); #if defined UNIV_DEBUG || defined UNIV_BUF_DEBUG /********************************************************************//** diff --git a/storage/xtradb/include/data0type.ic b/storage/xtradb/include/data0type.ic index 96b001e19..a7e2eb068 100644 --- a/storage/xtradb/include/data0type.ic +++ b/storage/xtradb/include/data0type.ic @@ -525,6 +525,7 @@ dtype_get_fixed_size_low( return(0); } #endif /* UNIV_DEBUG */ + /* fall through */ case DATA_CHAR: case DATA_FIXBINARY: case DATA_INT: @@ -602,6 +603,7 @@ dtype_get_min_size_low( return(0); } #endif /* UNIV_DEBUG */ + /* fall through */ case DATA_CHAR: case DATA_FIXBINARY: case DATA_INT: diff --git a/storage/xtradb/include/fil0fil.h b/storage/xtradb/include/fil0fil.h index 8c3bf7d2b..7b8339fec 100644 --- a/storage/xtradb/include/fil0fil.h +++ b/storage/xtradb/include/fil0fil.h @@ -170,8 +170,7 @@ extern fil_addr_t fil_addr_null; #define FIL_PAGE_TYPE_BLOB 10 /*!< Uncompressed BLOB page */ #define FIL_PAGE_TYPE_ZBLOB 11 /*!< First compressed BLOB page */ #define FIL_PAGE_TYPE_ZBLOB2 12 /*!< Subsequent compressed BLOB page */ -#define FIL_PAGE_TYPE_COMPRESSED 13 /*!< Compressed page */ -#define FIL_PAGE_TYPE_LAST FIL_PAGE_TYPE_COMPRESSED +#define FIL_PAGE_TYPE_LAST FIL_PAGE_TYPE_ZBLOB2 /*!< Last page type */ /* @} */ @@ -275,10 +274,6 @@ struct fil_space_t { an insert buffer merge request for a page because it actually was for the previous incarnation of the space */ - ibool stop_ios;/*!< TRUE if we want to rename the - .ibd file of tablespace and want to - stop temporarily posting of new i/o - requests on the file */ bool stop_new_ops; /*!< we set this true when we start deleting a single-table tablespace. @@ -345,9 +340,6 @@ struct fil_space_t { corrupted page. */ bool is_corrupt; /*!< true if tablespace corrupted */ - bool printed_compression_failure; - /*!< true if we have already printed - compression failure */ fil_space_crypt_t* crypt_data; /*!< tablespace crypt data or NULL */ ulint file_block_size; @@ -1309,107 +1301,6 @@ fil_delete_file( /*============*/ const char* path); /*!< in: filepath of the ibd tablespace */ -/** Callback functor. */ -struct PageCallback { - - /** - Default constructor */ - PageCallback() - : - m_zip_size(), - m_page_size(), - m_filepath() UNIV_NOTHROW {} - - virtual ~PageCallback() UNIV_NOTHROW {} - - /** - Called for page 0 in the tablespace file at the start. - @param file_size - size of the file in bytes - @param block - contents of the first page in the tablespace file - @retval DB_SUCCESS or error code.*/ - virtual dberr_t init( - os_offset_t file_size, - const buf_block_t* block) UNIV_NOTHROW = 0; - - /** - Called for every page in the tablespace. If the page was not - updated then its state must be set to BUF_PAGE_NOT_USED. For - compressed tables the page descriptor memory will be at offset: - block->frame + UNIV_PAGE_SIZE; - @param offset - physical offset within the file - @param block - block read from file, note it is not from the buffer pool - @retval DB_SUCCESS or error code. */ - virtual dberr_t operator()( - os_offset_t offset, - buf_block_t* block) UNIV_NOTHROW = 0; - - /** - Set the name of the physical file and the file handle that is used - to open it for the file that is being iterated over. - @param filename - then physical name of the tablespace file. - @param file - OS file handle */ - void set_file(const char* filename, pfs_os_file_t file) UNIV_NOTHROW - { - m_file = file; - m_filepath = filename; - } - - /** - @return the space id of the tablespace */ - virtual ulint get_space_id() const UNIV_NOTHROW = 0; - - /** The compressed page size - @return the compressed page size */ - ulint get_zip_size() const - { - return(m_zip_size); - } - - /** - Set the tablespace compressed table size. - @return DB_SUCCESS if it is valie or DB_CORRUPTION if not */ - dberr_t set_zip_size(const buf_frame_t* page) UNIV_NOTHROW; - - /** The compressed page size - @return the compressed page size */ - ulint get_page_size() const - { - return(m_page_size); - } - - /** Compressed table page size */ - ulint m_zip_size; - - /** The tablespace page size. */ - ulint m_page_size; - - /** File handle to the tablespace */ - pfs_os_file_t m_file; - - /** Physical file path. */ - const char* m_filepath; - -protected: - // Disable copying - PageCallback(const PageCallback&); - PageCallback& operator=(const PageCallback&); -}; - -/********************************************************************//** -Iterate over all the pages in the tablespace. -@param table - the table definiton in the server -@param n_io_buffers - number of blocks to read and write together -@param callback - functor that will do the page updates -@return DB_SUCCESS or error code */ -UNIV_INTERN -dberr_t -fil_tablespace_iterate( -/*===================*/ - dict_table_t* table, - ulint n_io_buffers, - PageCallback& callback) - MY_ATTRIBUTE((nonnull, warn_unused_result)); - /*******************************************************************//** Checks if a single-table tablespace for a given table name exists in the tablespace memory cache. diff --git a/storage/xtradb/include/fil0fil.ic b/storage/xtradb/include/fil0fil.ic index 6c2504c9f..3f21c5293 100644 --- a/storage/xtradb/include/fil0fil.ic +++ b/storage/xtradb/include/fil0fil.ic @@ -1,6 +1,6 @@ /***************************************************************************** -Copyright (c) 2015, 2017, MariaDB Corporation. +Copyright (c) 2015, 2018, MariaDB Corporation. 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 @@ -65,12 +65,9 @@ fil_get_page_type_name( return "ZBLOB"; case FIL_PAGE_TYPE_ZBLOB2: return "ZBLOB2"; - case FIL_PAGE_TYPE_COMPRESSED: - return "ORACLE PAGE COMPRESSED"; } return "PAGE TYPE CORRUPTED"; - } /****************************************************************//** @@ -112,8 +109,7 @@ fil_page_type_validate( page_type == FIL_PAGE_TYPE_XDES || page_type == FIL_PAGE_TYPE_BLOB || page_type == FIL_PAGE_TYPE_ZBLOB || - page_type == FIL_PAGE_TYPE_ZBLOB2 || - page_type == FIL_PAGE_TYPE_COMPRESSED))) { + page_type == FIL_PAGE_TYPE_ZBLOB2))) { ulint key_version = mach_read_from_4(page + FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION); bool page_compressed = (page_type == FIL_PAGE_PAGE_COMPRESSED); diff --git a/storage/xtradb/include/fil0pagecompress.h b/storage/xtradb/include/fil0pagecompress.h index 03e16699c..934372c55 100644 --- a/storage/xtradb/include/fil0pagecompress.h +++ b/storage/xtradb/include/fil0pagecompress.h @@ -1,6 +1,6 @@ /***************************************************************************** -Copyright (C) 2013, 2017 MariaDB Corporation. All Rights Reserved. +Copyright (C) 2013, 2018 MariaDB Corporation. 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 @@ -30,70 +30,26 @@ atomic writes information to table space. Created 11/12/2013 Jan Lindström jan.lindstrom@skysql.com ***********************************************************************/ -/*******************************************************************//** -Find out wheather the page is index page or not -@return true if page type index page, false if not */ -UNIV_INLINE -ibool -fil_page_is_index_page( -/*===================*/ - byte *buf); /*!< in: page */ - -/****************************************************************//** -Get the name of the compression algorithm used for page -compression. -@return compression algorithm name or "UNKNOWN" if not known*/ -UNIV_INLINE -const char* -fil_get_compression_alg_name( -/*=========================*/ - ulint comp_alg); /*!mutex and sometimes by trx->mutex. */ -typedef enum { +enum trx_abort_t { TRX_SERVER_ABORT = 0, - TRX_WSREP_ABORT = 1, - TRX_REPLICATION_ABORT = 2 -} trx_abort_t; +#ifdef WITH_WSREP + TRX_WSREP_ABORT, +#endif + TRX_REPLICATION_ABORT +}; struct trx_t{ ulint magic_n; diff --git a/storage/xtradb/include/univ.i b/storage/xtradb/include/univ.i index 93ab71bf4..7e1a6b0ee 100644 --- a/storage/xtradb/include/univ.i +++ b/storage/xtradb/include/univ.i @@ -45,10 +45,10 @@ Created 1/20/1994 Heikki Tuuri #define INNODB_VERSION_MAJOR 5 #define INNODB_VERSION_MINOR 6 -#define INNODB_VERSION_BUGFIX 36 +#define INNODB_VERSION_BUGFIX 39 #ifndef PERCONA_INNODB_VERSION -#define PERCONA_INNODB_VERSION 83.0 +#define PERCONA_INNODB_VERSION 83.1 #endif /* Enable UNIV_LOG_ARCHIVE in XtraDB */ @@ -73,6 +73,10 @@ component, i.e. we show M.N.P as M.N */ IB_TO_STR(INNODB_VERSION_MAJOR) "." \ IB_TO_STR(INNODB_VERSION_MINOR) "/en/" +/** How far ahead should we tell the service manager the timeout +(time in seconds) */ +#define INNODB_EXTEND_TIMEOUT_INTERVAL 30 + #ifdef MYSQL_DYNAMIC_PLUGIN /* In the dynamic plugin, redefine some externally visible symbols in order not to conflict with the symbols of a builtin InnoDB. */ diff --git a/storage/xtradb/include/ut0timer.h b/storage/xtradb/include/ut0timer.h index f361ae79b..3015771b4 100644 --- a/storage/xtradb/include/ut0timer.h +++ b/storage/xtradb/include/ut0timer.h @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 2013, 2014, Facebook, Inc. All Rights Reserved. -Copyright (c) 2014, SkySQL Ab. All Rights Reserved. +Copyright (c) 2014, 2018, MariaDB Corporation. 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 @@ -19,7 +19,7 @@ this program; if not, write to the Free Software Foundation, Inc., /********************************************************************//** @file include/ut0timer.h -Timer rountines +Timer routines Created 30/07/2014 Jan Lindström jan.lindstrom@skysql.com modified from https://github.com/facebook/mysql-5.6/commit/c75a413edeb96eb99bf11d7269bdfea06f96d6b6 @@ -28,8 +28,6 @@ modified from https://github.com/facebook/mysql-5.6/commit/c75a413edeb96eb99bf11 #define ut0timer_h #include "univ.i" -#include "data0type.h" -#include /* Current timer stats */ extern struct my_timer_unit_info ut_timer; @@ -47,39 +45,6 @@ Initializes my_timer struct to contain the info for selected timer.*/ UNIV_INTERN void ut_init_timer(void); -/**************************************************************//** -Return time passed since time then, automatically adjusted -for the estimated timer overhead. -@return time passed since "then" */ -UNIV_INLINE -ulonglong -ut_timer_since( -/*===========*/ - ulonglong then); /*!< in: time where to calculate */ -/**************************************************************//** -Get time passed since "then", and update then to now -@return time passed sinche "then" */ -UNIV_INLINE -ulonglong -ut_timer_since_and_update( -/*======================*/ - ulonglong *then); /*!< in: time where to calculate */ -/**************************************************************//** -Convert native timer units in a ulonglong into seconds in a double -@return time in a seconds */ -UNIV_INLINE -double -ut_timer_to_seconds( -/*=================*/ - ulonglong when); /*!< in: time where to calculate */ -/**************************************************************//** -Convert native timer units in a ulonglong into milliseconds in a double -@return time in milliseconds */ -UNIV_INLINE -double -ut_timer_to_milliseconds( -/*=====================*/ - ulonglong when); /*!< in: time where to calculate */ /**************************************************************//** Convert native timer units in a ulonglong into microseconds in a double @return time in microseconds */ diff --git a/storage/xtradb/include/ut0timer.ic b/storage/xtradb/include/ut0timer.ic index 815726e9d..02af23cdc 100644 --- a/storage/xtradb/include/ut0timer.ic +++ b/storage/xtradb/include/ut0timer.ic @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 2013, 2014, Facebook, Inc. All Rights Reserved. -Copyright (c) 2014, SkySQL Ab. All Rights Reserved. +Copyright (c) 2014, 2018, MariaDB Corporation. 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 @@ -19,69 +19,12 @@ this program; if not, write to the Free Software Foundation, Inc., /********************************************************************//** @file include/ut0timer.ic -Timer rountines +Timer routines Created 30/07/2014 Jan Lindström jan.lindstrom@skysql.com modified from https://github.com/facebook/mysql-5.6/commit/c75a413edeb96eb99bf11d7269bdfea06f96d6b6 *************************************************************************/ -/**************************************************************//** -Return time passed since time then, automatically adjusted -for the estimated timer overhead. -@return time passed since "then" */ -UNIV_INLINE -ulonglong -ut_timer_since( -/*===========*/ - ulonglong then) /*!< in: time where to calculate */ -{ - return (ut_timer_now() - then) - ut_timer.overhead; -} - -/**************************************************************//** -Get time passed since "then", and update then to now -@return time passed sinche "then" */ -UNIV_INLINE -ulonglong -ut_timer_since_and_update( -/*======================*/ - ulonglong *then) /*!< in: time where to calculate */ -{ - ulonglong now = ut_timer_now(); - ulonglong ret = (now - (*then)) - ut_timer.overhead; - *then = now; - return ret; -} - -/**************************************************************//** -Convert native timer units in a ulonglong into seconds in a double -@return time in a seconds */ -UNIV_INLINE -double -ut_timer_to_seconds( -/*=================*/ - ulonglong when) /*!< in: time where to calculate */ -{ - double ret = (double)(when); - ret /= (double)(ut_timer.frequency); - return ret; -} - -/**************************************************************//** -Convert native timer units in a ulonglong into milliseconds in a double -@return time in milliseconds */ -UNIV_INLINE -double -ut_timer_to_milliseconds( -/*=====================*/ - ulonglong when) /*!< in: time where to calculate */ -{ - double ret = (double)(when); - ret *= 1000.0; - ret /= (double)(ut_timer.frequency); - return ret; -} - /**************************************************************//** Convert native timer units in a ulonglong into microseconds in a double @return time in microseconds */ diff --git a/storage/xtradb/include/ut0ut.h b/storage/xtradb/include/ut0ut.h index 5fba1c7f5..726c01a2e 100644 --- a/storage/xtradb/include/ut0ut.h +++ b/storage/xtradb/include/ut0ut.h @@ -1,6 +1,6 @@ /***************************************************************************** -Copyright (c) 1994, 2016, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 1994, 2017, Oracle and/or its affiliates. All Rights Reserved. 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 @@ -283,6 +283,15 @@ UNIV_INTERN ulint ut_time_ms(void); /*============*/ +#ifdef _WIN32 +/**********************************************************//** +Initialise highest available time resolution API on Windows +@return 0 if all OK else -1 */ +int +ut_win_init_time(); + +#endif /* _WIN32 */ + #endif /* !UNIV_HOTBACKUP */ /**********************************************************//** diff --git a/storage/xtradb/lock/lock0lock.cc b/storage/xtradb/lock/lock0lock.cc index a9077cb19..549cc411f 100644 --- a/storage/xtradb/lock/lock0lock.cc +++ b/storage/xtradb/lock/lock0lock.cc @@ -910,7 +910,7 @@ UNIV_INLINE void lock_reset_lock_and_trx_wait( /*=========================*/ - lock_t* lock) /*!< in/out: record lock */ + lock_t* lock) /*!< in/out: record lock */ { ut_ad(lock_get_wait(lock)); ut_ad(lock_mutex_own()); @@ -2358,13 +2358,6 @@ lock_rec_create( trx_mutex_enter(trx); } - /* trx might not wait for c_lock, but some other lock - does not matter if wait_lock was released above - */ - if (c_lock->trx->lock.wait_lock == c_lock) { - lock_reset_lock_and_trx_wait(lock); - } - trx_mutex_exit(c_lock->trx); if (wsrep_debug) { @@ -5010,19 +5003,18 @@ lock_table_create( UT_LIST_ADD_LAST(trx_locks, trx->lock.trx_locks, lock); #ifdef WITH_WSREP - if (wsrep_thd_is_wsrep(trx->mysql_thd)) { - if (c_lock && wsrep_thd_is_BF(trx->mysql_thd, FALSE)) { + if (c_lock) { + if (wsrep_thd_is_wsrep(trx->mysql_thd) + && wsrep_thd_is_BF(trx->mysql_thd, FALSE)) { UT_LIST_INSERT_AFTER( un_member.tab_lock.locks, table->locks, c_lock, lock); } else { UT_LIST_ADD_LAST(un_member.tab_lock.locks, table->locks, lock); } - if (c_lock) { - trx_mutex_enter(c_lock->trx); - } + trx_mutex_enter(c_lock->trx); - if (c_lock && c_lock->trx->lock.que_state == TRX_QUE_LOCK_WAIT) { + if (c_lock->trx->lock.que_state == TRX_QUE_LOCK_WAIT) { c_lock->trx->lock.was_chosen_as_deadlock_victim = TRUE; @@ -5031,36 +5023,21 @@ lock_table_create( wsrep_print_wait_locks(c_lock->trx->lock.wait_lock); } - /* have to release trx mutex for the duration of - victim lock release. This will eventually call - lock_grant, which wants to grant trx mutex again - */ - /* caller has trx_mutex, have to release for lock cancel */ + /* The lock release will call lock_grant(), + which would acquire trx->mutex again. */ trx_mutex_exit(trx); lock_cancel_waiting_and_release(c_lock->trx->lock.wait_lock); trx_mutex_enter(trx); - /* trx might not wait for c_lock, but some other lock - does not matter if wait_lock was released above - */ - if (c_lock->trx->lock.wait_lock == c_lock) { - lock_reset_lock_and_trx_wait(lock); - } - if (wsrep_debug) { fprintf(stderr, "WSREP: c_lock canceled " TRX_ID_FMT "\n", c_lock->trx->id); } } - if (c_lock) { - trx_mutex_exit(c_lock->trx); - } - } else { + trx_mutex_exit(c_lock->trx); + } else #endif /* WITH_WSREP */ UT_LIST_ADD_LAST(un_member.tab_lock.locks, table->locks, lock); -#ifdef WITH_WSREP - } -#endif /* WITH_WSREP */ if (UNIV_UNLIKELY(type_mode & LOCK_WAIT)) { @@ -6978,10 +6955,10 @@ lock_rec_block_validate( page_no, RW_X_LATCH, NULL, BUF_GET_POSSIBLY_FREED, __FILE__, __LINE__, &mtr); - - buf_block_dbg_add_level(block, SYNC_NO_ORDER_CHECK); - - ut_ad(lock_rec_validate_page(block)); + if (block) { + buf_block_dbg_add_level(block, SYNC_NO_ORDER_CHECK); + ut_ad(lock_rec_validate_page(block)); + } mtr_commit(&mtr); fil_space_release(space); @@ -8042,7 +8019,10 @@ lock_trx_release_locks( } mutex_exit(&trx_sys->mutex); } else { - ut_ad(trx_state_eq(trx, TRX_STATE_ACTIVE)); + ut_ad(trx_state_eq(trx, TRX_STATE_ACTIVE) + || (trx_state_eq(trx, TRX_STATE_COMMITTED_IN_MEMORY) + && trx->is_recovered + && !UT_LIST_GET_LEN(trx->lock.trx_locks))); } /* The transition of trx->state to TRX_STATE_COMMITTED_IN_MEMORY @@ -8107,26 +8087,19 @@ lock_trx_handle_wait( /*=================*/ trx_t* trx) /*!< in/out: trx lock state */ { - dberr_t err; - - lock_mutex_enter(); - - trx_mutex_enter(trx); + ut_ad(lock_mutex_own()); + ut_ad(trx_mutex_own(trx)); if (trx->lock.was_chosen_as_deadlock_victim) { - err = DB_DEADLOCK; - } else if (trx->lock.wait_lock != NULL) { - lock_cancel_waiting_and_release(trx->lock.wait_lock); - err = DB_LOCK_WAIT; - } else { + return DB_DEADLOCK; + } + if (!trx->lock.wait_lock) { /* The lock was probably granted before we got here. */ - err = DB_SUCCESS; + return DB_SUCCESS; } - lock_mutex_exit(); - trx_mutex_exit(trx); - - return(err); + lock_cancel_waiting_and_release(trx->lock.wait_lock); + return DB_LOCK_WAIT; } /*********************************************************************//** diff --git a/storage/xtradb/log/log0log.cc b/storage/xtradb/log/log0log.cc index 8f8984f88..1420f5a3a 100644 --- a/storage/xtradb/log/log0log.cc +++ b/storage/xtradb/log/log0log.cc @@ -2,7 +2,7 @@ Copyright (c) 1995, 2017, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2009, Google Inc. -Copyright (c) 2014, 2017, MariaDB Corporation. +Copyright (c) 2014, 2018, MariaDB Corporation. Portions of this file contain modifications contributed and copyrighted by Google, Inc. Those modifications are gratefully acknowledged and are described @@ -49,7 +49,7 @@ Created 12/9/1995 Heikki Tuuri #ifndef UNIV_HOTBACKUP #if MYSQL_VERSION_ID < 100200 -# include /* sd_notifyf() */ +# include #endif #include "mem0mem.h" @@ -1561,6 +1561,12 @@ log_write_up_to( return; } + if (srv_shutdown_state != SRV_SHUTDOWN_NONE) { + service_manager_extend_timeout(INNODB_EXTEND_TIMEOUT_INTERVAL, + "log write up to: " LSN_PF, + lsn); + } + loop: ut_ad(++loop_count < 100); @@ -2602,8 +2608,9 @@ log_group_read_log_seg( if (recv_recovery_is_on() && recv_sys && recv_sys->report(ut_time())) { ib_logf(IB_LOG_LEVEL_INFO, "Read redo log up to LSN=" LSN_PF, start_lsn); - sd_notifyf(0, "STATUS=Read redo log up to LSN=" LSN_PF, - start_lsn); + service_manager_extend_timeout(INNODB_EXTEND_TIMEOUT_INTERVAL, + "Read redo log up to LSN=" LSN_PF, + start_lsn); } if (start_lsn != end_lsn) { @@ -3553,7 +3560,9 @@ logs_empty_and_mark_files_at_shutdown(void) os_event_set(lock_sys->timeout_event); os_event_set(dict_stats_event); } - os_thread_sleep(100000); +#define COUNT_INTERVAL 600U +#define CHECK_INTERVAL 100000U + os_thread_sleep(CHECK_INTERVAL); count++; @@ -3565,7 +3574,11 @@ logs_empty_and_mark_files_at_shutdown(void) if (ulint total_trx = srv_was_started && !srv_read_only_mode && srv_force_recovery < SRV_FORCE_NO_TRX_UNDO ? trx_sys_any_active_transactions() : 0) { - if (srv_print_verbose_log && count > 600) { + if (srv_print_verbose_log && count > COUNT_INTERVAL) { + service_manager_extend_timeout( + COUNT_INTERVAL * CHECK_INTERVAL/1000000 * 2, + "Waiting for %lu active transactions to finish", + (ulong) total_trx); ib_logf(IB_LOG_LEVEL_INFO, "Waiting for %lu active transactions to finish", (ulong) total_trx); @@ -3600,7 +3613,10 @@ logs_empty_and_mark_files_at_shutdown(void) if (thread_name) { ut_ad(!srv_read_only_mode); wait_suspend_loop: - if (srv_print_verbose_log && count > 600) { + service_manager_extend_timeout( + COUNT_INTERVAL * CHECK_INTERVAL/1000000 * 2, + "Waiting for %s to exit", thread_name); + if (srv_print_verbose_log && count > COUNT_INTERVAL) { ib_logf(IB_LOG_LEVEL_INFO, "Waiting for %s to exit", thread_name); count = 0; @@ -3636,6 +3652,8 @@ logs_empty_and_mark_files_at_shutdown(void) before proceeding further. */ count = 0; + service_manager_extend_timeout(COUNT_INTERVAL * CHECK_INTERVAL/1000000 * 2, + "Waiting for page cleaner"); os_rmb; while (buf_page_cleaner_is_active || buf_lru_manager_is_active) { if (srv_print_verbose_log && count == 0) { @@ -3644,8 +3662,10 @@ logs_empty_and_mark_files_at_shutdown(void) "finish flushing of buffer pool"); } ++count; - os_thread_sleep(100000); - if (count > 600) { + os_thread_sleep(CHECK_INTERVAL); + if (srv_print_verbose_log && count > COUNT_INTERVAL) { + service_manager_extend_timeout(COUNT_INTERVAL * CHECK_INTERVAL/1000000 * 2, + "Waiting for page cleaner"); count = 0; } os_rmb; @@ -3730,6 +3750,8 @@ logs_empty_and_mark_files_at_shutdown(void) } if (!srv_read_only_mode) { + service_manager_extend_timeout(INNODB_EXTEND_TIMEOUT_INTERVAL, + "ensuring dirty buffer pool are written to log"); log_make_checkpoint_at(LSN_MAX, TRUE); mutex_enter(&log_sys->mutex); @@ -3758,23 +3780,9 @@ logs_empty_and_mark_files_at_shutdown(void) mutex_exit(&log_sys->mutex); - fil_flush_file_spaces(FIL_TABLESPACE); + /* Ensure that all buffered changes are written to the + redo log before fil_close_all_files(). */ fil_flush_file_spaces(FIL_LOG); - - /* The call fil_write_flushed_lsn_to_data_files() will - bypass the buffer pool: therefore it is essential that - the buffer pool has been completely flushed to disk! */ - - if (!buf_all_freed()) { - if (srv_print_verbose_log && count > 600) { - ib_logf(IB_LOG_LEVEL_INFO, - "Waiting for dirty buffer pages" - " to be flushed"); - count = 0; - } - - goto loop; - } } else { lsn = srv_start_lsn; } @@ -3791,8 +3799,9 @@ logs_empty_and_mark_files_at_shutdown(void) srv_thread_type type = srv_get_active_thread_type(); ut_a(type == SRV_NONE); - bool freed = buf_all_freed(); - ut_a(freed); + service_manager_extend_timeout(INNODB_EXTEND_TIMEOUT_INTERVAL, + "Free innodb buffer pool"); + buf_all_freed(); ut_a(lsn == log_sys->lsn); ut_ad(srv_force_recovery >= SRV_FORCE_NO_LOG_REDO @@ -3824,9 +3833,6 @@ logs_empty_and_mark_files_at_shutdown(void) type = srv_get_active_thread_type(); ut_a(type == SRV_NONE); - freed = buf_all_freed(); - ut_a(freed); - ut_a(lsn == log_sys->lsn); } diff --git a/storage/xtradb/log/log0recv.cc b/storage/xtradb/log/log0recv.cc index 1943fb51f..d8e90de45 100644 --- a/storage/xtradb/log/log0recv.cc +++ b/storage/xtradb/log/log0recv.cc @@ -30,7 +30,7 @@ Created 9/20/1997 Heikki Tuuri #include // Solaris/x86 header file bug #include -#include +#include #include "log0recv.h" @@ -1804,8 +1804,8 @@ recv_recover_page_func( if (recv_sys->report(time)) { ib_logf(IB_LOG_LEVEL_INFO, "To recover: " ULINTPF " pages from log", n); - sd_notifyf(0, "STATUS=To recover: " ULINTPF - " pages from log", n); + service_manager_extend_timeout( + INNODB_EXTEND_TIMEOUT_INTERVAL, "To recover: " ULINTPF " pages from log", n); } } @@ -3001,6 +3001,9 @@ recv_init_crash_recovery(void) and restore them from the doublewrite buffer if possible */ + service_manager_extend_timeout( + INNODB_EXTEND_TIMEOUT_INTERVAL, "Starting Innodb crash recovery"); + if (srv_force_recovery < SRV_FORCE_NO_LOG_REDO) { buf_dblwr_process(); diff --git a/storage/xtradb/mem/mem0mem.cc b/storage/xtradb/mem/mem0mem.cc index b9f190509..f91126697 100644 --- a/storage/xtradb/mem/mem0mem.cc +++ b/storage/xtradb/mem/mem0mem.cc @@ -406,6 +406,11 @@ mem_heap_create_block_func( heap->total_size += len; } + /* Poison all available memory. Individual chunks will be unpoisoned on + every mem_heap_alloc() call. */ + compile_time_assert(MEM_BLOCK_HEADER_SIZE >= sizeof *block); + UNIV_MEM_FREE(block + 1, len - sizeof *block); + ut_ad((ulint)MEM_BLOCK_HEADER_SIZE < len); return(block); diff --git a/storage/xtradb/os/os0file.cc b/storage/xtradb/os/os0file.cc index 634ebb2af..2e172a752 100644 --- a/storage/xtradb/os/os0file.cc +++ b/storage/xtradb/os/os0file.cc @@ -2,7 +2,7 @@ Copyright (c) 1995, 2017, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2009, Percona Inc. -Copyright (c) 2013, 2017, MariaDB Corporation. +Copyright (c) 2013, 2018, MariaDB Corporation. Portions of this file contain modifications contributed and copyrighted by Percona Inc.. Those modifications are @@ -1437,7 +1437,8 @@ os_file_create_simple_func( /* Use default security attributes and no template file. */ file = CreateFile( - (LPCTSTR) name, access, FILE_SHARE_READ, NULL, + (LPCTSTR) name, access, + FILE_SHARE_READ | FILE_SHARE_DELETE, NULL, create_flag, attributes, NULL); if (file == INVALID_HANDLE_VALUE) { @@ -1508,7 +1509,7 @@ os_file_create_simple_func( } do { - file = ::open(name, create_flag, os_innodb_umask); + file = ::open(name, create_flag | O_CLOEXEC, os_innodb_umask); if (file == -1) { *success = FALSE; @@ -1603,7 +1604,7 @@ os_file_create_simple_no_error_handling_func( DWORD access; DWORD create_flag; DWORD attributes = 0; - DWORD share_mode = FILE_SHARE_READ; + DWORD share_mode = FILE_SHARE_READ | FILE_SHARE_DELETE; ut_a(name); ut_a(!(create_mode & OS_FILE_ON_ERROR_SILENT)); @@ -1730,7 +1731,7 @@ os_file_create_simple_no_error_handling_func( return(file); } - file = open(name, create_flag, os_innodb_umask); + file = ::open(name, create_flag | O_CLOEXEC , os_innodb_umask); *success = file != -1; @@ -1925,7 +1926,7 @@ os_file_create_func( #ifdef __WIN__ DWORD create_flag; - DWORD share_mode = FILE_SHARE_READ; + DWORD share_mode = FILE_SHARE_READ | FILE_SHARE_DELETE; on_error_no_exit = create_mode & OS_FILE_ON_ERROR_NO_EXIT ? TRUE : FALSE; @@ -2145,7 +2146,7 @@ os_file_create_func( #endif /* O_SYNC */ do { - file = open(name, create_flag, os_innodb_umask); + file = ::open(name, create_flag | O_CLOEXEC, os_innodb_umask); if (file == -1) { const char* operation; @@ -2358,6 +2359,24 @@ os_file_delete_func( #endif } +/** Handle RENAME error. +@param name old name of the file +@param new_name new name of the file */ +static void os_file_handle_rename_error(const char* name, const char* new_name) +{ + if (os_file_get_last_error(true) != OS_FILE_DISK_FULL) { + ib_logf(IB_LOG_LEVEL_ERROR, "Cannot rename file '%s' to '%s'", + name, new_name); + } else if (!os_has_said_disk_full) { + os_has_said_disk_full = true; + /* Disk full error is reported irrespective of the + on_error_silent setting. */ + ib_logf(IB_LOG_LEVEL_ERROR, + "Full disk prevents renaming file '%s' to '%s'", + name, new_name); + } +} + /***********************************************************************//** NOTE! Use the corresponding macro os_file_rename(), not directly this function! Renames a file (can also move it to another directory). It is safest that the @@ -2393,7 +2412,7 @@ os_file_rename_func( return(TRUE); } - os_file_handle_error_no_exit(oldpath, "rename", FALSE, __FILE__, __LINE__); + os_file_handle_rename_error(oldpath, newpath); return(FALSE); #else @@ -2403,7 +2422,7 @@ os_file_rename_func( ret = rename(oldpath, newpath); if (ret != 0) { - os_file_handle_error_no_exit(oldpath, "rename", FALSE, __FILE__, __LINE__); + os_file_handle_rename_error(oldpath, newpath); return(FALSE); } @@ -3169,15 +3188,21 @@ os_file_read_func( overlapped.hEvent = win_get_syncio_event(); ret = ReadFile(file, buf, n, NULL, &overlapped); if (ret) { - ret = GetOverlappedResult(file, &overlapped, (DWORD *)&len, FALSE); - } - else if(GetLastError() == ERROR_IO_PENDING) { - ret = GetOverlappedResult(file, &overlapped, (DWORD *)&len, TRUE); + ret = GetOverlappedResult(file, &overlapped, &len, FALSE); + } else if (GetLastError() == ERROR_IO_PENDING) { + ret = GetOverlappedResult(file, &overlapped, &len, TRUE); } MONITOR_ATOMIC_DEC_LOW(MONITOR_OS_PENDING_READS, monitor); - if (ret && len == n) { + if (!ret) { + } else if (len == n) { return(TRUE); + } else { + ib_logf(IB_LOG_LEVEL_ERROR, + "Tried to read " ULINTPF " bytes at offset " + UINT64PF ". Was only able to read %lu.", + n, offset, ret); + return FALSE; } #else /* __WIN__ */ ibool retry; @@ -3204,6 +3229,7 @@ os_file_read_func( "Tried to read " ULINTPF " bytes at offset " UINT64PF ". Was only able to read %ld.", n, offset, (lint) ret); + return FALSE; } #endif /* __WIN__ */ retry = os_file_handle_error(NULL, "read", __FILE__, __LINE__); @@ -3272,15 +3298,21 @@ os_file_read_no_error_handling_func( overlapped.hEvent = win_get_syncio_event(); ret = ReadFile(file, buf, n, NULL, &overlapped); if (ret) { - ret = GetOverlappedResult(file, &overlapped, (DWORD *)&len, FALSE); - } - else if(GetLastError() == ERROR_IO_PENDING) { - ret = GetOverlappedResult(file, &overlapped, (DWORD *)&len, TRUE); + ret = GetOverlappedResult(file, &overlapped, &len, FALSE); + } else if (GetLastError() == ERROR_IO_PENDING) { + ret = GetOverlappedResult(file, &overlapped, &len, TRUE); } MONITOR_ATOMIC_DEC_LOW(MONITOR_OS_PENDING_READS, monitor); - if (ret && len == n) { + if (!ret) { + } else if (len == n) { return(TRUE); + } else { + ib_logf(IB_LOG_LEVEL_ERROR, + "Tried to read " ULINTPF " bytes at offset " + UINT64PF ". Was only able to read %lu.", + n, offset, len); + return FALSE; } #else /* __WIN__ */ ibool retry; @@ -3303,6 +3335,7 @@ os_file_read_no_error_handling_func( "Tried to read " ULINTPF " bytes at offset " UINT64PF ". Was only able to read %ld.", n, offset, (lint) ret); + return FALSE; } #endif /* __WIN__ */ retry = os_file_handle_error_no_exit(NULL, "read", FALSE, __FILE__, __LINE__); @@ -3383,10 +3416,9 @@ os_file_write_func( overlapped.hEvent = win_get_syncio_event(); ret = WriteFile(file, buf, n, NULL, &overlapped); if (ret) { - ret = GetOverlappedResult(file, &overlapped, (DWORD *)&len, FALSE); - } - else if ( GetLastError() == ERROR_IO_PENDING) { - ret = GetOverlappedResult(file, &overlapped, (DWORD *)&len, TRUE); + ret = GetOverlappedResult(file, &overlapped, &len, FALSE); + } else if (GetLastError() == ERROR_IO_PENDING) { + ret = GetOverlappedResult(file, &overlapped, &len, TRUE); } MONITOR_ATOMIC_DEC_LOW(MONITOR_OS_PENDING_WRITES, monitor); @@ -3704,7 +3736,7 @@ os_file_get_status( access = !srv_read_only_mode ? O_RDWR : O_RDONLY; - fh = ::open(path, access, os_innodb_umask); + fh = ::open(path, access | O_CLOEXEC, os_innodb_umask); if (fh == -1) { stat_info->rw_perm = false; @@ -4133,7 +4165,7 @@ os_aio_native_aio_supported(void) strcpy(name + dirnamelen, "ib_logfile0"); - fd = ::open(name, O_RDONLY); + fd = ::open(name, O_RDONLY | O_CLOEXEC); if (fd == -1) { @@ -6588,8 +6620,7 @@ os_file_trim( DWORD tmp; if (ret) { ret = GetOverlappedResult(slot->file, &overlapped, &tmp, FALSE); - } - else if (GetLastError() == ERROR_IO_PENDING) { + } else if (GetLastError() == ERROR_IO_PENDING) { ret = GetOverlappedResult(slot->file, &overlapped, &tmp, TRUE); } if (!ret) { diff --git a/storage/xtradb/page/page0page.cc b/storage/xtradb/page/page0page.cc index fc93eebd4..e21880c2d 100644 --- a/storage/xtradb/page/page0page.cc +++ b/storage/xtradb/page/page0page.cc @@ -2,6 +2,7 @@ Copyright (c) 1994, 2016, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2012, Facebook Inc. +Copyright (c) 2018, MariaDB Corporation. 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 @@ -98,17 +99,13 @@ page_dir_find_owner_slot( /*=====================*/ const rec_t* rec) /*!< in: the physical record */ { - const page_t* page; - register uint16 rec_offs_bytes; - register const page_dir_slot_t* slot; - register const page_dir_slot_t* first_slot; - register const rec_t* r = rec; - ut_ad(page_rec_check(rec)); - page = page_align(rec); - first_slot = page_dir_get_nth_slot(page, 0); - slot = page_dir_get_nth_slot(page, page_dir_get_n_slots(page) - 1); + const page_t* page = page_align(rec); + const page_dir_slot_t* first_slot = page_dir_get_nth_slot(page, 0); + const page_dir_slot_t* slot = page_dir_get_nth_slot( + page, page_dir_get_n_slots(page) - 1); + const rec_t* r = rec; if (page_is_comp(page)) { while (rec_get_n_owned_new(r) == 0) { @@ -124,7 +121,7 @@ page_dir_find_owner_slot( } } - rec_offs_bytes = mach_encode_2(r - page); + uint16 rec_offs_bytes = mach_encode_2(r - page); while (UNIV_LIKELY(*(uint16*) slot != rec_offs_bytes)) { diff --git a/storage/xtradb/row/row0import.cc b/storage/xtradb/row/row0import.cc index f00353028..4af409535 100644 --- a/storage/xtradb/row/row0import.cc +++ b/storage/xtradb/row/row0import.cc @@ -31,6 +31,7 @@ Created 2012-02-08 by Sunny Bains. #endif #include "btr0pcur.h" +#include "btr0sea.h" #include "que0que.h" #include "dict0boot.h" #include "ibuf0ibuf.h" @@ -40,13 +41,17 @@ Created 2012-02-08 by Sunny Bains. #include "row0mysql.h" #include "srv0start.h" #include "row0quiesce.h" -#include "buf0buf.h" +#include "fil0pagecompress.h" +#ifdef HAVE_LZO +#include "lzo/lzo1x.h" +#endif +#ifdef HAVE_SNAPPY +#include "snappy-c.h" +#endif #include -/** The size of the buffer to use for IO. Note: os_file_read() doesn't expect -reads to fail. If you set the buffer size to be greater than a multiple of the -file size then it will assert. TODO: Fix this limitation of the IO functions. +/** The size of the buffer to use for IO. @param n - page size of the tablespace. @retval number of pages */ #define IO_BUFFER_SIZE(n) ((1024 * 1024) / n) @@ -362,7 +367,8 @@ class IndexPurge { /** Functor that is called for each physical page that is read from the tablespace file. */ -class AbstractCallback : public PageCallback { +class AbstractCallback +{ public: /** Constructor @param trx - covering transaction */ @@ -395,32 +401,59 @@ class AbstractCallback : public PageCallback { return(get_zip_size() > 0); } -protected: /** - Get the data page depending on the table type, compressed or not. - @param block - block read from disk - @retval the buffer frame */ - buf_frame_t* get_frame(buf_block_t* block) const UNIV_NOTHROW + Set the name of the physical file and the file handle that is used + to open it for the file that is being iterated over. + @param filename - then physical name of the tablespace file. + @param file - OS file handle */ + void set_file(const char* filename, pfs_os_file_t file) UNIV_NOTHROW { - if (is_compressed_table()) { - return(block->page.zip.data); - } + m_file = file; + m_filepath = filename; + } - return(buf_block_get_frame(block)); + /** The compressed page size + @return the compressed page size */ + ulint get_zip_size() const + { + return(m_zip_size); } - /** Check for session interrupt. If required we could - even flush to disk here every N pages. - @retval DB_SUCCESS or error code */ - dberr_t periodic_check() UNIV_NOTHROW + /** The compressed page size + @return the compressed page size */ + ulint get_page_size() const { - if (trx_is_interrupted(m_trx)) { - return(DB_INTERRUPTED); - } + return(m_page_size); + } - return(DB_SUCCESS); + const char* filename() const { return m_filepath; } + + /** + Called for every page in the tablespace. If the page was not + updated then its state must be set to BUF_PAGE_NOT_USED. For + compressed tables the page descriptor memory will be at offset: + block->frame + UNIV_PAGE_SIZE; + @param block block read from file, note it is not from the buffer pool + @retval DB_SUCCESS or error code. */ + virtual dberr_t operator()(buf_block_t* block) UNIV_NOTHROW = 0; + + /** + @return the space id of the tablespace */ + virtual ulint get_space_id() const UNIV_NOTHROW = 0; + + bool is_interrupted() const { return trx_is_interrupted(m_trx); } + + /** + Get the data page depending on the table type, compressed or not. + @param block - block read from disk + @retval the buffer frame */ + static byte* get_frame(const buf_block_t* block) + { + return block->page.zip.data + ? block->page.zip.data : block->frame; } +protected: /** Get the physical offset of the extent descriptor within the page. @param page_no - page number of the extent descriptor @@ -510,6 +543,18 @@ class AbstractCallback : public PageCallback { } protected: + /** Compressed table page size */ + ulint m_zip_size; + + /** The tablespace page size. */ + ulint m_page_size; + + /** File handle to the tablespace */ + pfs_os_file_t m_file; + + /** Physical file path. */ + const char* m_filepath; + /** Covering transaction. */ trx_t* m_trx; @@ -566,9 +611,9 @@ AbstractCallback::init( /* Since we don't know whether it is a compressed table or not, the data is always read into the block->frame. */ - dberr_t err = set_zip_size(block->frame); + m_zip_size = fsp_header_get_zip_size(page); - if (err != DB_SUCCESS) { + if (!ut_is_2pow(m_zip_size) || m_zip_size > UNIV_ZIP_SIZE_MAX) { return(DB_CORRUPTION); } @@ -605,11 +650,7 @@ AbstractCallback::init( m_free_limit = mach_read_from_4(page + FSP_FREE_LIMIT); m_space = mach_read_from_4(page + FSP_HEADER_OFFSET + FSP_SPACE_ID); - if ((err = set_current_xdes(0, page)) != DB_SUCCESS) { - return(err); - } - - return(DB_SUCCESS); + return set_current_xdes(0, page); } /** @@ -651,12 +692,9 @@ struct FetchIndexRootPages : public AbstractCallback { /** Called for each block as it is read from the file. - @param offset - physical offset in the file - @param block - block to convert, it is not from the buffer pool. + @param block block to convert, it is not from the buffer pool. @retval DB_SUCCESS or error code. */ - virtual dberr_t operator() ( - os_offset_t offset, - buf_block_t* block) UNIV_NOTHROW; + dberr_t operator()(buf_block_t* block) UNIV_NOTHROW; /** Update the import configuration that will be used to import the tablespace. */ @@ -674,34 +712,18 @@ Called for each block as it is read from the file. Check index pages to determine the exact row format. We can't get that from the tablespace header flags alone. -@param offset - physical offset in the file -@param block - block to convert, it is not from the buffer pool. +@param block block to convert, it is not from the buffer pool. @retval DB_SUCCESS or error code. */ -dberr_t -FetchIndexRootPages::operator() ( - os_offset_t offset, - buf_block_t* block) UNIV_NOTHROW +dberr_t FetchIndexRootPages::operator()(buf_block_t* block) UNIV_NOTHROW { - dberr_t err; - - if ((err = periodic_check()) != DB_SUCCESS) { - return(err); - } + if (is_interrupted()) return DB_INTERRUPTED; const page_t* page = get_frame(block); ulint page_type = fil_page_get_type(page); - if (block->page.offset * m_page_size != offset) { - ib_logf(IB_LOG_LEVEL_ERROR, - "Page offset doesn't match file offset: " - "page offset: %u, file offset: " ULINTPF, - block->page.offset, - (ulint) (offset / m_page_size)); - - err = DB_CORRUPTION; - } else if (page_type == FIL_PAGE_TYPE_XDES) { - err = set_current_xdes(block->page.offset, page); + if (page_type == FIL_PAGE_TYPE_XDES) { + return set_current_xdes(block->page.offset, page); } else if (page_type == FIL_PAGE_INDEX && !is_free(block->page.offset) && is_root_page(page)) { @@ -726,7 +748,7 @@ FetchIndexRootPages::operator() ( } } - return(err); + return DB_SUCCESS; } /** @@ -843,21 +865,10 @@ class PageConverter : public AbstractCallback { /** Called for each block as it is read from the file. - @param offset - physical offset in the file - @param block - block to convert, it is not from the buffer pool. + @param block block to convert, it is not from the buffer pool. @retval DB_SUCCESS or error code. */ - virtual dberr_t operator() ( - os_offset_t offset, - buf_block_t* block) UNIV_NOTHROW; + dberr_t operator()(buf_block_t* block) UNIV_NOTHROW; private: - - /** Status returned by PageConverter::validate() */ - enum import_page_status_t { - IMPORT_PAGE_STATUS_OK, /*!< Page is OK */ - IMPORT_PAGE_STATUS_ALL_ZERO, /*!< Page is all zeros */ - IMPORT_PAGE_STATUS_CORRUPTED /*!< Page is corrupted */ - }; - /** Update the page, set the space id, max trx id and index id. @param block - block read from file @@ -867,17 +878,6 @@ class PageConverter : public AbstractCallback { buf_block_t* block, ulint& page_type) UNIV_NOTHROW; -#if defined UNIV_DEBUG - /** - @return true error condition is enabled. */ - bool trigger_corruption() UNIV_NOTHROW - { - return(false); - } - #else -#define trigger_corruption() (false) -#endif /* UNIV_DEBUG */ - /** Update the space, index id, trx id. @param block - block to convert @@ -890,15 +890,6 @@ class PageConverter : public AbstractCallback { @retval DB_SUCCESS or error code */ dberr_t update_records(buf_block_t* block) UNIV_NOTHROW; - /** - Validate the page, check for corruption. - @param offset - physical offset within file. - @param page - page read from file. - @return 0 on success, 1 if all zero, 2 if corrupted */ - import_page_status_t validate( - os_offset_t offset, - buf_block_t* page) UNIV_NOTHROW; - /** Validate the space flags and update tablespace header page. @param block - block read from file, not from the buffer pool. @@ -1316,8 +1307,8 @@ row_import::match_schema( return(DB_ERROR); } else if (m_table->n_cols != m_n_cols) { ib_errf(thd, IB_LOG_LEVEL_ERROR, ER_TABLE_SCHEMA_MISMATCH, - "Number of columns don't match, table has %u " - "columns but the tablespace meta-data file has " + "Number of columns don't match, table has %u" + " columns but the tablespace meta-data file has " ULINTPF " columns", m_table->n_cols, m_n_cols); @@ -1597,6 +1588,7 @@ IndexPurge::purge() UNIV_NOTHROW Constructor * @param cfg - config of table being imported. * @param trx - transaction covering the import */ +inline PageConverter::PageConverter( row_import* cfg, trx_t* trx) @@ -1621,6 +1613,7 @@ Adjust the BLOB reference for a single column that is externally stored @param offsets - column offsets for the record @param i - column ordinal value @return DB_SUCCESS or error code */ +inline dberr_t PageConverter::adjust_cluster_index_blob_column( rec_t* rec, @@ -1673,6 +1666,7 @@ stored columns. @param rec - record to update @param offsets - column offsets for the record @return DB_SUCCESS or error code */ +inline dberr_t PageConverter::adjust_cluster_index_blob_columns( rec_t* rec, @@ -1706,6 +1700,7 @@ BLOB reference, write the new space id. @param rec - record to update @param offsets - column offsets for the record @return DB_SUCCESS or error code */ +inline dberr_t PageConverter::adjust_cluster_index_blob_ref( rec_t* rec, @@ -1729,6 +1724,7 @@ Purge delete-marked records, only if it is possible to do so without re-organising the B+tree. @param offsets - current row offsets. @return true if purge succeeded */ +inline bool PageConverter::purge(const ulint* offsets) UNIV_NOTHROW { @@ -1753,6 +1749,7 @@ Adjust the BLOB references and sys fields for the current record. @param offsets - column offsets for the record @param deleted - true if row is delete marked @return DB_SUCCESS or error code. */ +inline dberr_t PageConverter::adjust_cluster_record( const dict_index_t* index, @@ -1770,7 +1767,7 @@ PageConverter::adjust_cluster_record( row_upd_rec_sys_fields( rec, m_page_zip_ptr, m_cluster_index, m_offsets, - m_trx, 0); + m_trx, roll_ptr_t(1) << 55); } return(err); @@ -1781,6 +1778,7 @@ Update the BLOB refrences and write UNDO log entries for rows that can't be purged optimistically. @param block - block to update @retval DB_SUCCESS or error code */ +inline dberr_t PageConverter::update_records( buf_block_t* block) UNIV_NOTHROW @@ -1792,10 +1790,6 @@ PageConverter::update_records( m_rec_iter.open(block); - if (!page_is_leaf(block->frame)) { - return DB_SUCCESS; - } - while (!m_rec_iter.end()) { rec_t* rec = m_rec_iter.current(); ibool deleted = rec_get_deleted_flag(rec, comp); @@ -1846,6 +1840,7 @@ PageConverter::update_records( /** Update the space, index id, trx id. @return DB_SUCCESS or error code */ +inline dberr_t PageConverter::update_index_page( buf_block_t* block) UNIV_NOTHROW @@ -1908,13 +1903,14 @@ PageConverter::update_index_page( return(DB_SUCCESS); } - return(update_records(block)); + return page_is_leaf(block->frame) ? update_records(block) : DB_SUCCESS; } /** Validate the space flags and update tablespace header page. @param block - block read from file, not from the buffer pool. @retval DB_SUCCESS or error code */ +inline dberr_t PageConverter::update_header( buf_block_t* block) UNIV_NOTHROW @@ -1954,6 +1950,7 @@ PageConverter::update_header( Update the page, set the space id, max trx id and index id. @param block - block read from file @retval DB_SUCCESS or error code */ +inline dberr_t PageConverter::update_page( buf_block_t* block, @@ -1961,6 +1958,14 @@ PageConverter::update_page( { dberr_t err = DB_SUCCESS; + ut_ad(!block->page.zip.data == !is_compressed_table()); + + if (block->page.zip.data) { + m_page_zip_ptr = &block->page.zip; + } else { + ut_ad(!m_page_zip_ptr); + } + switch (page_type = fil_page_get_type(get_frame(block))) { case FIL_PAGE_TYPE_FSP_HDR: /* Work directly on the uncompressed page headers. */ @@ -2015,141 +2020,45 @@ PageConverter::update_page( return(DB_CORRUPTION); } -/** -Validate the page -@param offset - physical offset within file. -@param page - page read from file. -@return status */ -PageConverter::import_page_status_t -PageConverter::validate( - os_offset_t offset, - buf_block_t* block) UNIV_NOTHROW -{ - buf_frame_t* page = get_frame(block); - - /* Check that the page number corresponds to the offset in - the file. Flag as corrupt if it doesn't. Disable the check - for LSN in buf_page_is_corrupted() */ - - if (buf_page_is_corrupted(false, page, get_zip_size(), NULL) - || (page_get_page_no(page) != offset / m_page_size - && page_get_page_no(page) != 0)) { - - return(IMPORT_PAGE_STATUS_CORRUPTED); - - } else if (offset > 0 && page_get_page_no(page) == 0) { - ulint checksum; - - checksum = mach_read_from_4(page + FIL_PAGE_SPACE_OR_CHKSUM); - if (checksum != 0) { - /* Checksum check passed in buf_page_is_corrupted(). */ - ib_logf(IB_LOG_LEVEL_WARN, - "%s: Page %lu checksum " ULINTPF - " should be zero.", - m_filepath, (ulong) (offset / m_page_size), - checksum); - } - - const byte* b = page + FIL_PAGE_OFFSET; - const byte* e = page + m_page_size - - FIL_PAGE_END_LSN_OLD_CHKSUM; - - /* If the page number is zero and offset > 0 then - the entire page MUST consist of zeroes. If not then - we flag it as corrupt. */ - - while (b != e) { - - if (*b++ && !trigger_corruption()) { - return(IMPORT_PAGE_STATUS_CORRUPTED); - } - } - - /* The page is all zero: do nothing. */ - return(IMPORT_PAGE_STATUS_ALL_ZERO); - } - - return(IMPORT_PAGE_STATUS_OK); -} - /** Called for every page in the tablespace. If the page was not updated then its state must be set to BUF_PAGE_NOT_USED. -@param offset - physical offset within the file -@param block - block read from file, note it is not from the buffer pool +@param block block read from file, note it is not from the buffer pool @retval DB_SUCCESS or error code. */ -dberr_t -PageConverter::operator() ( - os_offset_t offset, - buf_block_t* block) UNIV_NOTHROW +dberr_t PageConverter::operator()(buf_block_t* block) UNIV_NOTHROW { - ulint page_type; - dberr_t err = DB_SUCCESS; - - if ((err = periodic_check()) != DB_SUCCESS) { - return(err); - } - - if (is_compressed_table()) { - m_page_zip_ptr = &block->page.zip; - } else { - ut_ad(m_page_zip_ptr == 0); - } - - switch(validate(offset, block)) { - case IMPORT_PAGE_STATUS_OK: - - /* We have to decompress the compressed pages before - we can work on them */ - - if ((err = update_page(block, page_type)) != DB_SUCCESS) { - break; - } - - /* Note: For compressed pages this function will write to the - zip descriptor and for uncompressed pages it will write to - page (ie. the block->frame). Therefore the caller should write - out the descriptor contents and not block->frame for compressed - pages. */ - - if (!is_compressed_table() || page_type == FIL_PAGE_INDEX) { - - buf_flush_init_for_writing( - !is_compressed_table() - ? block->frame : block->page.zip.data, - !is_compressed_table() ? 0 : m_page_zip_ptr, - m_current_lsn); - } else { - /* Calculate and update the checksum of non-btree - pages for compressed tables explicitly here. */ - - buf_flush_update_zip_checksum( - get_frame(block), get_zip_size(), - m_current_lsn); - } - - break; + /* If we already had an old page with matching number + in the buffer pool, evict it now, because + we no longer evict the pages on DISCARD TABLESPACE. */ + buf_page_get_gen(get_space_id(), get_zip_size(), block->page.offset, + RW_NO_LATCH, NULL, BUF_EVICT_IF_IN_POOL, + __FILE__, __LINE__, NULL); - case IMPORT_PAGE_STATUS_ALL_ZERO: - /* The page is all zero: leave it as is. */ - break; + ulint page_type; - case IMPORT_PAGE_STATUS_CORRUPTED: + dberr_t err = update_page(block, page_type); + if (err != DB_SUCCESS) return err; - ib_logf(IB_LOG_LEVEL_WARN, - "%s: Page %lu at offset " UINT64PF " looks corrupted.", - m_filepath, (ulong) (offset / m_page_size), offset); + /* Note: For compressed pages this function will write to the + zip descriptor and for uncompressed pages it will write to + page (ie. the block->frame). Therefore the caller should write + out the descriptor contents and not block->frame for compressed + pages. */ - err = DB_CORRUPTION; + if (!is_compressed_table() || page_type == FIL_PAGE_INDEX) { + buf_flush_init_for_writing( + get_frame(block), + block->page.zip.data ? &block->page.zip : NULL, + m_current_lsn); + } else { + /* Calculate and update the checksum of non-btree + pages for compressed tables explicitly here. */ + buf_flush_update_zip_checksum( + get_frame(block), get_zip_size(), + m_current_lsn); } - /* If we already had and old page with matching number - in the buffer pool, evict it now, because - we no longer evict the pages on DISCARD TABLESPACE. */ - buf_page_get_gen(get_space_id(), get_zip_size(), block->page.offset, - RW_NO_LATCH, NULL, BUF_EVICT_IF_IN_POOL, - __FILE__, __LINE__, NULL); - return(err); + return DB_SUCCESS; } /*****************************************************************//** @@ -3424,6 +3333,498 @@ row_import_update_discarded_flag( return(err); } +struct fil_iterator_t { + pfs_os_file_t file; /*!< File handle */ + const char* filepath; /*!< File path name */ + os_offset_t start; /*!< From where to start */ + os_offset_t end; /*!< Where to stop */ + os_offset_t file_size; /*!< File size in bytes */ + ulint page_size; /*!< Page size */ + ulint n_io_buffers; /*!< Number of pages to use + for IO */ + byte* io_buffer; /*!< Buffer to use for IO */ + fil_space_crypt_t *crypt_data; /*!< Crypt data (if encrypted) */ + byte* crypt_io_buffer; /*!< IO buffer when encrypted */ +}; + +/********************************************************************//** +TODO: This can be made parallel trivially by chunking up the file and creating +a callback per thread. . Main benefit will be to use multiple CPUs for +checksums and compressed tables. We have to do compressed tables block by +block right now. Secondly we need to decompress/compress and copy too much +of data. These are CPU intensive. + +Iterate over all the pages in the tablespace. +@param iter - Tablespace iterator +@param block - block to use for IO +@param callback - Callback to inspect and update page contents +@retval DB_SUCCESS or error code */ +static +dberr_t +fil_iterate( +/*========*/ + const fil_iterator_t& iter, + buf_block_t* block, + AbstractCallback& callback) +{ + os_offset_t offset; + ulint n_bytes = iter.n_io_buffers * iter.page_size; + + const ulint buf_size = srv_page_size +#ifdef HAVE_LZO + + LZO1X_1_15_MEM_COMPRESS +#elif defined HAVE_SNAPPY + + snappy_max_compressed_length(srv_page_size) +#endif + ; + byte* page_compress_buf = static_cast( + ut_malloc_low(buf_size, false)); + ut_ad(!srv_read_only_mode); + + if (!page_compress_buf) { + return DB_OUT_OF_MEMORY; + } + + /* TODO: For ROW_FORMAT=COMPRESSED tables we do a lot of useless + copying for non-index pages. Unfortunately, it is + required by buf_zip_decompress() */ + dberr_t err = DB_SUCCESS; + + for (offset = iter.start; offset < iter.end; offset += n_bytes) { + if (callback.is_interrupted()) { + err = DB_INTERRUPTED; + goto func_exit; + } + + byte* io_buffer = iter.io_buffer; + block->frame = io_buffer; + + if (block->page.zip.data) { + /* Zip IO is done in the compressed page buffer. */ + io_buffer = block->page.zip.data; + ut_ad(PAGE_ZIP_MATCH(block->frame, &block->page.zip)); + } + + /* We have to read the exact number of bytes. Otherwise the + InnoDB IO functions croak on failed reads. */ + + n_bytes = ulint(ut_min(os_offset_t(n_bytes), + iter.end - offset)); + + ut_ad(n_bytes > 0); + ut_ad(!(n_bytes % iter.page_size)); + + const bool encrypted = iter.crypt_data != NULL + && iter.crypt_data->should_encrypt(); + /* Use additional crypt io buffer if tablespace is encrypted */ + byte* const readptr = encrypted + ? iter.crypt_io_buffer : io_buffer; + byte* const writeptr = readptr; + + if (!os_file_read_no_error_handling(iter.file, readptr, + offset, n_bytes)) { + ib_logf(IB_LOG_LEVEL_ERROR, "os_file_read() failed"); + err = DB_IO_ERROR; + goto func_exit; + } + + bool updated = false; + const ulint size = iter.page_size; + ulint n_pages_read = ulint(n_bytes) / size; + block->page.offset = offset / size; + + for (ulint i = 0; i < n_pages_read; + ++i, block->frame += size, block->page.offset++) { + byte* src = readptr + (i * size); + const ulint page_no = page_get_page_no(src); + if (!page_no && block->page.offset) { + const ulint* b = reinterpret_cast + (src); + const ulint* const e = b + size / sizeof *b; + do { + if (*b++) { + goto page_corrupted; + } + } while (b != e); + + /* Proceed to the next page, + because this one is all zero. */ + continue; + } + + if (page_no != block->page.offset) { +page_corrupted: + ib_logf(IB_LOG_LEVEL_WARN, + "%s: Page %lu at offset " + UINT64PF " looks corrupted.", + callback.filename(), + ulong(offset / size), offset); + err = DB_CORRUPTION; + goto func_exit; + } + + bool decrypted = false; + byte* dst = io_buffer + (i * size); + bool frame_changed = false; + ulint page_type = mach_read_from_2(src+FIL_PAGE_TYPE); + const bool page_compressed + = page_type + == FIL_PAGE_PAGE_COMPRESSED_ENCRYPTED + || page_type == FIL_PAGE_PAGE_COMPRESSED; + + if (page_compressed && block->page.zip.data) { + goto page_corrupted; + } + + if (!encrypted) { + } else if (!mach_read_from_4( + FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION + + src)) { +not_encrypted: + if (!page_compressed + && !block->page.zip.data) { + block->frame = src; + frame_changed = true; + } else { + ut_ad(dst != src); + memcpy(dst, src, size); + } + } else { + if (!fil_space_verify_crypt_checksum( + src, callback.get_zip_size(), + NULL, block->page.offset)) { + goto page_corrupted; + } + + decrypted = fil_space_decrypt( + iter.crypt_data, dst, + iter.page_size, src, &err); + + if (err != DB_SUCCESS) { + goto func_exit; + } + + if (!decrypted) { + goto not_encrypted; + } + + updated = true; + } + + /* If the original page is page_compressed, we need + to decompress it before adjusting further. */ + if (page_compressed) { + ulint compress_length = fil_page_decompress( + page_compress_buf, dst); + ut_ad(compress_length != srv_page_size); + if (compress_length == 0) { + goto page_corrupted; + } + updated = true; + } else if (buf_page_is_corrupted( + false, + encrypted && !frame_changed + ? dst : src, + callback.get_zip_size(), NULL)) { + goto page_corrupted; + } + + if ((err = callback(block)) != DB_SUCCESS) { + goto func_exit; + } else if (!updated) { + updated = buf_block_get_state(block) + == BUF_BLOCK_FILE_PAGE; + } + + /* If tablespace is encrypted we use additional + temporary scratch area where pages are read + for decrypting readptr == crypt_io_buffer != io_buffer. + + Destination for decryption is a buffer pool block + block->frame == dst == io_buffer that is updated. + Pages that did not require decryption even when + tablespace is marked as encrypted are not copied + instead block->frame is set to src == readptr. + + For encryption we again use temporary scratch area + writeptr != io_buffer == dst + that is then written to the tablespace + + (1) For normal tables io_buffer == dst == writeptr + (2) For only page compressed tables + io_buffer == dst == writeptr + (3) For encrypted (and page compressed) + readptr != io_buffer == dst != writeptr + */ + + ut_ad(!encrypted && !page_compressed ? + src == dst && dst == writeptr + (i * size):1); + ut_ad(page_compressed && !encrypted ? + src == dst && dst == writeptr + (i * size):1); + ut_ad(encrypted ? + src != dst && dst != writeptr + (i * size):1); + + /* When tablespace is encrypted or compressed its + first page (i.e. page 0) is not encrypted or + compressed and there is no need to copy frame. */ + if (encrypted && block->page.offset != 0) { + byte *local_frame = callback.get_frame(block); + ut_ad((writeptr + (i * size)) != local_frame); + memcpy((writeptr + (i * size)), local_frame, size); + } + + if (frame_changed) { + block->frame = dst; + } + + src = io_buffer + (i * size); + + if (page_compressed) { + updated = true; + if (fil_page_compress( + src, + page_compress_buf, + 0,/* FIXME: compression level */ + 512,/* FIXME: proper block size */ + encrypted)) { + /* FIXME: remove memcpy() */ + memcpy(src, page_compress_buf, + srv_page_size); + } + } + + /* If tablespace is encrypted, encrypt page before we + write it back. Note that we should not encrypt the + buffer that is in buffer pool. */ + /* NOTE: At this stage of IMPORT the + buffer pool is not being used at all! */ + if (decrypted && encrypted) { + byte *dest = writeptr + (i * size); + + byte* tmp = fil_encrypt_buf( + iter.crypt_data, + callback.get_space_id(), + block->page.offset, + mach_read_from_8(src + FIL_PAGE_LSN), + src, + callback.get_zip_size(), + dest); + + if (tmp == src) { + /* TODO: remove unnecessary memcpy's */ + ut_ad(dest != src); + memcpy(dest, src, size); + } + + updated = true; + } + } + + /* A page was updated in the set, write back to disk. */ + if (updated + && !os_file_write( + iter.filepath, iter.file, writeptr, + offset, (ulint) n_bytes)) { + + ib_logf(IB_LOG_LEVEL_ERROR, "os_file_write() failed"); + err = DB_IO_ERROR; + goto func_exit; + } + } + +func_exit: + ut_free(page_compress_buf); + return err; +} + +/********************************************************************//** +Iterate over all the pages in the tablespace. +@param table - the table definiton in the server +@param n_io_buffers - number of blocks to read and write together +@param callback - functor that will do the page updates +@return DB_SUCCESS or error code */ +static +dberr_t +fil_tablespace_iterate( +/*===================*/ + dict_table_t* table, + ulint n_io_buffers, + AbstractCallback& callback) +{ + dberr_t err; + pfs_os_file_t file; + char* filepath; + + ut_a(n_io_buffers > 0); + ut_ad(!srv_read_only_mode); + + DBUG_EXECUTE_IF("ib_import_trigger_corruption_1", + return(DB_CORRUPTION);); + + if (DICT_TF_HAS_DATA_DIR(table->flags)) { + dict_get_and_save_data_dir_path(table, false); + ut_a(table->data_dir_path); + + filepath = os_file_make_remote_pathname( + table->data_dir_path, table->name, "ibd"); + } else { + filepath = fil_make_ibd_name(table->name, false); + } + + { + ibool success; + + file = os_file_create_simple_no_error_handling( + innodb_file_data_key, filepath, + OS_FILE_OPEN, OS_FILE_READ_WRITE, &success, FALSE); + + DBUG_EXECUTE_IF("fil_tablespace_iterate_failure", + { + static bool once; + + if (!once || ut_rnd_interval(0, 10) == 5) { + once = true; + success = FALSE; + os_file_close(file); + } + }); + + if (!success) { + /* The following call prints an error message */ + os_file_get_last_error(true); + + ib_logf(IB_LOG_LEVEL_ERROR, + "Trying to import a tablespace, but could not " + "open the tablespace file %s", filepath); + + mem_free(filepath); + + return(DB_TABLESPACE_NOT_FOUND); + + } else { + err = DB_SUCCESS; + } + } + + callback.set_file(filepath, file); + + os_offset_t file_size = os_file_get_size(file); + ut_a(file_size != (os_offset_t) -1); + + /* Allocate a page to read in the tablespace header, so that we + can determine the page size and zip_size (if it is compressed). + We allocate an extra page in case it is a compressed table. One + page is to ensure alignement. */ + + void* page_ptr = mem_alloc(3 * UNIV_PAGE_SIZE); + byte* page = static_cast(ut_align(page_ptr, UNIV_PAGE_SIZE)); + + /* The block we will use for every physical page */ + buf_block_t block; + + memset(&block, 0, sizeof block); + block.frame = page; + block.page.space = callback.get_space_id(); + block.page.io_fix = BUF_IO_NONE; + block.page.buf_fix_count = 1; + block.page.state = BUF_BLOCK_FILE_PAGE; + + /* Read the first page and determine the page and zip size. */ + + if (!os_file_read_no_error_handling(file, page, 0, UNIV_PAGE_SIZE)) { + + err = DB_IO_ERROR; + + } else if ((err = callback.init(file_size, &block)) == DB_SUCCESS) { + if (const ulint zip_size = callback.get_zip_size()) { + page_zip_set_size(&block.page.zip, zip_size); + /* ROW_FORMAT=COMPRESSED is not optimised for block IO + for now. We do the IMPORT page by page. */ + n_io_buffers = 1; + } + + fil_iterator_t iter; + + iter.file = file; + iter.start = 0; + iter.end = file_size; + iter.filepath = filepath; + iter.file_size = file_size; + iter.n_io_buffers = n_io_buffers; + iter.page_size = callback.get_page_size(); + + /* In MariaDB/MySQL 5.6 tablespace does not exist + during import, therefore we can't use space directly + here. */ + ulint crypt_data_offset = fsp_header_get_crypt_offset( + callback.get_zip_size()); + + /* read (optional) crypt data */ + iter.crypt_data = fil_space_read_crypt_data( + 0, page, crypt_data_offset); + + /** If tablespace is encrypted, it needs extra buffers */ + if (iter.crypt_data != NULL) { + /* decrease io buffers so that memory + * consumption doesnt double + * note: the +1 is to avoid n_io_buffers getting down to 0 */ + iter.n_io_buffers = (iter.n_io_buffers + 1) / 2; + } + + /** Add an extra page for compressed page scratch area. */ + + void* io_buffer = mem_alloc( + (2 + iter.n_io_buffers) * UNIV_PAGE_SIZE); + + iter.io_buffer = static_cast( + ut_align(io_buffer, UNIV_PAGE_SIZE)); + + void* crypt_io_buffer = NULL; + if (iter.crypt_data != NULL) { + crypt_io_buffer = mem_alloc( + (2 + iter.n_io_buffers) * UNIV_PAGE_SIZE); + iter.crypt_io_buffer = static_cast( + ut_align(crypt_io_buffer, UNIV_PAGE_SIZE)); + } + + if (block.page.zip.ssize) { + ut_ad(iter.n_io_buffers == 1); + block.frame = iter.io_buffer; + block.page.zip.data = block.frame + UNIV_PAGE_SIZE; + ut_d(block.page.zip.m_external = true); + } + + err = fil_iterate(iter, &block, callback); + + mem_free(io_buffer); + + if (crypt_io_buffer != NULL) { + mem_free(crypt_io_buffer); + iter.crypt_io_buffer = NULL; + fil_space_destroy_crypt_data(&iter.crypt_data); + } + } + + if (err == DB_SUCCESS) { + + ib_logf(IB_LOG_LEVEL_INFO, "Sync to disk"); + + if (!os_file_flush(file)) { + ib_logf(IB_LOG_LEVEL_INFO, "os_file_flush() failed!"); + err = DB_IO_ERROR; + } else { + ib_logf(IB_LOG_LEVEL_INFO, "Sync to disk - done!"); + } + } + + os_file_close(file); + + mem_free(page_ptr); + mem_free(filepath); + + return(err); +} + /*****************************************************************//** Imports a tablespace. The space id in the .ibd file must match the space id of the table in the data dictionary. @@ -3598,6 +3999,17 @@ row_import_for_mysql( return(row_import_cleanup(prebuilt, trx, err)); } + /* On DISCARD TABLESPACE, we did not drop any adaptive hash + index entries. If we replaced the discarded tablespace with a + smaller one here, there could still be some adaptive hash + index entries that point to cached garbage pages in the buffer + pool, because PageConverter::operator() only evicted those + pages that were replaced by the imported pages. We must + discard all remaining adaptive hash index entries, because the + adaptive hash index must be a subset of the table contents; + false positives are not tolerated. */ + buf_LRU_drop_page_hash_for_tablespace(table); + row_mysql_lock_data_dictionary(trx); /* If the table is stored in a remote tablespace, we need to diff --git a/storage/xtradb/row/row0log.cc b/storage/xtradb/row/row0log.cc index 040fb37ee..21f1a1c59 100644 --- a/storage/xtradb/row/row0log.cc +++ b/storage/xtradb/row/row0log.cc @@ -466,6 +466,8 @@ row_log_table_open( *avail = srv_sort_buf_size - log->tail.bytes; if (size > *avail) { + /* Make sure log->tail.buf is large enough */ + ut_ad(size <= sizeof log->tail.buf); return(log->tail.buf); } else { return(log->tail.block + log->tail.bytes); @@ -584,12 +586,10 @@ row_log_table_delete( { ulint old_pk_extra_size; ulint old_pk_size; - ulint ext_size = 0; ulint mrec_size; ulint avail_size; mem_heap_t* heap = NULL; const dtuple_t* old_pk; - row_ext_t* ext; ut_ad(dict_index_is_clust(index)); ut_ad(rec_offs_validate(rec, index, offsets)); @@ -670,72 +670,20 @@ row_log_table_delete( &old_pk_extra_size); ut_ad(old_pk_extra_size < 0x100); - mrec_size = 6 + old_pk_size; - - /* Log enough prefix of the BLOB unless both the - old and new table are in COMPACT or REDUNDANT format, - which store the prefix in the clustered index record. */ - if (rec_offs_any_extern(offsets) - && (dict_table_get_format(index->table) >= UNIV_FORMAT_B - || dict_table_get_format(new_table) >= UNIV_FORMAT_B)) { - - /* Build a cache of those off-page column prefixes - that are referenced by secondary indexes. It can be - that none of the off-page columns are needed. */ - row_build(ROW_COPY_DATA, index, rec, - offsets, NULL, NULL, NULL, &ext, heap); - if (ext) { - /* Log the row_ext_t, ext->ext and ext->buf */ - ext_size = ext->n_ext * ext->max_len - + sizeof(*ext) - + ext->n_ext * sizeof(ulint) - + (ext->n_ext - 1) * sizeof ext->len; - mrec_size += ext_size; - } - } + /* 2 = 1 (extra_size) + at least 1 byte payload */ + mrec_size = 2 + old_pk_size; if (byte* b = row_log_table_open(index->online_log, mrec_size, &avail_size)) { *b++ = ROW_T_DELETE; *b++ = static_cast(old_pk_extra_size); - /* Log the size of external prefix we saved */ - mach_write_to_4(b, ext_size); - b += 4; - rec_convert_dtuple_to_temp( b + old_pk_extra_size, new_index, old_pk->fields, old_pk->n_fields); b += old_pk_size; - if (ext_size) { - ulint cur_ext_size = sizeof(*ext) - + (ext->n_ext - 1) * sizeof ext->len; - - memcpy(b, ext, cur_ext_size); - b += cur_ext_size; - - /* Check if we need to col_map to adjust the column - number. If columns were added/removed/reordered, - adjust the column number. */ - if (const ulint* col_map = - index->online_log->col_map) { - for (ulint i = 0; i < ext->n_ext; i++) { - const_cast(ext->ext[i]) = - col_map[ext->ext[i]]; - } - } - - memcpy(b, ext->ext, ext->n_ext * sizeof(*ext->ext)); - b += ext->n_ext * sizeof(*ext->ext); - - ext_size -= cur_ext_size - + ext->n_ext * sizeof(*ext->ext); - memcpy(b, ext->buf, ext_size); - b += ext_size; - } - row_log_table_close(index, b, mrec_size, avail_size); } @@ -1654,15 +1602,13 @@ row_log_table_apply_insert( /******************************************************//** Deletes a record from a table that is being rebuilt. @return DB_SUCCESS or error code */ -static MY_ATTRIBUTE((nonnull(1, 2, 4, 5), warn_unused_result)) +static MY_ATTRIBUTE((nonnull, warn_unused_result)) dberr_t row_log_table_apply_delete_low( /*===========================*/ btr_pcur_t* pcur, /*!< in/out: B-tree cursor, will be trashed */ const ulint* offsets, /*!< in: offsets on pcur */ - const row_ext_t* save_ext, /*!< in: saved external field - info, or NULL */ mem_heap_t* heap, /*!< in/out: memory heap */ mtr_t* mtr) /*!< in/out: mini-transaction, will be committed */ @@ -1686,11 +1632,7 @@ row_log_table_apply_delete_low( /* Build a row template for purging secondary index entries. */ row = row_build( ROW_COPY_DATA, index, btr_pcur_get_rec(pcur), - offsets, NULL, NULL, NULL, - save_ext ? NULL : &ext, heap); - if (!save_ext) { - save_ext = ext; - } + offsets, NULL, NULL, NULL, &ext, heap); } else { row = NULL; } @@ -1709,7 +1651,7 @@ row_log_table_apply_delete_low( } const dtuple_t* entry = row_build_index_entry( - row, save_ext, index, heap); + row, ext, index, heap); mtr_start(mtr); btr_pcur_open(index, entry, PAGE_CUR_LE, BTR_MODIFY_TREE, pcur, mtr); @@ -1752,11 +1694,10 @@ row_log_table_apply_delete_low( /******************************************************//** Replays a delete operation on a table that was rebuilt. @return DB_SUCCESS or error code */ -static MY_ATTRIBUTE((nonnull(1, 3, 4, 5, 6, 7), warn_unused_result)) +static MY_ATTRIBUTE((nonnull, warn_unused_result)) dberr_t row_log_table_apply_delete( /*=======================*/ - que_thr_t* thr, /*!< in: query graph */ ulint trx_id_col, /*!< in: position of DB_TRX_ID in the new clustered index */ @@ -1765,9 +1706,7 @@ row_log_table_apply_delete( mem_heap_t* offsets_heap, /*!< in/out: memory heap that can be emptied */ mem_heap_t* heap, /*!< in/out: memory heap */ - const row_log_t* log, /*!< in: online log */ - const row_ext_t* save_ext) /*!< in: saved external field - info, or NULL */ + const row_log_t* log) /*!< in: online log */ { dict_table_t* new_table = log->table; dict_index_t* index = dict_table_get_first_index(new_table); @@ -1867,8 +1806,7 @@ row_log_table_apply_delete( } } - return(row_log_table_apply_delete_low(&pcur, offsets, save_ext, - heap, &mtr)); + return row_log_table_apply_delete_low(&pcur, offsets, heap, &mtr); } /******************************************************//** @@ -2079,7 +2017,7 @@ row_log_table_apply_update( /* Some BLOBs are missing, so we are interpreting this ROW_T_UPDATE as ROW_T_DELETE (see *1). */ error = row_log_table_apply_delete_low( - &pcur, cur_offsets, NULL, heap, &mtr); + &pcur, cur_offsets, heap, &mtr); goto func_exit_committed; } @@ -2117,7 +2055,7 @@ row_log_table_apply_update( } error = row_log_table_apply_delete_low( - &pcur, cur_offsets, NULL, heap, &mtr); + &pcur, cur_offsets, heap, &mtr); ut_ad(mtr.state == MTR_COMMITTED); if (error == DB_SUCCESS) { @@ -2263,8 +2201,6 @@ row_log_table_apply_op( ulint extra_size; const mrec_t* next_mrec; dtuple_t* old_pk; - row_ext_t* ext; - ulint ext_size; ut_ad(dict_index_is_clust(dup->index)); ut_ad(dup->index->table != log->table); @@ -2272,7 +2208,7 @@ row_log_table_apply_op( *error = DB_SUCCESS; - /* 3 = 1 (op type) + 1 (ext_size) + at least 1 byte payload */ + /* 3 = 1 (op type) + 1 (extra_size) + at least 1 byte payload */ if (mrec + 3 >= mrec_end) { return(NULL); } @@ -2322,14 +2258,12 @@ row_log_table_apply_op( break; case ROW_T_DELETE: - /* 1 (extra_size) + 4 (ext_size) + at least 1 (payload) */ - if (mrec + 6 >= mrec_end) { + /* 1 (extra_size) + at least 1 (payload) */ + if (mrec + 2 >= mrec_end) { return(NULL); } extra_size = *mrec++; - ext_size = mach_read_from_4(mrec); - mrec += 4; ut_ad(mrec < mrec_end); /* We assume extra_size < 0x100 for the PRIMARY KEY prefix. @@ -2338,40 +2272,16 @@ row_log_table_apply_op( rec_offs_set_n_fields(offsets, new_index->n_uniq + 2); rec_init_offsets_temp(mrec, new_index, offsets); - next_mrec = mrec + rec_offs_data_size(offsets) + ext_size; + next_mrec = mrec + rec_offs_data_size(offsets); if (next_mrec > mrec_end) { return(NULL); } log->head.total += next_mrec - mrec_start; - /* If there are external fields, retrieve those logged - prefix info and reconstruct the row_ext_t */ - if (ext_size) { - /* We use memcpy to avoid unaligned - access on some non-x86 platforms.*/ - ext = static_cast( - mem_heap_dup(heap, - mrec + rec_offs_data_size(offsets), - ext_size)); - - byte* ext_start = reinterpret_cast(ext); - - ulint ext_len = sizeof(*ext) - + (ext->n_ext - 1) * sizeof ext->len; - - ext->ext = reinterpret_cast(ext_start + ext_len); - ext_len += ext->n_ext * sizeof(*ext->ext); - - ext->buf = static_cast(ext_start + ext_len); - } else { - ext = NULL; - } - *error = row_log_table_apply_delete( - thr, new_trx_id_col, - mrec, offsets, offsets_heap, heap, - log, ext); + new_trx_id_col, + mrec, offsets, offsets_heap, heap, log); break; case ROW_T_UPDATE: diff --git a/storage/xtradb/row/row0merge.cc b/storage/xtradb/row/row0merge.cc index d95858185..9f8fc39e0 100644 --- a/storage/xtradb/row/row0merge.cc +++ b/storage/xtradb/row/row0merge.cc @@ -3111,7 +3111,8 @@ row_merge_drop_indexes( A concurrent purge will be prevented by dict_operation_lock. */ - if (!locked && table->n_ref_count > 1) { + if (!locked && (table->n_ref_count > 1 + || UT_LIST_GET_FIRST(table->locks))) { /* We will have to drop the indexes later, when the table is guaranteed to be no longer in use. Mark the indexes as incomplete and corrupted, so that other diff --git a/storage/xtradb/row/row0mysql.cc b/storage/xtradb/row/row0mysql.cc index 549a19799..2b6f38ba2 100644 --- a/storage/xtradb/row/row0mysql.cc +++ b/storage/xtradb/row/row0mysql.cc @@ -1,6 +1,6 @@ /***************************************************************************** -Copyright (c) 2000, 2017, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 2000, 2018, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2015, 2018, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under @@ -1504,8 +1504,7 @@ row_insert_for_mysql( doc_ids difference should not exceed FTS_DOC_ID_MAX_STEP value. */ - if (next_doc_id > 1 - && doc_id - next_doc_id >= FTS_DOC_ID_MAX_STEP) { + if (doc_id - next_doc_id >= FTS_DOC_ID_MAX_STEP) { fprintf(stderr, "InnoDB: Doc ID " UINT64PF " is too" " big. Its difference with largest" @@ -3541,6 +3540,8 @@ row_truncate_table_for_mysql( fil_space_release(space); } + buf_LRU_drop_page_hash_for_tablespace(table); + if (flags != ULINT_UNDEFINED && fil_discard_tablespace(space_id) == DB_SUCCESS) { @@ -4240,6 +4241,21 @@ row_drop_table_for_mysql( rw_lock_x_unlock(dict_index_get_lock(index)); } + if (table->space != TRX_SYS_SPACE) { + /* On DISCARD TABLESPACE, we would not drop the + adaptive hash index entries. If the tablespace is + missing here, delete-marking the record in SYS_INDEXES + would not free any pages in the buffer pool. Thus, + dict_index_remove_from_cache() would hang due to + adaptive hash index entries existing in the buffer + pool. To prevent this hang, and also to guarantee + that btr_search_drop_page_hash_when_freed() will avoid + calling btr_search_drop_page_hash_index() while we + hold the InnoDB dictionary lock, we will drop any + adaptive hash index entries upfront. */ + buf_LRU_drop_page_hash_for_tablespace(table); + } + /* We use the private SQL parser of Innobase to generate the query graphs needed in deleting the dictionary data from system tables in Innobase. Deleting a row from SYS_INDEXES table also @@ -5270,7 +5286,8 @@ row_rename_table_for_mysql( } } - if (dict_table_has_fts_index(table) + if ((dict_table_has_fts_index(table) + || DICT_TF2_FLAG_IS_SET(table, DICT_TF2_FTS_HAS_DOC_ID)) && !dict_tables_have_same_db(old_name, new_name)) { err = fts_rename_aux_tables(table, new_name, trx); if (err != DB_TABLE_NOT_FOUND) { @@ -5372,6 +5389,7 @@ row_rename_table_for_mysql( trx_rollback_to_savepoint(trx, NULL); trx->error_state = DB_SUCCESS; } + table->data_dir_path= NULL; } funct_exit: diff --git a/storage/xtradb/row/row0sel.cc b/storage/xtradb/row/row0sel.cc index 03ae6822f..b6b5d1078 100644 --- a/storage/xtradb/row/row0sel.cc +++ b/storage/xtradb/row/row0sel.cc @@ -3685,6 +3685,117 @@ row_search_idx_cond_check( return(result); } +/** Return the record field length in characters. +@param[in] col table column of the field +@param[in] field_no field number +@param[in] rec physical record +@param[in] offsets field offsets in the physical record +@return field length in characters. */ +static +size_t +rec_field_len_in_chars( + const dict_col_t* col, + const ulint field_no, + const rec_t* rec, + const ulint* offsets) +{ + const ulint cset = dtype_get_charset_coll(col->prtype); + const CHARSET_INFO* cs = all_charsets[cset]; + ulint rec_field_len; + const char* rec_field = reinterpret_cast( + rec_get_nth_field( + rec, offsets, field_no, &rec_field_len)); + + if (UNIV_UNLIKELY(!cs)) { + ib_logf(IB_LOG_LEVEL_WARN, "Missing collation " ULINTPF, cset); + return SIZE_T_MAX; + } + + return(cs->cset->numchars(cs, rec_field, rec_field + rec_field_len)); +} + + +/** Avoid the clustered index lookup if all the following conditions +are true: +1) all columns are in secondary index +2) all values for columns that are prefix-only indexes are shorter +than the prefix size. This optimization can avoid many IOs for certain schemas. +@return true, to avoid clustered index lookup. */ +static +bool row_search_with_covering_prefix( + row_prebuilt_t* prebuilt, + const rec_t* rec, + const ulint* offsets) +{ + const dict_index_t* index = prebuilt->index; + ut_ad(!dict_index_is_clust(index)); + + if (!srv_prefix_index_cluster_optimization) { + return false; + } + + /** Optimization only applicable if the number of secondary index + fields are greater than or equal to number of clustered index fields. */ + if (prebuilt->n_template > index->n_fields) { + return false; + } + + for (ulint i = 0; i < prebuilt->n_template; i++) { + mysql_row_templ_t* templ = prebuilt->mysql_template + i; + ulint j = templ->rec_prefix_field_no; + + /** Condition (1) : is the field in the index. */ + if (j == ULINT_UNDEFINED) { + return false; + } + + /** Condition (2): If this is a prefix index then + row's value size shorter than prefix length. */ + + if (!templ->rec_field_is_prefix) { + continue; + } + + ulint rec_size = rec_offs_nth_size(offsets, j); + const dict_field_t* field = dict_index_get_nth_field(index, j); + ulint max_chars = field->prefix_len / templ->mbmaxlen; + + ut_a(field->prefix_len > 0); + + if (rec_size < max_chars) { + /* Record in bytes shorter than the index + prefix length in char. */ + continue; + } + + if (rec_size * templ->mbminlen >= field->prefix_len) { + /* Shortest representation string by the + byte length of the record is longer than the + maximum possible index prefix. */ + return false; + } + + + size_t num_chars = rec_field_len_in_chars( + field->col, j, rec, offsets); + + if (num_chars >= max_chars) { + /* No of chars to store the record exceeds + the index prefix character length. */ + return false; + } + } + + for (ulint i = 0; i < prebuilt->n_template; i++) { + mysql_row_templ_t* templ = prebuilt->mysql_template + i; + templ->rec_field_no = templ->rec_prefix_field_no; + ut_a(templ->rec_field_no != ULINT_UNDEFINED); + } + + srv_stats.n_sec_rec_cluster_reads_avoided.inc(); + return true; +} + /********************************************************************//** Searches for rows in the database. This is used in the interface to MySQL. This function opens a cursor, and also implements fetch next @@ -3748,7 +3859,6 @@ row_search_for_mysql( ulint* offsets = offsets_; ibool table_lock_waited = FALSE; byte* next_buf = 0; - bool use_clustered_index = false; rec_offs_init(offsets_); @@ -4555,9 +4665,27 @@ row_search_for_mysql( ulint lock_type; + if (srv_locks_unsafe_for_binlog + || trx->isolation_level <= TRX_ISO_READ_COMMITTED) { + /* At READ COMMITTED or READ UNCOMMITTED + isolation levels, do not lock committed + delete-marked records. */ + if (!rec_get_deleted_flag(rec, comp)) { + goto no_gap_lock; + } + if (trx_id_t trx_id = index == clust_index + ? row_get_rec_trx_id(rec, index, offsets) + : row_vers_impl_x_locked(rec, index, offsets)) { + if (trx_rw_is_active(trx_id, NULL)) { + /* The record belongs to an active + transaction. We must acquire a lock. */ + goto no_gap_lock; + } + } + goto locks_ok_del_marked; + } + if (!set_also_gap_locks - || srv_locks_unsafe_for_binlog - || trx->isolation_level <= TRX_ISO_READ_COMMITTED || (unique_search && !rec_get_deleted_flag(rec, comp))) { goto no_gap_lock; @@ -4627,7 +4755,11 @@ row_search_for_mysql( a deadlock and the transaction had to wait then release the lock it is waiting on. */ + lock_mutex_enter(); + trx_mutex_enter(trx); err = lock_trx_handle_wait(trx); + lock_mutex_exit(); + trx_mutex_exit(trx); switch (err) { case DB_SUCCESS: @@ -4748,20 +4880,9 @@ row_search_for_mysql( page_rec_is_comp() cannot be used! */ if (rec_get_deleted_flag(rec, comp)) { - +locks_ok_del_marked: /* The record is delete-marked: we can skip it */ - if ((srv_locks_unsafe_for_binlog - || trx->isolation_level <= TRX_ISO_READ_COMMITTED) - && prebuilt->select_lock_type != LOCK_NONE - && !did_semi_consistent_read) { - - /* No need to keep a lock on a delete-marked record - if we do not want to use next-key locking. */ - - row_unlock_for_mysql(prebuilt, TRUE); - } - /* This is an optimization to skip setting the next key lock on the record that follows this delete-marked record. This optimization works because of the unique search criteria @@ -4806,71 +4927,10 @@ row_search_for_mysql( break; } - /* Get the clustered index record if needed, if we did not do the - search using the clustered index... */ - - use_clustered_index = - (index != clust_index && prebuilt->need_to_access_clustered); - - if (use_clustered_index && srv_prefix_index_cluster_optimization - && prebuilt->n_template <= index->n_fields) { - /* ...but, perhaps avoid the clustered index lookup if - all of the following are true: - 1) all columns are in the secondary index - 2) all values for columns that are prefix-only - indexes are shorter than the prefix size - This optimization can avoid many IOs for certain schemas. - */ - bool row_contains_all_values = true; - unsigned int i; - for (i = 0; i < prebuilt->n_template; i++) { - /* Condition (1) from above: is the field in the - index (prefix or not)? */ - const mysql_row_templ_t* templ = - prebuilt->mysql_template + i; - ulint secondary_index_field_no = - templ->rec_prefix_field_no; - if (secondary_index_field_no == ULINT_UNDEFINED) { - row_contains_all_values = false; - break; - } - /* Condition (2) from above: if this is a - prefix, is this row's value size shorter - than the prefix? */ - if (templ->rec_field_is_prefix) { - ulint record_size = rec_offs_nth_size( - offsets, - secondary_index_field_no); - const dict_field_t *field = - dict_index_get_nth_field( - index, - secondary_index_field_no); - ut_a(field->prefix_len > 0); - if (record_size >= field->prefix_len - / templ->mbmaxlen) { - row_contains_all_values = false; - break; - } - } - } - /* If (1) and (2) were true for all columns above, use - rec_prefix_field_no instead of rec_field_no, and skip - the clustered lookup below. */ - if (row_contains_all_values) { - for (i = 0; i < prebuilt->n_template; i++) { - mysql_row_templ_t* templ = - prebuilt->mysql_template + i; - templ->rec_field_no = - templ->rec_prefix_field_no; - ut_a(templ->rec_field_no != ULINT_UNDEFINED); - } - use_clustered_index = false; - srv_stats.n_sec_rec_cluster_reads_avoided.inc(); + if (index != clust_index && prebuilt->need_to_access_clustered) { + if (row_search_with_covering_prefix(prebuilt, rec, offsets)) { + goto use_covering_index; } - } - - if (use_clustered_index) { - requires_clust_rec: ut_ad(index != clust_index); /* We use a 'goto' to the preceding label if a consistent @@ -4956,6 +5016,7 @@ row_search_for_mysql( } } } else { +use_covering_index: result_rec = rec; } diff --git a/storage/xtradb/row/row0upd.cc b/storage/xtradb/row/row0upd.cc index 9ac72f8d0..93ccc07c9 100644 --- a/storage/xtradb/row/row0upd.cc +++ b/storage/xtradb/row/row0upd.cc @@ -1806,6 +1806,23 @@ row_upd_store_row( } } +#ifdef WITH_WSREP +/** Determine if a FOREIGN KEY constraint needs to be processed. +@param[in] node query node +@param[in] trx transaction +@return whether the node cannot be ignored */ + +inline bool wsrep_must_process_fk(const upd_node_t* node, const trx_t* trx) +{ + if (!wsrep_on_trx(trx)) { + return false; + } + return que_node_get_type(node->common.parent) != QUE_NODE_UPDATE + || static_cast(node->common.parent)->cascade_node + != node; +} +#endif /* WITH_WSREP */ + /***********************************************************//** Updates a secondary index entry of a row. @return DB_SUCCESS if operation successfully completed, else error @@ -1836,7 +1853,7 @@ row_upd_sec_index_entry( referenced = row_upd_index_is_referenced(index, trx); #ifdef WITH_WSREP - ibool foreign = wsrep_row_upd_index_is_foreign(index, trx); + bool foreign = wsrep_row_upd_index_is_foreign(index, trx); #endif /* WITH_WSREP */ heap = mem_heap_create(1024); @@ -1968,61 +1985,61 @@ row_upd_sec_index_entry( row_ins_sec_index_entry() below */ if (!rec_get_deleted_flag( rec, dict_table_is_comp(index->table))) { -#ifdef WITH_WSREP - que_node_t *parent = que_node_get_parent(node); -#endif /* WITH_WSREP */ err = btr_cur_del_mark_set_sec_rec( 0, btr_cur, TRUE, thr, &mtr); - if (err == DB_SUCCESS && referenced) { - - ulint* offsets; - - offsets = rec_get_offsets( - rec, index, NULL, ULINT_UNDEFINED, - &heap); - - /* NOTE that the following call loses - the position of pcur ! */ - err = row_upd_check_references_constraints( - node, &pcur, index->table, - index, offsets, thr, &mtr); + if (err != DB_SUCCESS) { + break; } + #ifdef WITH_WSREP - if (err == DB_SUCCESS && !referenced && - wsrep_on_trx(trx) && - !wsrep_thd_is_BF(trx->mysql_thd, FALSE) && - !(parent && que_node_get_type(parent) == - QUE_NODE_UPDATE && - ((upd_node_t*)parent)->cascade_node == node) && - foreign - ) { - ulint* offsets = - rec_get_offsets( + if (!referenced && foreign + && wsrep_must_process_fk(node, trx) + && !wsrep_thd_is_BF(trx->mysql_thd, FALSE)) { + ulint* offsets = rec_get_offsets( rec, index, NULL, ULINT_UNDEFINED, &heap); + err = wsrep_row_upd_check_foreign_constraints( node, &pcur, index->table, index, offsets, thr, &mtr); + switch (err) { case DB_SUCCESS: case DB_NO_REFERENCED_ROW: err = DB_SUCCESS; break; case DB_DEADLOCK: - if (wsrep_debug) fprintf (stderr, - "WSREP: sec index FK check fail for deadlock"); + if (wsrep_debug) { + ib_logf(IB_LOG_LEVEL_WARN, + "WSREP: sec index FK check fail for deadlock: " + " index %s table %s", index->name, index->table->name); + } break; default: - fprintf (stderr, - "WSREP: referenced FK check fail: %d", - (int)err); + ib_logf(IB_LOG_LEVEL_ERROR, + "WSREP: referenced FK check fail: %s index %s table %s", + ut_strerr(err), index->name, index->table->name); break; } } #endif /* WITH_WSREP */ } - break; + + if (referenced) { + + ulint* offsets; + + offsets = rec_get_offsets( + rec, index, NULL, ULINT_UNDEFINED, + &heap); + + /* NOTE that the following call loses + the position of pcur ! */ + err = row_upd_check_references_constraints( + node, &pcur, index->table, + index, offsets, thr, &mtr); + } } btr_pcur_close(&pcur); @@ -2191,9 +2208,6 @@ row_upd_clust_rec_by_insert( rec_t* rec; ulint* offsets = NULL; -#ifdef WITH_WSREP - que_node_t *parent = que_node_get_parent(node); -#endif /* WITH_WSREP */ ut_ad(node); ut_ad(dict_index_is_clust(index)); @@ -2278,35 +2292,31 @@ row_upd_clust_rec_by_insert( if (err != DB_SUCCESS) { goto err_exit; } - } #ifdef WITH_WSREP - if (!referenced && wsrep_on_trx(trx) && - !(parent && que_node_get_type(parent) == QUE_NODE_UPDATE && - ((upd_node_t*)parent)->cascade_node == node) && - foreign - ) { + } else if ((foreign && wsrep_must_process_fk(node, trx))) { err = wsrep_row_upd_check_foreign_constraints( node, pcur, table, index, offsets, thr, mtr); + switch (err) { case DB_SUCCESS: case DB_NO_REFERENCED_ROW: err = DB_SUCCESS; break; case DB_DEADLOCK: - if (wsrep_debug) fprintf (stderr, - "WSREP: insert FK check fail for deadlock"); + if (wsrep_debug) { + ib_logf(IB_LOG_LEVEL_WARN, + "WSREP: sec index FK check fail for deadlock: " + " index %s table %s", index->name, index->table->name); + } break; default: - fprintf (stderr, - "WSREP: referenced FK check fail: %d", - (int)err); + ib_logf(IB_LOG_LEVEL_ERROR, + "WSREP: referenced FK check fail: %s index %s table %s", + ut_strerr(err), index->name, index->table->name); break; } - if (err != DB_SUCCESS) { - goto err_exit; - } - } #endif /* WITH_WSREP */ + } } mtr_commit(mtr); @@ -2512,7 +2522,7 @@ row_upd_del_mark_clust_rec( dberr_t err; #ifdef WITH_WSREP rec_t* rec; - que_node_t *parent = que_node_get_parent(node); + trx_t* trx = thr_get_trx(thr) ; #endif /* WITH_WSREP */ ut_ad(node); @@ -2541,38 +2551,37 @@ row_upd_del_mark_clust_rec( btr_cur_get_block(btr_cur), btr_cur_get_rec(btr_cur), #endif /* WITH_WSREP */ index, offsets, thr, mtr); - if (err == DB_SUCCESS && referenced) { + if (err != DB_SUCCESS) { + } else if (referenced) { /* NOTE that the following call loses the position of pcur ! */ err = row_upd_check_references_constraints( node, pcur, index->table, index, offsets, thr, mtr); - } #ifdef WITH_WSREP - trx_t* trx = thr_get_trx(thr) ; - if (err == DB_SUCCESS && !referenced && wsrep_on_trx(trx) && - !(parent && que_node_get_type(parent) == QUE_NODE_UPDATE && - ((upd_node_t*)parent)->cascade_node == node) && - foreign - ) { + } else if (foreign && wsrep_must_process_fk(node, trx)) { err = wsrep_row_upd_check_foreign_constraints( node, pcur, index->table, index, offsets, thr, mtr); + switch (err) { case DB_SUCCESS: case DB_NO_REFERENCED_ROW: err = DB_SUCCESS; break; case DB_DEADLOCK: - if (wsrep_debug) fprintf (stderr, - "WSREP: clust rec FK check fail for deadlock"); + if (wsrep_debug) { + ib_logf(IB_LOG_LEVEL_WARN, + "WSREP: sec index FK check fail for deadlock: " + " index %s table %s", index->name, index->table->name); + } break; default: - fprintf (stderr, - "WSREP: clust rec referenced FK check fail: %d", - (int)err); + ib_logf(IB_LOG_LEVEL_ERROR, + "WSREP: referenced FK check fail: %s index %s table %s", + ut_strerr(err), index->name, index->table->name); break; } - } #endif /* WITH_WSREP */ + } mtr_commit(mtr); diff --git a/storage/xtradb/srv/srv0srv.cc b/storage/xtradb/srv/srv0srv.cc index 02314db6b..31e870959 100644 --- a/storage/xtradb/srv/srv0srv.cc +++ b/storage/xtradb/srv/srv0srv.cc @@ -86,6 +86,12 @@ ibool innobase_get_slow_log(); in the server */ UNIV_INTERN ulint srv_activity_count = 0; +#include + +#ifdef WITH_WSREP +extern int wsrep_debug; +extern int wsrep_trx_is_aborting(void *thd_ptr); +#endif /* The following is the maximum allowed duration of a lock wait. */ UNIV_INTERN ulong srv_fatal_semaphore_wait_threshold = DEFAULT_SRV_FATAL_SEMAPHORE_TIMEOUT; @@ -565,16 +571,6 @@ static ulint srv_n_system_rows_read_old = 0; UNIV_INTERN ulint srv_truncated_status_writes = 0; UNIV_INTERN ulint srv_available_undo_logs = 0; -UNIV_INTERN ib_uint64_t srv_page_compression_saved = 0; -UNIV_INTERN ib_uint64_t srv_page_compression_trim_sect512 = 0; -UNIV_INTERN ib_uint64_t srv_page_compression_trim_sect4096 = 0; -UNIV_INTERN ib_uint64_t srv_index_pages_written = 0; -UNIV_INTERN ib_uint64_t srv_non_index_pages_written = 0; -UNIV_INTERN ib_uint64_t srv_pages_page_compressed = 0; -UNIV_INTERN ib_uint64_t srv_page_compressed_trim_op = 0; -UNIV_INTERN ib_uint64_t srv_page_compressed_trim_op_saved = 0; -UNIV_INTERN ib_uint64_t srv_index_page_decompressed = 0; - /* Ensure status variables are on separate cache lines */ #ifdef __powerpc__ @@ -3240,6 +3236,9 @@ srv_purge_should_exit(ulint n_purged) } /* Slow shutdown was requested. */ if (n_purged) { + service_manager_extend_timeout( + INNODB_EXTEND_TIMEOUT_INTERVAL, + "InnoDB " ULINTPF " pages purged", n_purged); /* The previous round still did some work. */ return(false); } @@ -3444,7 +3443,6 @@ srv_do_purge( (++count % TRX_SYS_N_RSEGS) == 0); *n_total_purged += n_pages_purged; - } while (!srv_purge_should_exit(n_pages_purged) && n_pages_purged > 0 && purge_sys->state == PURGE_STATE_RUN); diff --git a/storage/xtradb/srv/srv0start.cc b/storage/xtradb/srv/srv0start.cc index 2aa2426ca..4ed310089 100644 --- a/storage/xtradb/srv/srv0start.cc +++ b/storage/xtradb/srv/srv0start.cc @@ -1505,14 +1505,12 @@ srv_undo_tablespaces_init( if (backup_mode) { ut_ad(!create_new_db); - /* MDEV-13561 FIXME: Determine srv_undo_space_id_start - from the undo001 file. */ - srv_undo_space_id_start = 1; - for (i = 0; i < n_undo_tablespaces; i++) { undo_tablespace_ids[i] = i + srv_undo_space_id_start; } + + prev_space_id = srv_undo_space_id_start - 1; } } diff --git a/storage/xtradb/trx/trx0roll.cc b/storage/xtradb/trx/trx0roll.cc index 1075064a2..56b7120fa 100644 --- a/storage/xtradb/trx/trx0roll.cc +++ b/storage/xtradb/trx/trx0roll.cc @@ -25,7 +25,7 @@ Created 3/26/1996 Heikki Tuuri *******************************************************/ #include "my_config.h" -#include +#include #include "trx0roll.h" @@ -764,11 +764,17 @@ trx_roll_must_shutdown() n_rows += t->undo_no; } } + + if (n_rows > 0) { + service_manager_extend_timeout( + INNODB_EXTEND_TIMEOUT_INTERVAL, + "To roll back: " ULINTPF " transactions, " + "%llu rows", n_trx, n_rows); + } + ib_logf(IB_LOG_LEVEL_INFO, "To roll back: " ULINTPF " transactions, " "%llu rows", n_trx, n_rows); - sd_notifyf(0, "STATUS=To roll back: " ULINTPF " transactions, " - "%llu rows", n_trx, n_rows); } mutex_exit(&recv_sys->mutex); diff --git a/storage/xtradb/trx/trx0trx.cc b/storage/xtradb/trx/trx0trx.cc index 2b0b05dc3..b3d709ccf 100644 --- a/storage/xtradb/trx/trx0trx.cc +++ b/storage/xtradb/trx/trx0trx.cc @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2015, 2017, MariaDB Corporation. +Copyright (c) 2015, 2018, MariaDB Corporation. 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 @@ -1472,6 +1472,8 @@ trx_commit_in_memory( if (lsn) { ulint flush_log_at_trx_commit; + DEBUG_SYNC_C("after_trx_committed_in_memory"); + if (trx->insert_undo != NULL) { trx_undo_insert_cleanup(trx); diff --git a/storage/xtradb/trx/trx0undo.cc b/storage/xtradb/trx/trx0undo.cc index 0d5a0f55f..594416ba3 100644 --- a/storage/xtradb/trx/trx0undo.cc +++ b/storage/xtradb/trx/trx0undo.cc @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2014, 2017, MariaDB Corporation. +Copyright (c) 2014, 2018, MariaDB Corporation. 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 @@ -1989,7 +1989,9 @@ trx_undo_insert_cleanup( mutex_exit(&(rseg->mutex)); - trx_undo_seg_free(undo); + if (!srv_read_only_mode) { + trx_undo_seg_free(undo); + } mutex_enter(&(rseg->mutex)); diff --git a/storage/xtradb/ut/ut0ut.cc b/storage/xtradb/ut/ut0ut.cc index fd52537ae..695be4907 100644 --- a/storage/xtradb/ut/ut0ut.cc +++ b/storage/xtradb/ut/ut0ut.cc @@ -1,6 +1,6 @@ /***************************************************************************** -Copyright (c) 1994, 2014, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 1994, 2017, Oracle and/or its affiliates. All Rights Reserved. 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 @@ -47,6 +47,10 @@ Created 5/11/1994 Heikki Tuuri #endif /* UNIV_HOTBACKUP */ #ifdef __WIN__ +#include /* For sql_print_error */ +typedef VOID(WINAPI *time_fn)(LPFILETIME); +static time_fn ut_get_system_time_as_file_time = GetSystemTimeAsFileTime; + /*****************************************************************//** NOTE: The Windows epoch starts from 1601/01/01 whereas the Unix epoch starts from 1970/1/1. For selection of constant see: @@ -54,6 +58,28 @@ epoch starts from 1970/1/1. For selection of constant see: #define WIN_TO_UNIX_DELTA_USEC ((ib_int64_t) 11644473600000000ULL) +/** +Initialise highest available time resolution API on Windows +@return 0 if all OK else -1 */ +int +ut_win_init_time() +{ + HMODULE h = LoadLibrary("kernel32.dll"); + if (h != NULL) + { + time_fn pfn = (time_fn)GetProcAddress(h, "GetSystemTimePreciseAsFileTime"); + if (pfn != NULL) + { + ut_get_system_time_as_file_time = pfn; + } + return false; + } + DWORD error = GetLastError(); + sql_print_error( + "LoadLibrary(\"kernel32.dll\") failed: GetLastError returns %lu", error); + return(-1); +} + /*****************************************************************//** This is the Windows version of gettimeofday(2). @return 0 if all OK else -1 */ @@ -72,7 +98,7 @@ ut_gettimeofday( return(-1); } - GetSystemTimeAsFileTime(&ft); + ut_get_system_time_as_file_time(&ft); tm = (ib_int64_t) ft.dwHighDateTime << 32; tm |= ft.dwLowDateTime; diff --git a/support-files/CMakeLists.txt b/support-files/CMakeLists.txt index 3b6e86030..dff4610d4 100644 --- a/support-files/CMakeLists.txt +++ b/support-files/CMakeLists.txt @@ -41,13 +41,20 @@ ELSE() SET(inst_location ${INSTALL_SUPPORTFILESDIR}) ENDIF() -FOREACH(inifile my-huge my-innodb-heavy-4G my-large my-medium my-small wsrep) - CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/${inifile}.cnf.sh +FOREACH(inifile my-huge my-innodb-heavy-4G my-large my-medium my-small) + CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/${inifile}.cnf.sh ${CMAKE_CURRENT_BINARY_DIR}/${inifile}.${ini_file_extension} @ONLY) INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/${inifile}.${ini_file_extension} DESTINATION ${inst_location} COMPONENT IniFiles) ENDFOREACH() +IF(WITH_WSREP) + CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/wsrep.cnf.sh + ${CMAKE_CURRENT_BINARY_DIR}/wsrep.${ini_file_extension} @ONLY) + INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/wsrep.${ini_file_extension} + DESTINATION ${inst_location} COMPONENT IniFiles) +ENDIF() + IF(UNIX) SET(prefix ${CMAKE_INSTALL_PREFIX}) FOREACH(script mysqld_multi.server mysql-log-rotate binary-configure wsrep_notify) diff --git a/support-files/mysql.server.sh b/support-files/mysql.server.sh index c9ea270a7..a60ec248c 100644 --- a/support-files/mysql.server.sh +++ b/support-files/mysql.server.sh @@ -25,7 +25,6 @@ # Description: MariaDB is a very fast and reliable SQL database engine. ### END INIT INFO -# If you install MariaDB on some other places than @prefix@, then you # have to do one of the following things for this script to work: # # - Run this script from within the MariaDB installation directory diff --git a/support-files/policy/selinux/mariadb-server.fc b/support-files/policy/selinux/mariadb-server.fc index 1a69ecc2c..409f72923 100644 --- a/support-files/policy/selinux/mariadb-server.fc +++ b/support-files/policy/selinux/mariadb-server.fc @@ -1,4 +1,4 @@ -# This SELinux file contexts (.fc) file has been copied under BSD License from +# This SELinux file contexts (.fc) file has been copied under New BSD License from # Percona XtraDB Cluster. /etc/init\.d/rc\.d/mysql -- gen_context(system_u:object_r:mysqld_initrc_exec_t,s0) diff --git a/support-files/policy/selinux/mariadb-server.te b/support-files/policy/selinux/mariadb-server.te index 34d79326b..45ef40f41 100644 --- a/support-files/policy/selinux/mariadb-server.te +++ b/support-files/policy/selinux/mariadb-server.te @@ -1,4 +1,4 @@ -# This SELinux type enforcement (.te) file has been copied under BSD License +# This SELinux type enforcement (.te) file has been copied under New BSD License # from Percona XtraDB Cluster, along with some additions. module mariadb-server 1.0; diff --git a/support-files/wsrep.cnf.sh b/support-files/wsrep.cnf.sh index a5390855c..51ce3dca2 100644 --- a/support-files/wsrep.cnf.sh +++ b/support-files/wsrep.cnf.sh @@ -30,6 +30,9 @@ bind-address=0.0.0.0 ## WSREP options ## +# Enable wsrep +wsrep_on=1 + # Full path to wsrep provider library or 'none' wsrep_provider=none diff --git a/tests/mysql_client_fw.c b/tests/mysql_client_fw.c index b7211989f..71fb3894b 100644 --- a/tests/mysql_client_fw.c +++ b/tests/mysql_client_fw.c @@ -1409,8 +1409,7 @@ int main(int argc, char **argv) for (i= 0; i < argc; i++) original_argv[i]= strdup(argv[i]); - if (load_defaults("my", client_test_load_default_groups, &argc, &argv)) - exit(1); + load_defaults_or_exit("my", client_test_load_default_groups, &argc, &argv); get_options(&argc, &argv); /* Set main opt_count. */ diff --git a/tests/mysql_client_test.c b/tests/mysql_client_test.c index c367e7ca3..b63bcbaa0 100644 --- a/tests/mysql_client_test.c +++ b/tests/mysql_client_test.c @@ -7095,11 +7095,7 @@ static void test_embedded_start_stop() MY_INIT(argv[0]); /* Load the client defaults from the .cnf file[s]. */ - if (load_defaults("my", client_test_load_default_groups, &argc, &argv)) - { - myerror("load_defaults failed"); - exit(1); - } + load_defaults_or_exit("my", client_test_load_default_groups, &argc, &argv); /* Parse the options (including the ones given from defaults files). */ get_options(&argc, &argv); @@ -7147,12 +7143,7 @@ static void test_embedded_start_stop() MY_INIT(argv[0]); - if (load_defaults("my", client_test_load_default_groups, &argc, &argv)) - { - myerror("load_defaults failed \n "); - exit(1); - } - + load_defaults_or_exit("my", client_test_load_default_groups, &argc, &argv); get_options(&argc, &argv); /* Must start the main embedded server again after the test. */ diff --git a/tests/thread_test.c b/tests/thread_test.c index bf0fb8ea2..38e453e9c 100644 --- a/tests/thread_test.c +++ b/tests/thread_test.c @@ -168,8 +168,8 @@ static void get_options(int argc, char **argv) { int ho_error; - if ((ho_error= load_defaults("my",load_default_groups,&argc,&argv)) || - (ho_error= handle_options(&argc, &argv, my_long_options, get_one_option))) + load_defaults_or_exit("my", load_default_groups, &argc, &argv); + if ((ho_error= handle_options(&argc, &argv, my_long_options, get_one_option))) exit(ho_error); free_defaults(argv); diff --git a/unittest/sql/mf_iocache-t.cc b/unittest/sql/mf_iocache-t.cc index 31f985625..1b04f8eb0 100644 --- a/unittest/sql/mf_iocache-t.cc +++ b/unittest/sql/mf_iocache-t.cc @@ -187,10 +187,76 @@ void mdev9044() close_cached_file(&info); } +/* 2 Reads (with my_b_fill) in cache makes second read to fail */ +void mdev10259() +{ + int res; + uchar buf[200]; + memset(buf, FILL, sizeof(buf)); + + diag("MDEV-10259- mysqld crash with certain statement length and order with" + " Galera and encrypt-tmp-files=1"); + + init_io_cache_encryption(); + + res= open_cached_file(&info, 0, 0, CACHE_SIZE, 0); + ok(res == 0, "open_cached_file" INFO_TAIL); + + res= my_b_write(&info, buf, sizeof(buf)); + ok(res == 0 && info.pos_in_file == 0, "200 write" INFO_TAIL); + + res= my_b_flush_io_cache(&info, 1); + ok(res == 0, "flush" INFO_TAIL); + + ulong saved_pos= my_b_tell(&info); + res= reinit_io_cache(&info, READ_CACHE, 0, 0, 0); + ok(res == 0, "reinit READ_CACHE" INFO_TAIL); + + res= my_b_fill(&info); + ok(res == 200, "fill" INFO_TAIL); + + res= my_b_fill(&info); + ok(res == 0, "fill" INFO_TAIL); + + res= my_b_fill(&info); + ok(res == 0, "fill" INFO_TAIL); + + res= reinit_io_cache(&info, WRITE_CACHE, saved_pos, 0, 0); + ok(res == 0, "reinit WRITE_CACHE" INFO_TAIL); + + res= reinit_io_cache(&info, READ_CACHE, 0, 0, 0); + ok(res == 0, "reinit READ_CACHE" INFO_TAIL); + + ok(200 == my_b_bytes_in_cache(&info),"my_b_bytes_in_cache == 200"); + + res= my_b_fill(&info); + ok(res == 0, "fill" INFO_TAIL); + + res= my_b_fill(&info); + ok(res == 0, "fill" INFO_TAIL); + + res= my_b_fill(&info); + ok(res == 0, "fill" INFO_TAIL); + + res= reinit_io_cache(&info, WRITE_CACHE, saved_pos, 0, 0); + ok(res == 0, "reinit WRITE_CACHE" INFO_TAIL); + + res= reinit_io_cache(&info, READ_CACHE, 0, 0, 0); + ok(res == 0, "reinit READ_CACHE" INFO_TAIL); + + ok(200 == my_b_bytes_in_cache(&info),"my_b_bytes_in_cache == 200"); + + res= my_b_read(&info, buf, sizeof(buf)) || data_bad(buf, sizeof(buf)); + ok(res == 0 && info.pos_in_file == 0, "large read" INFO_TAIL); + + close_cached_file(&info); + +} + int main(int argc __attribute__((unused)),char *argv[]) { MY_INIT(argv[0]); - plan(29); + plan(46); /* temp files with and without encryption */ encrypt_tmp_files= 1; @@ -202,6 +268,10 @@ int main(int argc __attribute__((unused)),char *argv[]) /* regression tests */ mdev9044(); + encrypt_tmp_files= 1; + mdev10259(); + encrypt_tmp_files= 0; + my_end(0); return exit_status(); } -- GitLab

    Jcc zqDMYHVvI``;vs7KO++jY0T<|E(iE@nW?j7V_Z6jz^ql=7C#9;jEqDL~GNuBgY;J@b2jSCKDID__&W; z%QQCs)eAYj3;{mzc9o7OkY^9cw}%z~o|yp>^DEsW)<7>2>8Owq7EB-XUkVWv`hOIn5L0Tz2v_S-%m*<3&&Iy%R(LF(lE^?x zp_sHSKTtB&$mZX8|4MW5nd*9NQyf0#p^tf40KtF@E~M5-csME-SWoO+9A~H>GsY42 z0j;hChU0-sz1S}pKGv;js9aX98z`@dq0hrkjXYC5!Z0GOu#$RUJK#CeG}6<)_pbax z&3_`V4-0INi;=jw{drU~d0^KOdRzPC$B??ua|>56P~rYafgY|D>5477=*-uwV@(#S z0&tmF((z(tU@`A)z3XaTci}utI7brCs0Vp>V_cjrksAZKcik>MJvoS?{OJ0wK~X%v zS&(*QSE9hRc1kXvTwrU>p*%)KZTK?k{z+}__^0+5HZcebVv_Db5N8~bFb}J;Y8p;c z6qdMeHXJ-*Lmpkt{GYfL21Z*8C{lC~kW&;;5M?=V2n-My7#NWMgyi~l|KE)nTGp;s zGC%CBf0(P9ySUl8{_pS=0b7Sv&c!cx1~;Y^AxSD)X?>P z5?8HK!~$pZUnC{O-6~*^n1A6BSz3stb2@@xlg*%y`|or(XKcZ-OJ7S@*Fr6_n-C7} zJH07^!rD;i=_~2K^WlXyK4!qCc?7car)4aSb@Q*Ur(V31l)}6JJ(!;Pr|gOT-pW{V zo+=3P*=$l_wORTU5dPHJ{Cv7QX1W%bC7v3-ERo_>8u?(JLe3Ke-lDS~Uy2%lt7s3F zUkNfOot*DJ2jg*#YMW7I*iEldwEw~f077fj&Ip`A=5P+qpm<3s;LfNCkjy5dcD8=3 z=IJbW7%u>LW}cc3d5Jm;w#Q?7$7pw8Z$)&`H}RkC#s2{I(39Cvd&)qS$MALgVmmV; zk~GPF2D*3AGK(-IqIgFqFnz&45c?}`iX#6a0ZS4-E!0$&JVxBVRd@+bEG8P9mw(oE zee07_!|fs6&AaISH%>sP=9WA;CS1Xo90wXyDqK{`NuFr+tLhsFOsIBIfCIB8=-H0y z1Vc4xqJ|oq>cNE@;?4EM) z#Ki%g&PG`FWzb+Y$+xXddLX+v7*o7q-m;0&V~3$2GIB=%x3>EM1)=GBwo1xF_GvZQ z_3&m4D7hf@TT1y7MNSRv+(tb4(h258Oyvz6G6QIe2+E@T@g&F;fmO06nnA3YYFju2sdfic5q}a-GiTZBT0SKQ=7IkU4Kdm+nKz^ z4kcfIFZS#pVf=mQ9lm3z;D5!<69~2J&es$s-_JPeb}dxfyazuLPuk@8pt-8umAYxi zDg^dtyLh_4ZavL(Q5pP<%Hx>=Y~cR+{CxZ8ez3k7;O?D$lM}zB7#?GXAqx*+#e?Rf z&I$w8#^(No>{8qA6ra+yfbT!*v|8!U8^TuZkK4T`S;2iW1Q3)ljy{x@u{^_c7h^hF zL4FrO7I4DRVo%DBgzqJKp?NtiwAeVvz;9_Skp4ulFB`@hu9JlbEd*HpZ=BZzvGLs^ zE^la0fJ@BzfLhp4X%cKZg23L%A-A7dnm&Sba zw&(dq!Jv~7cJCoMHG7PC#qq7=wu>IjkY&Ds9kgK;;c}4Guv)pR@UZW5*20YQfRjD8 zg>WN(l$=(R<+ld=wi>HvJfPNwz2u@1QB|$+8Sy8bLUcw}34zPjQ~_6hfhCKuHi`yB zZT$Ojn>2_3T*^?g^o-J=1vgdf5S&g}Ef@)zB$dr>rTP#T=C?E6&z~>7C(8+79Pk+e7Y zckk%X)cfUYNn@g=XIfgkSjms~wB+bID|Q-KA=Ssr&u)|_>Tb_ZQa-R=;*&WY?jN0t zTYOdKQxQkDdaL9syFq<@makJky$bx64Azrl5URU{0(9W@8bjHpcG}tinB%8%Tqge0 z!qY6y1=AoAMhtw&d|Cg5NrTA0x|#Xo>(~_Y304`J!|{xQrp5_n-5=eX##rAq`W&eW z-^FsgbEw<)l@NyfXR?u`Uiz=6<-L1YT2xqZW~5z-a~WO^j=-?UME2f4!m#%w5C4oq zROyu8mcz{%C?UtrR8^~sRrUo1Xbk*kO_lTQ`e;3= zRlUGFw|D-64#4VC=ii2HkYsnE@IqF)YmHn`((rN33ud(DeZu*ZW)0ngaTj4|)v#Ag z@z3cYbbjj9!HmUt^6;{OAo0x#e!~xsXmuQ6*uXjpnS#y(@3LF!uM=@-W1=tFmimF} zhoPyv9Zk`+nk&=~#0Gmq!Ruzc1YYpat2_7Rqk}>&Hfc-eFc_{@Qx3EJa0?YhARrXU zz?ih2=5-Nu`yE+Y(<(f|19JY9;iWmeE1$1!d-O~cv+5Kk=O$q)60ZxxgouH5<`i|w zlQ$a7$wU(_nU(gD<@YrD>!RK=0vEB1Z>fci{s!CtC)Jo5s2A0*OgV2oO=sW#p#+<< z59J|AKIi1}9~Z_1$U2nIvNP-rE;8w<*IozsGRZk@j!`z|tIVvLY9;m0f5%z7hH=@1 zk8vY2--h7G@z|%Gd5h!f)lRV@Z3R=!>5 zE7*DRwB6-01<6Z)hYJvso@t0$;$#%C8PxEFn7?1pdR^}{Q==9Z@6HJI`YNR*iRi3%c4}T zi0Xu}o?yf(8GHJe0A3M~6IZNYl71WV28`tXh#A+o4x;|h&YfbUy`195eR@jWAd)QJ6w=5dwqeBZiW5axNXp1wZrX(x?KY)Z zR`SNSq|4)eW0swPxG5W14?=%e1QhtTe*_PhJ+Y*A_FE7Jgg1v2FWF$F^S5E?_cUdOv(v77csG=Y#h&Zs-spK+*P*LC0W)0X9qPr6D&RN|v6fofWmw(-J`f>27 z>=7pX(>sH+7EBN3*LNU|4|rZZ_I0=xC95bmf7Qu|a^}w}cIe~08u!vKN-9;bAmyTt z_~EGg9fKk&7<%CN5wiyr_g>_@wh2NHTM@GYWdzzFFO-WblI$gdo$*xJ?7@8YV786y zF(wc+7aEhMMSXP&2miLOw8Vag#2*E$9{u^p>a(tXyeOmsU-2`*N|VKdi@YJ#CRI@k zZ({MU0BQXmR#eFKSW%Z=V#`jQ5igP$0@8|<;vm}3gMU_=ZVwQ|D9UwWp+H%tJ+MaV z5-xq5U9`hhx`CP6lV*GAcYI{mI@LY2C7c)EvKA%r54g~>$t?b(<>D4Dtqf&tzgHF~9UWI` zgLS49lec-d3+RcCGYvl;?TnB3sROiIii88s8SO+UG=YSaw5hw}Q^2$E=PzW-yGTg2 zNEew|A4z9!J*Nhn!p&!UB`up0Z;00--LwW`9d*rh7A0Z?ps0HJ#a5%j^_&aMAWNUy z1v^OIRG%WtKI9^fJ*;UQSFyrjZkE@y#I`0EGM%I?W2c=LtYm-))CS;b_5nYXZo7CU zoV1`q%m?df=z5|dbTnjUa)2h^bola!*a1HnZG5i~`}|bq;ob0szN3Nhrvt-?_b}v4 zvd^IXLeJ9TVgB9ipgZxYGdIRw9Jq{VT6!IqHw`xV3Ijg+;uqIi3^Tnv@mp^QVn6$s zB>1Pg)hKt|3rR^3T)?0c2hb}D%f+nn)k{y+f6{+s%YtQe9W@!t1YHg-R3|FeeZg1h z0`9rI>>Nq%+*O2={SrZ%Z#CdtMXALI|Zr7?g9p-Ea z9KJ(dl5@v9_VWG~PjQwt!`dkqc|+^eE2(Ruh0PFgt%yJ4WO#(XqeV02)k6EL6R=v`5 z8SITYIRIgG26)M6V8#UPDjO)5lPC34t*AcAdtc51-5eP+8$JI=DU5aCX;65eOs*@0 zyXjuG;Awk}S|&l`VM)4hM|ee~;_oy@`9@UP*s6VJ#)4g%^CGqFBXQ+fjEQ8?&f$KD zSuDlY`(c1=V}Rb}n`WJ6WyV)>_wfQ+5YhTLK75Ki>{l7e`^*#hFY-IL30alA>_V1f>O8C~qY z_LZC%VV}c@zwO9A?QZ?AQX4)MZxw;-&R3uwYfLbx_dF4oU<#8)ge?24e~E zv_NO+MJlu7PpR_+g_nzfe{<+H#vJc0tKc=&e`GKMB2c@hKTubQ^Q4)=+kZ;3C{H0a z!u->S5?zYR_Q>LI@KJo+CR&{lzhQ|&n7T)uRI`%eGn6jKj@x_-7 zd=32MXWgvN)!)X`a)H5@P}QM#FH>w;WwP<2Ay%#o$+BxSUbqQkFZUa$X0d6Q3Rk{= zAH`)jBN^7+fYlkP)g@-NYBD|`>%oTf!f%Ii_|G4II97Kz#;uG${s=`uVz*+@1F^j7 z;&kk2>7^|V^QKdKdPwycb8UI@&sV*_o*%Ny=G(`y<*O%;#toxMG1@|#*u8}&3?i@< zL0g^E6+WJw*~y8|Dydi7yVMI0(=3QLx9CbdBUb4fk~D;_-g*+!r(`uHr8T=D z%pTqZJ42mU9B+wG_;8p&QU`*)fYMk04w#x&o(oU?iFG0Qm9H(Oc8)gnx}->x%g$xm z*!)G&){1kMi~huK3!Oa|v0ckH9#DF_u-bG*(Y2TI=$HJUS36!^2TyIX zX_t^U6rxhg^(@6wSJMIXR~>wc7Ow1C8-#A4KK0&<{D4%t8?xUnyYZs_COpYj>d81* zkeb%0IpYGk#4{$90k0iX{@3i(Ojy01LcmPln5kK#volkD9=lN;xngDO%ImA8!z>6F zOAZ<8(}U{+Hc|dnTYkfYz`2ZSNm2ZEwI*twwNQU;8Cmgm$gILLKcC<_NkwhFrQ(X$ zQ`Fw?yfwRfI*Kg>(WYzwuvi!1w8Fr+2kLiN(YkMsZEGSJjQiqy1hKd1IY%2klTyM6 zs4e)yvu?)QiSo0k)x~*#@_ojno4Sw#<_=m;Kul8J=dq)_jHOiK#arneZ0Njm?;=w- zE=;sfQQ0{6JaMdfPlc#8+{>JKiH;yHtMyHpHmg&7RQ%fbG!V`N9*$_?7cACe6>iy1 zW$C2IUlZms7*yh4C$FEMN(zTnscb}|JjY|0E)oX)G^A-n;W&)D6AL$#oVeYht!(dK zh_a=j#yrw2Lv%pL%Yf$G;$H}Yw%b?Ml;>!lbETaE+lp+}h%vfqmbWL4`#nf#ZfRKQ zNCU8R9Q?CqR$7$+RQCtYj~9@JYc{N~9X!<2k{gbl26fX?htOb4N#$SamF~s(?(yTJ z+xYb38Ncbe48->2S_%!xa#h4df@@Fmfk157UZXtTEmLA7;(Ees?cobTzkm0Of9;_& z@18JDBXMUflj*Ee&s9CRD`98Kk$!Le`Yu+H8}@VcaCIwz;b$8-w*BeGZlz~M7+}9~ zn6atolp6dPUr*9vYs&&1B#@)%=E6D&Ed`SvXsF}lz%W!wNV4we#QM|db(F)CZiPM` zDt?um8T{_G;mCr*TA|n8^d0MJIk1?|Rzz!3nPeD4T?iDzgs+WO(@-Ok>0y-apxmz1 z#>C(GL&0ncBt0)>m>lm&4L#SKDWgn4s}I@!?)CAxfz%?SH$c8}_Ed5YW8BJpp3z=b*SZ&y^sULBc>w?v*wgvPj&S}tjO%tHW8 z-GYJqfv=P@uK|U<$P-)O$~gOY`Clue!lTj&w>o^_(h{OcaQY!9^&*md8K<>S@<ycM5ndHWpdIB=VW;37R&`?(r{l13T3eG`o`z5EVOCNqS)2TZ4E1tjb@Svd zuF?)q$*TJT9r)kJ_sDQ4lG{jA72%p;^jU+Ja37JZIHj^?EbXmtj5r#9-X7-i2j|E> zGn6`TBZdI|>LM|H{)#zfJJOaH6q1Q_U0wBVJKBpj^2EATn7t^m;tc)ZMy#0yK7F&K zx`reGr%-jj%UynR1)aJS9-xq{&r|tY(~ak7Zgtt>UFwQY@W!&j;|{u+=+zDL{Hkq; z&1*F`9SV38~F`b7m; ztYJ~w-9Glvc6DL=`kX9t2%*)!aU|W(lIqBpD4v7TSKj(y*S|#=ZARFe)+`e_WQPI{ zlXIL>Jn)2J4r*Ki5D`&~>M0*KZCBv%G%^o(zlkU^H5!>o=hjsi#+9$-VCmbr+wXBP zut|vw05Yg}OWv)>sA%-hE?i|&9$Oi?oQx!PfkPf|Z-z4U2H~K)I2dr|I9iAxEpbup zq3A{m9hY5_EXsaiK6+Gy*eFU?+cg^FBjE#M|&bxZ6J!_abL-b0W zpZPWcw#i?hnTr1RVuf=R<=arnjcS`%*tLaAKQ~JJY+gt);CBKe!l8$?X~=*FL>^dB z9kHxf(heAwvLGnCiFei_nl!2VPP^J+e*JkBlSLXVw}o4#u&K{3Iba^(^RF8fSSDO_ z%Hpouzf~L3)N84n8bf~3x;I|B7PV4Tsl=0JYZqHt(C&?bFqu+8?=D?Tgs;c4jRn6_ zibbznpv`L)X{aWHFj^soND~85Q1*6W^;b=@WtfyzCA;MSd40#Nf7zLtv26R~>%F=s z)QEhkFB&S(_HTlrYxFX$wZ$rw9;ML-bpy4*hGC<*^m;xuTbR51G0Me_29Cy(Zx>8X zP4L>%8FlR%s7|L2J+Pinz9$5M^9@1fv`cuEQ_jlK1yJul%H#-QQtE)WV#&X8MIfoL z2-j%k(OCIL@r6q>At*Ql<%()WxabX(_A}nHAc_7&g5-#`PO=2|9qC} zdI-uf%t@NiJoq=|Tqijl|29H#zXV;%bNY}__p0@A(6HU(C(983#mC)EX5;Se{Xup2 z1N%tNn=sUJ8rq`ZUQ&Ec$eK97qpX4b$2zoDNx8Aq>qQ^=iP;q}_Bkh*`+*zcyt_gx zbbi$h!=w!P7P2k~sLxPefS4kU77^1%%+LjQVfRn?2&u~2OT<}^HZjQ<_e_Ih#M7fq87&lynSBiKmvSIoTD)PYaeLB`~-WtPX zpp`dPdaVtz2W1z~Iz*XDr+aw&7hYT?ul;&AVC@}BFqJZA3GcFU&Jpm;Aog(EZx$%2A zNqnzJ-dTf`WIZFxLoTVc{y^-@GS3{%4gTL`2KKufW4r^P;*H+=l)G#sNb(s1iW0u% z+h_9Y2PA^GQ>GL=fwf>DL-&E@*|O;za$wbLf)QiFsDkugC$_umo)WWI@#4&E&=;xA zo-c6GoqUk}kBAEx7+{5>X^4>TAy=~+=5Q`2fY)>sg*-Xb2iuaU`+Sa-|0z`EdzBgdi-du*&&*(;5 z=0u=4M4g@!p9!E@qL~KUk4YNU4aBqj=s0wa`KccAFRj!5O<(AEV;G$WD6YkM*x(C0 zK8@I{XmNGi!}KD5-(~<3@$Fnnm3YXs^ohwA*5hR`gX%SwT$4=v(nY=FZ&H zRvXFBobVgZ6z@>IgYGI#vrJxV`IOjx?d<6h=1X^jGQER$ADadWtiIkFd43sPvvWIo zj!rK<+H&_LI?JGR@w~a(ZF4lK&Kyo2K1{m}vYCvRhYzn3V&f2_xe9#*-VR4hufO6C zMy+ocPtm@`YyU7ko^b4*(zXq4>my2Bn{|CNAVjU!?e?GWYxs42%6stqF*KY+3Qa4f z$76;#6)X-YlQ09G>#jfK`sYl3dvFFV6-42m7mWJ?nQKvzR%j@uNM=WSExW?Y&cok- zTvf#^o6LnT4O>9qWpwlJNmE7E+AT`$WJ_xmseh5rW=WoblHf!$>Ca?MgRh9)eWS}p zKB!-G{RRa8NZQ0(M%&LjLv~#1T+}Z9>S_w%0WlV+R|^5YnLfINu;G<-cO~J(1If<@ z@=kkU_elek;q{|A){G%uKegWtduIq1GOi;& zgjU^7;0i$f6u?$jpQrE5cOLgYT*XdRbft)VpZMbe3Y};DlsZ30v@WV-(8RHCN-=ACwrg4jdl zLdS-Vryy7{k+jg_4TU=T80(j6NYm$iF;PmT8#Xtr+ z`xGnR^*?{=S`EIQW!{>YffZV~uL?cE^+)j)55u+8^oIYnXD_FJ-?*;~{}we=fEhhW zlYxd(;u^85DzBQ;?kojHn5m%^hOoZJ3yPHqN5>@)Vj856I6(B+>fwHL)j22cXte@W zebltP9MKXJKU~7#51H@mjvAQASr(LQcv!gHtM$-*z$5trw+)u*nzMf3QNISO%ug8vMHE&>N3OO@3{ zVJaw)P!X$jk!?mikott%=$g|eb19ZUY?#wQc}XpR;&Q!>c2YM_pIQYNDkZe5p{+jv z&riP}9q*9A&avvqL9EwibhLs9Ka7M-<|t<~J*yYBsuTgrr{6bE?q%d0g39$+2nk&# ziqr;i4qG;2*(%t!Y2;Rc0PkTxt-AB#CApHj&FnhKFBn&fX!hib;a6MA)CEOKJ*2i4 zcb3g4mo9W$4#sof+rJB}sz452oE3mymb7XuFxtifb-NrBp9Z1RA^J_vloU^%rG2B# zBbc8mn)c_e&2#g?hbyUJaEIU|Dx~PMcqj$cw1}q~{)rDm%XEwR!%gnI5IaBo?!(#^NETpH0U6B(tF`Ayp-^ivcUV~x1TP57xpH8cj zd($M3ExDP^^zq#Q5c&{*t_F}7Ii^HJ77MT-Cm|jxo*sb-x&6@3FYBTguwepZuH;d}!JVQ1r%I>VK9vSC ztPDtr*_Aqzg}G+zPlbjSVorjur_ntzbql|XQ*y`81s9X58$h18J?Uq_`>P?7UKUIq zGSFmUk(2Rz2ANZOvAM3}Vx+;OpaW2XiEFlFN`(3a4(jX5cE!^|y&84!N2O^($rX#a z`KB_j@TMK8A=KT)H=^=Bi4;asA$Rw~@lM+Ya6amLFNqup%FEnhHQd8W-UA^ z1U3)EkMfV@(~08RbHjQAm4qVRv5=t(__>RKj9$Mu-s?bQ{74^Hwz0*YjiH7=FIoP#lU!baCJEUgpVGp8a)tVt0}EE6-f+y*G=SUs{9um+Pj?s}=>Y z?pXt))*@aobxt8?m!Y5$op6YbSI0yME?_Xm8Sk6~$17!RdYF{Rx-=mgy~+lc?Ga0I zAMtyZnQ8zRry}}@H6t@$b}`;~kvCOBIKYBz-m9|Da5~8}M&cSv>=2P#;Gcy0(<{uv z2{EnKWv_EVOWLi(MrxP#asQY0<&_%{qIX8k&}nc+Yz)4WD|fqVI#0rjCW zQv>l0BSR|%dsn|~aUDTKoNqBTr1+iHd4=9})E*-AAHmwp;sa@lgQOhZqDOUa$vILA z5h86B4Bg?UyFE5yv>UkM0XS39na<{=s#7dQPPB3jUR5UqJ4c^xLt$*{K@b)&^rxCw z!fJiPPfrglHK*1*dw!1SXaXq)?fnZWsdY0(=jSTX=M7Jco;;P2QLY~zsAyV zU9*U*Ct0?`oW!E=M{3O+ML$qW`AAfX9IM+qeqfR*g=Px>N#=6xSM#gbFR1r~D22+{ zbc#i~j&Gz_^1#pHBmp-zmooFFRYQ&V?sdN9;{AN4^)$1BdV6D}{slRpAHg0iQR#WN`vV%r7klROq zsR5_Z@)v=OYY-I#9F#DQi^l2dP$1E~a^1L2?RPu5`_S*khmB}${yqpI=6K&XJ!BYY zr1GP}^7Ic#8d^Vi@oFP*_t(d=$U1hsx6y)-dbCctxDxybACrw%2@sC23&v(Q16pG0 zp=~ppAvlBJR(+PoBWH*?L>M`i;Aw4RByGH>!Icgx&(gT$FsN&Ay?kGx4dj(5a5qtBDVAR@+h0BxUQaB#??ouVe7tEP!Mmtm0!AXEpG z;u#PgAJaV988jplF)a6;E?Cs=edxe(M9I{M&8AIPAHfyyu_&W?krTNLGP3KF3Ia}k zPRZ6rs98fcLo_cHqq1hGk!g6FxQow~1kL~yX(XGW`YC{OdhHa_+AS6L8~WKP(Bub2 zKLUPtO6w&c@C%-?|0euVs%o7;%e5B`H3z=P@_4LOX7k4|-ppKD+QMj=ism;zZF=hU zhVq1iCLpLb@7O@O?fyqqzmECw@AKV;J@QR=mW_}!-_+_NG-5hGoGvn6wcLsE%+k9A zc@GMZpbI)6#+7edstMaC2-LOZ9j={iuSz|Wko3FBjd}8!GGxg%XZQl4>WC7_SuM29 z0tkhHjNIUi#YComVgDd|eSow5KAOVVGA#u?qtkn=-DzM)n*YccnO4J=ds3{c8Y=%OZB?FBgM`}3y!CA{> zK{YyeS+s>-+*yvg)%+%9o7v$Tw0U;Uu;xikwKw-mr4tE5gEVL^rt}qUrs_?fr9B<$ z$9U~F*20hkEQTzCX(f^wT)AV(H5D4#$*%tGjF2QRAda$XB)ogZ+(?*FC0434*K!4!HW%;x!@an~S-WUjLt*I{U((--C7&Tl$58k8 z63E)1-DRxVZlvC|@gqgAKaVhTiES%iz(!!Vr8m8kQe|M7w_4}!Bc55=0b^0b`F#iE zymUd)9{WbP07JK$!H`d#q8+?wDdmU`8sA}Hr;q<9XT#05S-K@Kr9t9&r^l0UEaVSt z6|;Ajq?bDFmb`m}v-YFXbnJpAn#xLaLB}2HiW`fO!`gB0n^7USYq6SpX>mu6NJ4|{ zkV`FWc9#ZSxB5lN;%QUu9Cp%_9_`Wt*Hd_VE9->jFa6nSqw1G<3)qL#tfO+E>wu23m;b)~zWGcrm?!YH_?phn!u(WBXBX68>b#oBiV05Z?4^nQbq5B( zq{cl1wo-h~s7+aZLH~!$oO!X86VbzFXZTG$=q!~Xmz zYIV$yUQ1rdV{EY$U^RU@h%oq?{JcNP>1?iJ7@PVtKM}(!f;a(uE%vt1=KoX9gEaLD z`Wq6SjPbEQ@FmSXKpr-C@b+S*A#I|x-7c#TNB6OYJ*xb(@G!!7P@dDn`gmvzIb68* zAX~iDNBTbS=!er2?t_`vsHmjIBh2+c8N7n z7UEo2`wH)Gj7$wuBh{@k2Du+UFc#U)pe6QUhMouk}Q0tu8kBR>ZV$~9)9 z$Ydyk6V?{k=pRxL+09!q*2=)`B+8P=JGFC;gU_loWXN_8yvH=|>mofA{=qxd|4Ty< z^?bk>KyuiC2g}#09u>TU72Jwkc%Mz0u-rqCV|02E1**M`#UL2iC?TiG5zBl3(zu8MNnF8ITpTQQ>CBtD-B?8^`bWQn?=n#*NXdS55 zDZmQN@)60m1>V5Ak+h5WRi#J5E}um|_xHSE_YTEB-HNpsgdg?Wy+=@Nh7ih=U=hc! zNWbf%C1&AaM9LNIhOx%f(U zLB{PL$o>ERK49f;8|g!jLv=>B8H9>4@a)s%z_UQGlQB%9!$X7T6L9mm^S&eoZFV(F zekid$WGxI90EOM~K{SqypoGw_LUZJxb+L>BSPIl(SMa3Zo*6!K5zsWdx|# z-jj0xGr6HEXM}j`4ZTdQl^{M)^$Hts4=GgX&duWaK(lcfe*MgTi*gWhIu&=W>UF0P z>k}?>Ju4#3xbNSWCC^eUm#dZwrCU2awAXnS8(?V@&^oKoLMGa!Cs%%4xBY8j#?Z_Hu&7 zN@YpswZRmhrQCSM(5*pS(hq1@+1A8K-sty7hsmNNV(z9|kWqWTG>qOspOl~9#1Kyb zOGpqfM$zjg0_ZvgX$k<5O{6B5rrxCimnOlx8@_!wV5PbS$yKLHcemuLEF)E`BxqaC zU*Cv8j0MgcuPH#zjYPBgRkM^?(ckfk zdW)8oAFD;m!W7>zNGMJf=HBzpUDkI6x8rX8m516)*^Pf!a(qB35$G%XL=8fi6Plk- z+{_zq+3m#2M&Di|u)LYn)q2AH!(&1AB>cuD3wN5W^7#TA5=tRQF9lpT?;(|dr3s!Z&()(^%E#`RMbow0uTxP*N%C{( zTmAbGwr2}^o~)`mKfi2bbFW{~wAq0uoJy3^SF>;_?_(WzL~Xu2-#&g6qfKjr(peT* zWfibJtQ#hFWY$AaWsWRio;)$2Jrmo;gKT65iUWjUCqnq&>e3Kcq)R@?wZ)Fdu!*75 zstSDMqxl)tOFTZ~Up6#c7v23V0@9bC&BkEo*0wB|l)a8?{}e1Z&^n6{Wt;G0&Xwe= z2W{qmej}d9a;&}@ z^PiHg%G$oUEO?z@H+>cR$ZvKuqdFQK#T%&Ca(W03G4G8(2p4t$qt?{W0m`nYO1 z8XD*;w-5r`(npkexyinEv*1j1F0xpmM+kQMpW|jxe-lf7Lz3@X9wLG1ltYTbG+>)31bh^eXCa1mm`jEw+EOY?Ft0YHDt-3%c^J zF$jivpQ)acDA#%df5>0viGkzd=%6bu-t3SV^B>NWV*7vq22jBLvX}Y-3ZZg^C60G- zja9n_TzKvXUz-m&=;4%)iQgb5WH(IxBf&GZclsGGI0M}hvDT4NpsGF5MUC_n{Vgxu z#1PL8;=Pg)8MJ8e^Pm|nDR9c-=oz9j0z&Qy~G4zuwVKi5~+YO63y zFj5{6A~`KDAYFd;v`n7Pev~M!)oMB0C}MNSgv5$ekpN;u-txAtsxpc>!X|KvgJp`? zFcOXGR|KHkVAZbaR2getN)RzG?@5|x{w+LxO$fvQ*-z57cUycsuvzKm92*Dp5sg(9 zlD2JR!ESwA>e-c*R-OKpMv0`+{F}bK8UnmzMTsQ;cAP+0TP>Im4gLJJyV`>OlB=>b zFp0CPZC-nhRM!2k?MuJ&eW|{kTJ_6ip;~UnQm(#IVT#$2gmb0W*u2;!xt4?}NXA5} zu#yNBC>4Ly&C|@}&e0>kHDBa{X<%UH{8?EMDpOtK9@W&wrEUX9G$UT{(3#4JDMJ(P zGOa{*>LabG2zVHGpK=J$>;K5@R3EB#-2MHvxY7{Q>Zj8Fs{blFgwT_zEQp%jO87&a z068@wrD48gzT5t(E*e^?bic$HXJohOu1wDz=)Y>-esr69J%PD=Ond)*>@Mz8yw z%s>C<>C(@%q+WjVwyk{tc5{6nMr_bhx~{4fX`9@tJ#kIOw9i(Tm!79w>@U#&RGp(+ zI&Z|^>6=kZ|Eubh1^FKj8Av))C>RpZ(aGH9I}OOufl<-L%-lu9`~Qsu`f%NAxqEuY ztm2)QvC-FvMPj%_giXq~ICp13MK<6=ezCP;CX2zZ9! zKQA;^TTGA)D@EQ`n#-4~y6P~8I2pMMYKb!6DbO*(aIq5Z;xu>N6OWtEnau0*7?tRS zLlKDbogr62-8&B^DoY~2hrQ611ap^gk^^UX&mcIc2{Rq11{muMuTy$|Z0?4>%lNyz zXAyk*>3IA5+=a98>bv*>z5YqaGnoXVQPfR-=CpaL7o$E0zZ7lc#$^iIJ!r5){J~D% zV>Lmx9?h%>xag+s5zh*x<tC$x9uIAvI;WPv+GRez+ zq$7NnojFZ5ZuPiHF1&6dWO0yV>NQZig}K83-6_E~W!`1Rz`nWQ6UgZc=1_KwWuhQr z)ag;fJ6Pa`0JV3Jyt2BSUeM_)(jUhs*)JDw+{AhmwF;Vk*tcbYN)723D?!M3K~p@i z8M(xFvruH8LfSE4KUa)0{{^5Yh{#vV#29Dlq25xvg4UCbf~47a$4LbM#JwtXe!UOc zCBiM2jJSEy>eASm8OS7{w^Bs%|2R`WTs-|DN`MC~v3WllCt~U+z}0_5ZgmB-6Owzz zJ)CEH(tg)o&^@K%@A&%~;#ElZGBHXmKQGIt2-Qm%W*#5-x3RFJ-w4lBd`3d9ex#!* zLjP~$RZ$Dbr@Jb613eR6DNz85AkUTlr6!7yWM$+;)V>RZ%dCiH9|Z+JNl4=?U#k<- zj&x9Qsb(?p-06~_oAevuX^W%uug`Vy57C8R7q}=W>%}=Ccu@OTUEr577n9|l{CHWj zL@#(nfpl5Gumi(Q95wBwgcY+gltD_!%fQcRLMe7it6C%K_9-sKra|$n$!>fX(40|n zhduEo(B9?=aXBH{JTdQ>(4&=L@Yy%sbomKC7QDYs7DdFYHujs}s5h`t?C z@}vX`(ea4E2lL{b8+{lVibV>bz zicD`}7SX`>dI!7fSF96ys)j@uck_@y6jmx67<;$qXP_wk1R)|4E#-ZJVWtODgC4xb z{0Z`8(z&UCGbMGKqAHV-h~f;Rg+7l}5DA)y0AYXt`BNF(D}5p>1p*4^AmlkTDeWx~ z+y!}1fR2d-;D5$7#TzI=9R0E{Kz%}mn|_I(i(mjgf+NFVyaRfwn$SpK%w#n^Nd?gy zf#%7gJ*U9}MvQ7ve_Y_d!Z_7Dy(&!Lmx4toznJglm;KMoYa)hLJRSv-s*$?f64F$z zQ@FU=`9r${z^+)_4hhxp(*l!K!?F`W zH@OptJt_qF^B2wvMna9fdz4MmhsB`xw|QWV5WNYgFzU;oJIT9uo}I;ejEo(y`^1da z(|qitf%u;@8KF6;xWaEHOP|uew3viUQNzJ^V^8eZjkM)zLY-_pt#vi+I$#e1w4TsDox4sN(y@{?QF{^0!1R->BpKVG`w;uJascA+5jEIeQe zN5QpyCWh5kM;-geY*~TfA6tNUqpx7{$e&_oJVfndt4(&LXY=NJMvCK zLR4h3q9P_`L=ILAC6x82ySM)-CR%OhUqj7igH+6^$pJGfj?6;0caVOMJw#ST99*r6 z9Urn79-RxFF{azPqc@@yu> zMDPzFA^%Dss)k8{p|(ffrWN7(d~TH$o<7|gt5$NYOn}vPsR*zdFJz;{q@M=8Pge%QUyPxlazoX z2@zbXDXA6&9u64k@T>`jfFyD=$c$%OUqyIiudIxV|_%2}V1BVn)ZmSNP7-qLh5mG8*_@~C(JBFXv| zBB;A8^19}KFyROnDu*A`*)9Cjl{o;MD4~T%AbSY_hYNXuFja--@zf2wMUuiP*+FI<=S1bg`1?bM)+mD z%;o8KH_t;5cZ2SdU9h%K6Jtx_lA$PvLM9!w^d<6D%weAMK61v=9=OczT4g-M85yD7 zEF*G2xEi*RLzm@jIen)VuJDA+xapN7=`oeKs%q=hnP1A^zzp5oy+f(6=PC=LF}Tq} zV=2o!S%$OM47ahA*NWsQ^B=20V0<8D7XSwAJd3~()QCO|Qdbv9T+0spl3yDOe{7kc zd3;nwGFEeYOWWy)627+^)ua$){-CpMPY6T;r`uAGE<($Q?HO-yt!BoXqywj(_R^9l zIG43JsW_JlX@l3O?Js6vAH2qce)-?CpQzz@$e3+EIM2J$|NdSD0wByK%bt?=j*S)% zx>MxEsIlU{u29pGKG$P64nU$MG2_0+L&SLgm{Hz}W zQYdBio2az0Y-S!PACtC^%&sT2jeq&?XZ*<>nEi)(;<0zd(lLwstr9wnJ`>cFD(DO#{SjJ*J>%?TOCX`UzGNv`zOr=abCp$!E-jZ?NV6FB=G~( z<^95jShA{{i>_PV&$+lr{xdyGz-NU@0B*vv-;L%5e*P{JZ&%X*80J*+S$owR5BSCR?W9$xEtB+oTH%BsUxccV?F$$2K$#bo5$M4X9-gO{XAwqWS`ZaNsOZMLP#8 zEl z_{TrlHQVg=QQGC@plI{5#j)W@9m^sA9~fz{@>Qw-V)JU3f1K%r<`d>p`uf|q1d;Ol z`?cTt-yen!*F76s!1k^$Obl!JHPoC%eeI%fAQnIF$xVxHxaS1KC z?AN}}-8NzMJKg+WZc!&=Q(I$8b9xIGV|(-e>SBj7 z^lJ_FlluZP6M#L*%)0|=r24{^ z8K4)%PyTKt;pdmC80VSG8bv+cW+0CXZXq9r zv7B_M^VeSy4H7YzknfZ*CoD~c$+8u~U7^V$TY@2G=n?GhMek)F$Mq9bEKwFnv-P{c zXkpaC`4&huaR{Mzz8h90BeB2)O4@(9lTpOJC!(7#2MeFp9D+p|WSmle^Fxay&=&*# zwA*aGtB8L5z-G63FkFUWMFB!k^WlHW4|uPi4Xc4*w)~Ol71??IK=|Dk}9ISKNbNZ5dxciHHKgrLv8tN^}=1Wl~#waGS8 zUeStWn`nC z83{KcQT-aPtA?r4-|#vLAg3}XQhNIcC6 zLHb}^3HAT5_0PeTMeP znzd{HIoDj{8RIunf}J`{l*{S?W4!{$>AocRquVwB>6lPB>B0sER02e_M)=nb*EY)-p-8E|iI3I&i0t;-u2E6^M(3k$CjpbBX)Z*R#$Z>{k+bHl5RMlf zc>^D_e1B=->nt_pZR9=ht>imtxTjc6)}>#G(Y^A#qwmg&V%1L(gZz+yXOrn%g zJe(7>i&E+ZaEpG3ZH}=3;Vr3fMo6=41No-;f3-*$!&fgNuFq7)dE_yYFM%b)e<6`E ze|Lil{;?eumEcWEQIB8LY~ifmi9eR?$K$*HUg6*eK9zG!I;1lsc zW0BWp;(vetBP$rWoN*yhs|LWGbE5V6ixGt&-?E^PkDP*`;_0=4ebdG0$?VWr2D4%c z_lHkfG)-M3iOa zVxA5=>wTTWB|72EL-Om;C__q%h?eHjL@6b==uV#(Zv@FMn|4WB(Th4vQDfyp&M^KQ z3Q^1NtfYy9Z9uKun0y!F$>I6I+}j#sJy-0*1>m~=Ap247F=XX=neEIG8%F=_Tr3E5K!^1ON&2$fd4`fouvEG+$D@qJI(ft z$GaGgJkNNcg)dXyiz#|#W9#m=O<38B2(X7X7hFMc!eC%DlFswLvkDk0sx4uHBa*!cv4iPcQ?JDkEN_VABt z7273wi~f}N9f;#6ybwI3UbV>%xC+DX?8L1CTtp!t8RDW<(0KNDZxL?Mo!Qu<0YVQb zN^lt(1rZY&{TNYo4Na@MqHn*n{_#tk#4cl|HZG7QN#j&rfl77VZ?qIAJzzXy z#*tm+YGawwqQ#6DfVGLGtG#_SN#^X+82AE+!?OI1j zhD75>aXQZ>xPqkTV0k7s^Reh@0CGCh#_mc2oQQCQJbD8uGLGC^aEX~_T&#D5H9)&bWtMYocQX$`_^_r z3%aA^3%BcwoPQCCDZeZuh9M#U6_uzcF;3wBCe=?jUa}!iPLij6{Uk^a{0Gb8_u=aY zA)?=OAQHU{X#7Ec9mUYEWtiKdTs%ErU%zPo(Ea{AeGCr>FHJHm0=_{~H8_oYl7{XF9O&1Sw(-eEFpw{ zp%US`cq0Uet!}m$*FNULHjX}!X3jjA>&EI31Am&* zKk(ZdU0*x=T|;Lf0fK_~^@4+I9jm17gqL3+Kp{V*N_Vb+xl=+$`gKBSx+-moGy<7K zXM}J@op#(_*&k+)0eVzlUi+Y;)Ojr0Rkr4Ki=8MD3aw%-p?6O`-wKyGq^8N#&%AIE z5ZOm_R=KK*&XUS0q$7}o%VCTi$hA++Sx!$s5<@dhUfbUd2!CnFyESFkE~3-u)xo+W zYoZqbO`BW(_j;G4L?k%(<*pb=`&Nz-ATche*ttxRLP2Rylsb9K2uAlqF$EWzC=vES z6p}?MGy7?+hTBUT)1o%de7O#u1H!`MKnxOa=3h>$EZ8tsRy8mx%QpU}Yq=uc$ZYQ$ zaVypL6;PiIu=};H1W+TltyI|xrDa4oh5I8*05V=ZE;dJ-49{n0fEhxI(;8niU2OC~ zwJn65ia=RfRQiiz3EEOrDiR&!pdxrf4wa+uR4ui|$T`*F?5I*^JAZeTE-4JXeXhbH zh28=P(JNicpP6hQ_y>0JpvjcRU8(lWwwO|8f~2Cy(VkWx20=XY6LL}Ybn?<jt!m zL{-)SSi_?%N;XKu{l+;e1HY+D z2I||QR4dMv3WujDYZZU^nmO}%nTII{jx{r`&>m~7;_wHDA#UcF*GAe8@QC+55Qd9S zJDXYHJ|;(^P|B^aB^&sKdL&f{l&dZ&UYYR-I1W)^u4PFbV9=Kn-#2I!F5?76k)qUH>8;p7}W!Js(rDde94K{?H*yk zdyC(z{4^gdWRMbJP>zRY+MUBxkp4m{@=n@k6CksQIp3&l({oj%LG@HyP4yUmFN zXen2?1s|X=zQ*6c zK2G_Qg+qi!ag)w62M+eb*-1k4&%S1QMoc6VFM+sIm18UDAN-5z4U}!~5(EivgtI#O z7-qS47;4Sytb>H>2*? zm%76kX18it?_x}eQy74uuc#`iekb~4L=WQCCJ0&Wx>r%utYqOqYII&u@BE{o+F;wI zOm$|^n&^6iNx+tJ7|GbrF&bpHAt^(BVwEq(hgxgiO4iyn9jeEb8R*|vBmN%Se??Et zrzb6~3I5c;loy9U3OxbxrnI+{GLCyvTl^JxC!D9E=)pH|>`Sl7oU{ zZ1&Ifu_94q1M@iGYYvI6G+2@npgvr~(W2Q3#S`G6?Nww)vy6ZvJ+>G^PW(P>P6g3a zL=aie711m5Tj$u4C7&J}qfAUV^l1_E2KF^mzOv#0*`@`9gA4?|LYjE}fi#i=AGj<; zBtjraVwWnv#f5m!)Gx~##j{uR11>a-n@v}ARNRbe6&6ny5BiGs|$Lhw3C za;p!-+C4!Mpon)fuunH&TyHHi;DNRhdm|mrqkBLXg+C5j;V&bHNycEdnrapRMWLcp z6=h}6C{Tc9!Xx~A*Tzx~V5PP#2bS{mA=!p5JJ;qvcTn)ARw9|u#MI+&aAu1o|9!%7 z`hp-_tM<2|WX@tt(v;;{7aNTEwkN+s{?t_Pw{!p6TB#e$=;TM{5U{ItAiMnG+uT9s z!NQ)k#uMN0_W4Hd5=#!jUlGPnYt>o^lbIkiyVwu2N)p(wH^Jsd06D)3gGba(sqGoo zw&yoy!D6M5n&95qwH_)`F|%I><=P-g(i~bq=1%)i8^fS33qIL^qV)O`etNamdCJK0 zEWM}%S_K+Et+g7Ug#B0JA+1aXgn>rjNM}Pmz3+GiHp;7)kjXKu2>oK_VVXXTmID(M@D2 zu!i97**2Peci*R|SbuidqI}>3DV!p6%J!5|3Bn&$JWlJcJY!ICxNe!s<>819nyg@p z!`=`JHl$^$U~0|P{h?eImkp z7!a7>22}dv#BM0}%Bvw8s%kD*uFq2bRp8S@UTty=m>5fal$@y^?sf(bFax%7e84hy z^a}GlsxY8Mv3MPB;Ae>U{}AWX-)TQwV8Ej1PMzFcCqX3pHO8}(VRCrij4#R+$D;e@akKwnEynE}$E_}( zl#Mn9;OV&NW?nDP_8vgwK`r|6N2llrjDKASjnB4_OZyG?nAu1i-$o zV*%-6MG+uy(BjGKJXkE944!!05adct9A{pW&G)8-2=Bqh6`tIPb9MYcyOB)Ge8Df;gk)x*g5Vk_Cv z*~HF6h@{xRo+a+2)Z%E>T3M-`OqG<9Or9ml2}GTYpyvM)t^Zvc7Kg$E0r{!_pLe}9 zN5=nGmC41)^uHq0l`h~Xh>ZHLCpU1(e;U||ihte3`uuM=Ug=c)uqUefkOCU;?>ROc z%|(gvh}NUd9&xEuGVPXy;Z5y)rbw}Z!ISIJFn94a;vF8|>!uEXPSafH^#`-dUB0K= zx{%tIBj0s10QaQL8&}`M(EcWmZX_Ttu>t5Kc7d-oo;8`t=Zd4Xwe|TbXX>^0Opi;L z^Io5W&p2>3=do&l!aisD;xv0xZx>kbi3_dFJ3cN*aDX_V!&ss&ZSyr1EZA6*XE7^} z-Xog#xL`f@E2_)4tEVSK!@pwy>MInqsWYwx;M>&-_xK9}0+7&%LKXfp4qbDx_VI$Oq}2$fodxeaHbMULU_83BQ-bG-d5dS6>d=W8Khk}LYJY%QbaN7qoYTNp1!rE%6 zS7-#lq%A0zDJFL~mWP13H)?b&{v)m$U>}1f4;d6TEpe98huGpOIc%XTn1gzVs19v&U6qV9Zq767 z_6py^aZq$lq1&JL!JDdhWGS>neZaT_eEpFIiCH@eMjMq}dXyNAsPxg@f`mm47_mG< z;azz5I$W&3pC?&*}xU)P~&$~3Z_B-+b*yRtc zR#%6Y=|r)jTIQS2+{erBb+F!eEm8oFL4$%fq@0-UoJ`*shXp2!8;+N5(zh&bkf1wk z;b6lNN_a%cDw)KF{Ck6}uB#u-WIR62d?$28NuNQw#0DJ55A{-9e zAo(7hl<5(BEwJ_x0x|l?_x$%6(~5?mT&eVT)1lB5*Y#id`#fd~#sV+9W&asPf{#En z7l?rUY!Rw@?!{GR!^VcpArSC%VS4|ror6jpvwrQzE3#{+4;o7p&0d>VqjbkWP zNbK=#ivB(7!Z_fzzYkQ1C!o~TBAka>tIUsFT+2eTNs~L11ZaN`ag0s4dawM zj0kZAXI-74?gfuPCrCXx7+tmRbPhN#GCpk{Ei;%RVqo~qg%NSh!7boV5ork9^mPqn zRV^5qt^46e{iB*sJEa{j3q3dy^mv9;3#_<}v(x!fDrIfC^v75_z=9>u=DhrVwq<(4 zRsvXpfA?d7;QY5IAK)y*4T}T=x6hg%%L*u4W8^Ta1Er5buLTKJ5ZdR_5Ii*ajCk!eu zg!>d4z0lJ;V+imC1g2wU^wyLYL``bBaE>j?a;nG#6=AuRN}g{v4RB@C02R77&pU!( zIWHA&s>YO_T2-Fa|FO!EX$~j?Az#O|TL6|o&Elwi1cwY$N#m%fSvd0rrbqjTd@EPY zl(9BOazO^S_8{mKDK;(#VbE##Dp*tjmYGAHxBN|b=5M(S&@+)YY~85zJ)JDXgNMi# z=$GfRTpDCHl?AGX9jaPPX$ zV02pN0~AHZE!wpkX*a$lB73=LM!iwr3Y801phb?&nl0G8jh-o;^QY5!#>dBcl*H*+lspx?@Y~@-R~fU zgDUL+(tN}Utb=hLKhac_q@l$)kjOonisTe(GfX93c&e*~c+@3a0+6Q*Z_rIjAoir@ zRC|{0BU+|g2@XWCkYf2JTLQ;D#u5kLTdEfr{5XAmGHfM@6RhDx* zsnr`yQu(A3bV?9aLQq6c3FE^<5XfaDj_E$cqs|8cxd8;zI>_ZYIHz(w*$1|p505s$ z@Ps8LUemNR&*4al8|SoOG4L7Bk!0+3g?+HXR2)VW6HrkHeP7*ZbtQccA?sZwuWi2Z zo>rNL)tb?q8|zQ@I~Tej^$%+sn2Ovqs9NBBS+Z}XZ89fLU1Yo= z!Vao(UHLMQt*8#qs`2UgMSB`B9dQl-OFf>0kIgE;V1vAuY^%oq~ zHe^mXC!XXv;G#^)^^bBni!|I@iD9t;AqWMBa?A!q+J)qqLAJfVe6#7u5ZztpS+{D` zcM)%vwSNm|={;Ud?G2HcDF`axXJ6Q2=oDMl;P=N{XZzyUcXBh1%ql^4<;)B~U_+2) zT#oPIgntpHHmhEoHBZnQ%}4QeoVRH$n(Q|l4CBt=p>-(B%jxl*;aQ|Zr0@I60f{ok zn1RE&L)`5#DgS!}w(HJus&U&=Obhux;aN!xk-Y&0J z(F!@aKWyD_CVme3OG-$!GT8PuxVVtweN7LHJoiN8PZwrv;o#5(X37Jl3XzmPayPrWxV{E(LHo>~!;jf7QfPM;Jx^>uUvE!qJFVL!RIeXvFA3&COT~9le>k6R zFUB17{+j%?w7lhyHK-=;DqN>c#JNr37Iz;X@m{+8an5}x+176y6PK(!W4!GM1hB>R zTPXRr1mqbEs&oeF$6iKUs2bME9-UV=A#a`dU z3ui$$QBT1pJ#@=VrDgqwiWv^z1A7)i~qORc7=KLP`_>EW4@IjVfEr>ym%l^E(^w-r|6sxt-2e z-yV8s==D?;x1GOhevL0{NUX*K9FIIs`Cbg&HUJyLI}EhkxBUNjgip5j+VMCb_idfY zl}=nB7f~5#fWzdXPh0cl?hMd!BmHm~wehXz*m5HME|k%ZUm)TRVAfE|QWJ6b!vS2^ zvIp!M0VRoe?4+?cMkJ7}kGc$pMesJk(OHlfY7kuI$58N3r^1=l0~Z+WUh-P%1Y<{g zfE)3!l{rmtAOZhXe0bsb83PANdjZ-)_|t_fwj=Un@m&!Wk|;Cn(4Eb;@^vTr`cWC= z@E7c4&^MgcN)dz?Mw|S8qe}|xeGYlEk)wS73`!%rQ_;VILC)-GjG$?b6fj~aIS18v z{<}MEHY)I8UwlXI_FE#g>e-u3*cAh9{(^m9~r7-^a+Bti7Rbsry@D={t9aE4T zGOYEXdTLG<+?bKh3J$`UgtQXagJyZ=Ep#vfNrFfCB*-3#`0(C8HsSosTV6;aK%!Bi zU3Q56Q-p<&0E%nieX0Rd^3};XiA9{ja9~12U}T*Q=}$A+QYG!!FNf{X0X9FD1R3*Q zfey#+n~%x6u0WHY7(5~MPTb65ZJ0&L>W)qiEX*=iZeqb6=HX4xSTZ9<3`D{$&BMP> zb~r&_(3lzhdlJI)B2LWEu5oivfZu=?n{MAUu5l11ch<&+y|q2S)7VEdcS|J}&bDmF z@P{W?<`UXn&7z0AaHomA{r0R*pNFuV^q*3dN>v52x&%4iP;qo&>Em}kXjwF^a zs1s66H0s%154ccpwPxDZood^x$sI4_b-^8{-=%1LyYt;f-L{VbLF4GYQS=MzJ)_g z5;O(%@YqsF3;vAZFlLPoQvgnpa92D!Ekw}1Oq`HHCxs=&A2L&PlG_A>P%q%Mk0+@b zmR3ZgqpV~L+lub_ciUA!>Up(9tqjP|Y{gQJ)0QTjmi8i&JDR}q2&tU(81Vy2d3JD7 zcCrnca>)UR&8MhHu*M-_Mo=)&ZSV3pWd{NBL(AP@X_z*e&g=@Cc4ZZ9lIgU+;vNA! z>0D4puOB~syjThL=tRwmd~Clba)fDMHbzXG^D?*NPF0HoWw0Lr?filim==Kjh`A>@ zKvn~aJ@;V32-`!geNx%d17l8HuKN^(;8uiAzdBq_MSrRX?MVd*&NZjvz#Fx9a(X>k zE@Pl~E!@mKN$1r+O3t4=Sh1*)xFR;&)ll&EHD z@_D>jDw8_Q?B|>We+{N%yMlwW@p;LeI4j&1rzK~=XZ~^G8_C$oZx#O(AV)7B$(uI{ zDWxvYQ*!VyV3w4P+kznJn>Z1?&37=I-eN&yhaDqS77a+hv=zOj2G5xE$0Qk66YW$f zRL@zp?>dLk2-;T5w_4akSJ_;ATGBwtaQwnQsCg`TKq@lU0s_y+@*e`tM zk6wre0=2#uP{f51dNc20^sLfo+h45hZpBl*q@9 zrnYwiyKFKrl8%moa~q=F+6TM!*@5v)pFm3&ovdo93g1) z2?a8Y;b9clytXL$^8X}dWKTFI#XIUqPV+!8eRB+xMNrd1!v5A6U4eg1awt?)4wy-~ zGjEFGtmVwQtBkFs%c{PRAE~aip8s@lboBVz$<}8@yj!K9btxRFg?wshcBi&RxdN;N zsW-*^s=GVaT9nLv+K9e@fv|+ctgpmjz3oXqfiF8~^WgN;#v7Ply~musxISWi^pQW8 z+6&!mpgzS{hh~S8K>MV)bOXv{?q)MpJ` zUy#P(x1E9rgtgu$Fl~IcmjI^zS!Q8O`}imB_=D^H9PvYHFPM1)O$QBJrEjc$@leCdsRTgTz3H-F zEWT!<$EwZrT)`2)q6?7_7Hu;bS((=g2baH|(s)Qox6+KLTNH5M3&J&R{`1Bc9rWX; zbl9IV8mrC~UXux~kfW2+Ca94ccDQq#O^-vuC@6^h%gab;#yw`7FNZ<}9>gR8(Ayy!2>>y zCg{4}MxRfgiUQ1fZ237ZQ=!vjzH(~&n3#F}ogB!9ednlkGz>$>#|?o0tG!D&7D*bM zd5RdIFT!PT&j1rLoTr;NV1tx?+y5qtu(!gfU*-r8vO zP~s~zCeJ#xm4_9JMzrLx|2&o2p)iZwt&ES`cBEX!G|nPttn6f8EQs@nD|v4x0zVT( zP+TvQu-fwHNh=5MfC^}vZm4OBo_MxpYXUktTUb#=4W^`FAd2SV9Aq{vt zBH6k5E0k!@Pfn$|Qz&!WXp#K@E)Yfe>5(u}3I|S4#z!HSQT^)*%h1eQ?l&THj|=63 z={{vk9uW5Yh^0k3Uo~;E;?W3}EVpyPbE4ddDX#F`Lk8L;Z$983lBcZrE$4?brE*k> z+)-B8dTxlbzeY?qv4MJqhe|~U_U(POVx(x7gt5#_y%g@c(O)&zoWInaG$W4`PBNZS z!}HF6Qh5veqK>Yq*o)@V%418RJsYdyM+7IuMTmu!DNKO>x^ln?wlF-r=_rGyaQMgu z5yCH3Vmk|2WHEjjEekl0vCMdCM6L5MT6<{EGmbv;REgT=q_grP*`3(o5359(8(z#l z9G}2p^D;UUTfoFBhH`rR&(BHDBRyC9-)H(z2rb+-0c(kU_wAZdF;&o((+dkCDs+I? zHkJgNoY67Mi`z?|IZNU>SxDwakwthEtpM@l9NH0sb=k?g_~d$SM`~~G#@{|=Npga! zEep|V(&6f9ZslwC~hDw=xlcZr8?lhC#ihc5=guVlT!hKsnaLK=dmB*qTU9mjJ zH`kH208{btazm!X>mFyd^7dQ*>hzI(kOL6VG7pU~VJ6dUm>G>GDY6oirm%h342W&) zF+138s^lrO-X{%I3@019!AYd#;HJjPJy21_5|a~fMd*kPO{n?KX`Vu6IWX{Pz%3W{ zXnz^ffYoAxFs0Ban|RkC>EvhANX`Y;Fgd{%0em3d_D$tw&B;AF)7NB%0OoRLI<1R3 z)3J!C?Vxze`E8(fW$Y%eKB%k8)N1q$0TT1`RCSrLu)JU-{B{|SP2r+aWxi>LM%=rT z^ZSNfD*P3R6d2uhhy72?BILPr^*{-hGx2Gvn9g=vIP#W`$KypYZ2J4-AWhCzXA3aD z0eeL2t-jTCo%f!YWyh4*Vj{!#@rp`ODn~(Xl-oYH129^hG zssDh9XT*ddZk^upZQJLuJDk&joVx9br9~P06^v|8rbIIO9X#M-bsD$wj_f@{VcsJ@ zjhr;2?=x+aPwIxTLQcAIyCWZtk*M>@d7y~#Pw<#BWtp}r8W3xC4bg6&|Ky430O7^X zp)jidvTGcI6|lrL&*HGL@`rqiDq zsj{hd&C2y&enm?qrlc`v_zn*htD1dKH~MOseJHJQq2}~FB(v9`@zT9f;RQQ`Nn zTLfS%pC`!jGiLryX+}qGFpfzt0idN2m$z^QfAO3%@@Fag&%}knOvZ7!Na&yq9M91={v3Sy+&8b$px+eH0o~=4dZUi6+_T1VcoG%{eo#t86zWzaoJU?$ns9fP9 zb=9xZyFkLL*1M?lsvh|7;?K(Mj7PPwQTSK7z1!?(t=@H=SNlK#yZ$x9m^jsaAu)T! zDE)kFLh;TprM|(M#>fANC&fWsYU4iypK0g+E1vux^SP3#p~?S|O0@rL`}~;;9{tP( zjm9DtT%?WkIUMKB*lUN*L-Q#?vKxzBze z@ytPUf9&w~-T!oSmg3_``*nDHa5wY@o$tEwuglYD1E5=4$^Be4jNk|sl_&t=I4HEi z*H!S-g&m7%w*Zw*g#|27yTBY~=&{>}tjz~GG_86(kjKQ@+&sNB&~x%VzdB0yO&C*Es# zn&Yhe4o){A6yELzH(4Xxr;OejNCQf$}%v{cCmgZtV(H3tZXWS=Y+y8yu zrvd|lY}8e+yt5^aY>4Db6d3k9bJTMbHP=}(0ss~bk(ouB{2GX;wb)?uML}RyZb#N6 z>b)8*gQ^Z@ta%vd;7UUl;Slv#rSi#KXhZxMoMY9D`@NnW5NU|ReuW;8i{^aa>ea8$ zK-kRSw$z}>0ZJ3j;|Jg^`@$r3{lWH7DoIB|e>+AsX%%%hsuGUur2kNRV4nd@{gBLa z09LnPd^0!#y(0i9^-8THkx~R=tqsnT**I80*Ml)V(eHb9c&WP>1Fkp5BnXq z9ekgH2EkTK3b?Ui^1R$u_j=D?nKOkV4WmaP-Mp99#FG38f$dB;%pe++^7{-Jgux{< zD((>;sjkH{EJ5f_VNdlmzHGXLV9Ntk065Cl-n#x0amVLV@P%jkx;);lJ3*npgo4C~ z)%N)EU}vDw!LS#j!+pJ_0DO5@Hf?^d{N02rRFmO!50d5BT@S$2kvrvNH0GcdC zIj$j7nPozxx{SLjm`zfddf-0M_))lCRdSIJe_Us?G{)0Amfc1#CajqBbnVkZi;r~{ zYYhQSasuWT*wb<2Qav6EIfP|o1*4= zh=$;BrtH?fk$UaXT(H8zp0PLb0OU6w+?75{%uK{vEy8*VLrrH5{+vpQALMSSxgfvv+}=u>HfhbB{Bdhkm@CWDR=>9@l*4n05Nl8e6+QT z9|&e>*J*^6C$v$6F_!&Q*(pl8)yW3iQLzs8{-Mh1geYo)Jrs1T)THk^n zV$T{ZDgVnUTfR5<)N$u+RUoTo5cpG&SkG`w0fgm;@wy-~U ztvwMV?q)DxBL^XDjV6*#hD#0hA_^u<7xQ}Pab35EZX<$lsC@81)ZXes*%Rm+%JRbk zG#?)85s7{ zumuS_OBN(gKB3>}Xl$z$ItIf@Z_=#t*(_mb{kkNC?e>g{D0$B{`Uyv?{s-7oiA!Xc zHy-=98?O{P$#(#ZLj_+51=*?Cgf~r8Q>eJh47(zk^ijWeg6VHn^e>SO6F5%~>@LAQ zhZlN6C!tkjpLcS=ImLl6s)~cf2i1vg%v)+<^GSFQ|2hprqWIi-+ui4odcJhu$4Uh! z`uwU3zKlO-^XVTck7RjiwW`&HL-qQcS(GeQWugGcJq9>cX8CKE0%!BY+HuX}!V5(n z0YUO}AtN1)X_z~$fm~HBf20BMmx}cl+?koKb(q_6sGtBq{k0nGx>ByTnQi&}c%X?p zZUZORARky4eMO|ef~w!XXRspfU9{YRF$>WM_bt`xZgrrA16@Vf4P;PI+rj$X{gtSN3epv?; z`|y%cuF#bN)VI#Z$*OfD2OgwO4ht4866{9K;+HFwAf;{SP7~AIXH(|fiXo*1-#g1k zxWf!6AmFH{68ZBok`^}A;Ji`Cg-@mw`nf(jQw&G4wG9+Z1)G9b4z!A8sgf>&8nSfo zsIz#FAWYV1gbRAbepSuX_xFN944~U^{u&cJPUckw6nR~d$lz{FCsh9g2kxF$u!bHiaGk|DfGZdc$m}RMwt|kF(p7FL;{nYO*x zd81&|usKwP2s2q5U{WEO(XVI;#2RLg?^(Bq@E$+)MR?OPG|@o>PIl28+q(xU={ zB>kgg(}mtLKp#yGIXW4*q`+d9Ves$;_^;C4*%&OOp@0fZ_-q%HVG5T zCj+i&k9>N1Zg$_4kLjECc*mOC9qHlp1k4|@Ng$}ov;uT1gSF}&dbthwcZ#{N%>Ic0 zKU%^Un>mQX2p+f}*%;&#V`cHCF1yAn%#Wm9bVBISJj@oQB9B#uKhp+P0&kbU|0W+P zvVqwytsHmmk~}q|A>pVDmVoRr&uwo)s-ur=%j9cewD77)j)7VMv#jWH9z-w#V3y+9 z=NbQcSJl$#8V>FJ1{&K^7-Pt?5>^igW5DP^w*?!JQzu9Uf!BZcbR)>w`vtdZ#y$*# zi`{!Ptj7S=rr;gH`I_+iOSA*FMWh5BETY3x)4;;^w`SQ96pVMS-$}ooJ#^aGZ7x8j ziRnr;EdQV>Re(Z^F1;?Yw|VK_=Il3!5~|!C+KS$WnqOiQ=PCi=Z3pVuh3Ge6JM0jS zcCvqOmKBY(SWEIQ|js)o@#ul!_2F7a$FT0=u42F6oNV9 zEdaIxjE1r;I~+>IjL!Fw_)cKSYH(~?aEZ_2s6OS4w&Ouux08=VqI;?NWV*}y++~`6 z^u^`sjC0sHN0*=kb0lY;Utbe||G}0)wD8{LB>LH{$ui5Njo~|EFNg{qc!EJ`0JI|*?k3g4%oZ|2tqj_U-o*!46pij#D6zMG-_Z|QC=$E zDSiVg&asqdSC6~9-wCkSYyW}%C-^iV8arC>Gcw#}{6DAO{}p@!0%8G5Q;>lC-vl8g zQ@fw&<^MB3{67a`JWJ;dw&zX&`1mBteYEKNxZ=iqO)bmy>!_9#_a7N@(1iH#P-4}@ z#46jboflpp9#N%4Q_l6p968Z_4-cU281ci?u*R%~=Np3Qv5)5^vbWp2!+XGfvW4rw ztL@Dq!}Pj&gOUEuHj!;^2QXs$iP8webS-Panjr@VL-d_TRosiq%njC+_5i}iboZWz zUat#HQ`7PA9OBP`*z5qYX+)w60em%-WATcW<=6-|OHrEjGoyX7l&Dd{TGH4jdA< z2Vryf$@5>X0*zK5J|n)hg_kE?r_Vj3htc>gbZV%=d`*Vx#ocg#ov(Lk_Xl>EbK6JC z>!hWHAcv!d0W*dbDVPs>rWumO;In3H{#ggnw{+%tffn5Qtd>T!0O-O=5Cc5;TuL!E zv=1}9bn-a>OzT0S3kXcuR(7P3yb*}a5tJS3Gvr_JCt1#IoV(=IolLzA*R;S%&Cs=7 zM{^oa87R^*s3I#s2r#N=mnasr=+36Rb!RW&tHF$CVYoU1$vOvl9qWb(+Os3^4-qrd zE#}RS<^3zvkdQZ~Ox}RNb_PZw=(G6F_R7HATl#?e++F?ax_rm?vx^@MPk0@~!3B%4>d%gZ3o(5X+<8O1+P^W^=9t4rAY-)vflt75f@6Oe#R z7zD6F0ec&ugoLm+d`XAvTtPqVUIGYtZ7gpsr%xTQp1J`vN2 zmOI6sa9XC=t6NB%1! zwqMqIyUZv8<8jiBK;eM~>O`j$v4LfQB4i!LEA@? z6FLOJ$E*muh^GO(^gv7ZXGwoFjms5x=>cTN+_fQtxhyDH(RX{mx+03vr6F0Edz;}e z7#UkIbbn~k&=MSHhHVtstkLYM87WHAU`c>%8x72m|BVkJu^{=`w5A}7>=YTriZ%*LzJ_oD{y~-y0)T%kdT&@r zn&pV00lFVWeax4pQDK+;^DW^mJ&mm|W*>kl`P!zLtj5mBjQl^3Gz`{;aa!)DnMwob zM0hLn2K$-%xN%ymaxxIj3RMDvDL^EDxZ!rJG7BcBgi%ftIG)SpumtGOb z!Pr>gwr^~2&L+2fi?j50b|EH@n>H3cHbs;66$~8GhVw>*SbZFrEEl$aP?v!}7CpdB z*r8mS*EjYvmJP%#&K~rI7hff~_8~%iSFV=-;oSx(jdmB~Oo_q(JgYB{gV_jEX#t}ysV}i1^SB*~0kjL~^2_YEdgeip#v3`ARMvQI zlOK*-uouldjcMQy>oQ$lZRD0XY8=o8F3iwUTNE9Qh8kA<(1~`55w9_;t={$2#(uhD z07ULxR2wkp&_ge%9$0X5{hDu#j7X#IUl^4^ALC)KF+Jiwfv?J`^bxNR>@+fL+W#2nQHp_#}i* z|1$MKpXRgFb?>4>C~Bg^94q4~V+Z{{7re~;lZ$aZum^dxeZ8qm`meI0%11NmG8-!= z^Ib(}b1S>3LVIWd#6G@r%|M^&+Zk>&Wih}a(FM>S{ao};{shouyPP)Z(zKCk3{Gx4 zf+Vqwo?toNhh{3(IWf+1R@foq;G!;^2xY<1B9%6adeRgHa~6K4OTd;8dI<=5Sss-; z**dhR!-^T-FFj|y^|Dtq2j4tz15M!4{4(^!KrDNa5J5 zokvI|t3Y7@@)R$JKY$l?yN9(kl~3&9ggxCOqa$P98-jz#SAK_!tRTaYy%JJEC7bX$1keoaKA3*;4FMiq z8p0ht1k%l(zMmQRF?pCd`CBOy^u4fHptN(tPZNg+Icbxn1i+^cE&vMkiGw49;VPU_ z;xxi3EhdDhz}_alQ1GE3i)x7ScQ@p#3@C`t$hE-p#H$osR0l@AkNqr0P2f+sdo!@+ zR%6j{Qqa&P{glNZRgSI$hZCy58Y3QE2wGWxCI;(u{t%|MedrVU;XjP>Q9`8kZgw|U zjiuG;NEaC{&RavAjE`6BQy@o@_QZnH?5UCPw=A(kd2*x*73tv+pV=_C7)w z;Tgw?1Bhce{*YnpCm^r4rK3a=h<6qSke}VQ#c7RERaIR_9pyFhv|d^@H=K^;q`E_Tk#N!?H#`pymcQQN1ymNc>sI+8Z;+K|IRa7v_Vl8 z4J*Mj?@HzM{~_$1qAPFOuHV?UZFFqgw(WFmt=P8RvF(oSq|>o&8$0*?Jm22mc;AD4 z@*h>BY8}=ZHLq*d{ILfYPOY$J0BHy5=Cp2YWy@(1PhgY00GSuSlYj=%vI{f>?b9Qs z)G?>c5t9I(ciiymCl0)+Cdg8n8vKnCt*OLU{wU)!Uz?mt8^1sXT*TOPW`%i#=1s*& zMRh~w*Z=0ku}6;a!I=)4Eo)lZG;)$$((k;b+dPoPu}L2&scMq_EyMjs4rLS$7BMZT z^s#4hKFLE2W>?9jcb(Fi1*~m8NSN2u0mJ4tn42Ep=x~NVC1 zrk_50hT}MM;GHIijFYQW_?LyzX)WUsKET#Wa!0MQXn3UX7SnC%rxmL8r&(pjYI%O|)XN_&{r%?h>7HtW;Y@bQ0xinsRq{p)q!p#YVei z(%rU@{UlKjQXJ`4ln4qh*hqZ0i9ljHVApH}w%-)R6hw6L_9~zZ(k?1MB~%PHk?KX{ z=GJIaF7jPqK*fpxJ)#_ftF{dJKNX42gNkwv$p`YAa^Jb#zIc^DD`K%un!5@zkWl!DhJu z_~A5Z9#-D`DEX?IBMq{^MS|Adcbz zr0t&_tLe86$W3)0D*0e2O|5_$OJEd4L3;KCY37Rx#6M;gmUZg|UXQ9D=Uu)&jxWn$ zr%Li?lPs(jGKRyYGxf+sUq@}`SB;~-zs)6o>>d}u4>SJ0q0>eN;2lS{R#v`cnU}N2fJnn zhZacIX2pq%%j2uGD>AjQcAFAw(QWf{syL?VV&)9MEzb{Ds6`A$;%CdKO9TA0JYT*T zGM3I|KX7xaX@Ot#Zq49qv$Y~v>uh7rA7+bZKW=#^=HG+KM7}L0eByq>zqm>fLSgCK z1E~&4(~VUEW`zT8(Rcyz1I6k_RFhBx7|gM79WG3=ZUw|O@F4%MsJ>pCah0_%TspI30yGahUsyUk}d$DJjEB+e9; zjn+^V)lo{;c!0@eZKi0ZRcF5v(Cm9KCi!5FMtgu2#wO8LP`?6n2(Msl(Q0hsKa_@< z&r;r%M)f?16KCj`a2S)^DHEpA>~(dSHHNKZeBvLsUGh{LXsZ;v93#2Y#Lhb3GPB_>RHdeqXeiiusP#>}7;Ow9 z5o=vI*5uflacFI06i(=;>|_Jc`p7YV+5XrBjE)NMU)fAEx*NKE@E^vGI9_s+;-#AO z7A+=Vg$0F`6$SpWOl%m?}ZfnW$5BlSEqLms0zFpbsv>3oB2D+Z$O&W^s)1T zvvPd#{n0wIG0m$@@a++Q{GMHH{dHk5=oicPG7Y=6S)AgHOS6*2o{Wi6^_U$@b=!Ct? zOf*M@sY7s-yXyF*glGd-W;GEhpb`f`QN(`27cVfWv+zhiulZ-|jMkvFB{lpi;nGmn zkBP6LMNHifu&TASy0T0$qM_H&($GPVgQaYaf>tZ_g~!uMe=+-n^`P1K##o3`KiHZ& ze9X6pa)n}J2tjOCt+0VO^+bj0oG!DLC(aJFfL$Ov>pqY5y4k!X+L!t53!e9{I>UX% zS^3SWwaNmPfY!?r*7S?mw?Yc7p}k>McdcJscchaT0PL!xJxZX9gFt15V?^`|Z5l=- z1`cG^-m1ec{4247`}Y*?Pb&@0Xju_j2XVS7@FDc?iUKI@R8-n2AXwX5!4DWAG&?@m zUVwL~E@t5|w3iT;VAS9p<|~`us;y@zOm2kWIM!m}P5$>y5h{BCG`wKScj(9hVVY#6 zSZ1XRfZFLDHv>320|AGTU^nFaSk<}kVwjF_i|i{eh{*cxCdMfLay=6`U;NYo5yQ)7kc{)jG%z?5*kyPd~In1UV)yboV7;=MpO-9i|qJi`EXJ8%*!AF z1WCj}D69M{Y)$Ov;!$J}?K#5s(@O(4sUy%6w;!V~pS6&0X>)o;$G!fVHQ1r~X`jdI zfG%*?Xt)^`dvEi65l=8-Q6y~hROT*6V`U@jt2#*qrtqI|;{hMl&h)B?7nrgVTG1Dx zdUWH(PdP-Uj3_ia!**o2NZH)PQQ(|$xX9NDqj*_Oh!75Evz_Lg1PD{xLK6N9tN2=U zgCOH{FQZL%K>5z1n1!q&NhlY+a0umRfEs;etZosy+};fEWa$>YHo64T%TPH9;O1FW zRy{0WDNnRCezBRk6044yV&1+h1!VX#9&3>0354k2Bz^t?V z6>7YzE{+)F*D zvcQ!Ir||~oCL5=ECns6OrR6_n5Q->UT4bAI{yaQfq+H|y*qa$-6q0UpjjHZxu__Y_=Lo%1uYG6=_Bzd+?^!a=5u za)|?he)l0*ZXsHd>QX!rotqc|DL2}$KHktPeuFd&+eM}ASeuHbGon!xj0UNub(#Gq zitRgy)nvcX*0NF28B6|m@;EZ%IGI<(190x(Ya_qJYgjEH>+j^Gi#gBeZchdgY1W-Jb z%%ZXYky=|Bc%}~|(9vO6)4)yp&Xt1{HC!T%KyVy)bft$Hi22_E)FAZ6b19m$a<@i8 zi(5ndIoXOM4@1l~#>MlI$H0$dVz?j?Dcy=hJ?wns4YXY=!Of7D%(c#VaTkb3@!JnU zL5vWyH{ca`W=*;HRY~uC;)Y#FaHWn+>-8)sgt6SEn`=aYT1i8h=YpJJBrT%mf8TKk za4yn!ril*44+@V0xLeW*kD29z>*6qXb@`+iZYzRSO_@-es%G0sM=SALXIoE(TDgj} zisPtcf@i?rUqlO$&LzNB29KWKC37A{BNRHk5-IR=FAek(iasv+tx^u8(pMJ*Y1_ho z7#A+73mcK`8`1~L*Nl=uQfo)21g162=Q3%kbWpd82Ffo3TzH9%3t?h8@&g7~_IMjc zU8(A>6`zQ`Kq`fy4$1^$e)2>?;9&#U*EDgVV6;y&GW8|`>T0JXWfaxh?@d1Ab!k3e5H3xqW_W+JNr zS*br+xfUpRLNfHa$t*B)ibiM2#t@JBM<-kr;ywhK-cWtwdUP+n1rqZXP=lWmqua^f2UVd zm(eo8@;>P15NX+X^!9_TQEfhdkc0f5$ypblt*RUdoz;xLB4$k3LZ>D$Rx6Th_@S`y z;JqQ}Jhp6DEqOIW`cHt5Hk5*BmrP13ETi6bSfgRKxXc(!i0`Pd4QZUUel>@ieQ~TF zU|wK^wQBp13t8m7sIr*899(Sh9XX>2D_9C*xEum-Zvv0>SSW0xNf8TY@ct}!QgqYk zisO^XQJH`3Owh6qbD5|{f@wEnojLB9NyR!`62QmUIHAz9~dK)P_g*5Gowe)JQSxF4-E1rx<<0b*NU>Vv37 z&&54H%{o#pc>E`&h`Tk$XmB9!PNxHB_TqZl3nOvby>U^m1yZ0;g)*=d!Zu-Sni{ET z1UVNs(_()F4Ato9$lKSheCno(O*9sw_|Xa`BOHHIj$<*>lm{~}Uo=BsNQG1-zJ;)YV7Yq42ned-X;D|++!lKVMV zj(09~8a2@GjQKzpww{DS5oMwZ#h;K-C&|HPj#@b~mcj%`dW&JFocJZIgFbRIFTAm$B4W zrfAklWAMyk)_=3ZO?va@loSh=II};rYEjh|+Oa-c+Ommgc+M4~|B&4~7^0o6FqTDR zPb`PVUXJs;nN{W^#ATxeXq39Gd13@Xj@^eit1UTOHh!bxB6lKkk7{z$GDE9)75B}c zVy+uEF5BCYZd=abMlwkB?_6?=Di>PxaKa)oQ>O=T{o9?BHR<^oF3z{gq|?Op=L-0k0y7W`;BO z?~o9l8!RVRyea%JMC{Jz@Sd;)Sys^pwf<4h-D}MMI3&d66CHN;mjbbl=v{x|Mg~Hb zI9=5jy(kD+Hy~G|UN9V6RORJu{;WSi(6Nc%XEUMqJfpX0@A7lZYC{5~$O0&r7nv$o zBOZZw_rCCGf`U&L&s~OW^49>@G8KVJP{aL=7Ba(u^;92pOSyc*)Ko;v&{)g+SWCme zR1#tfwE{!jWG~)$(gdc5T)~~u&2s}(UAO4kv-|vhC4iMEZ6&DwD9k_6d4a4({*|#t zlcl+Z7(ryD>Vt|Q5^D>dh_oP(j=u;W2v({7n_^z1Wpz`S^V6>~kgB1X4s{4dbM8+O#!$hr=YsZ9gvDG@!yg-LTZz@2xYEiz4W(6-&v@DG<$G&UdP(A< zFu*fM*q5M22I>caNinZt@~WS6*S)j>y%WFp6F_J>?|NzmMyD!Suh`eCLw7~iwU^Fv zTGiu)`6%QRQnS5JF|@%0O(p`6eW{kMpq;HTo}=OQ^T(cBh-Gx)n!_9C= z5e;WWI*E9ctgn`Ix`J1}9udqjpsGj-PG#&vB zN{>4F)#$u(ns$)i-)F3?%B2@d1U~uKIfJ3NXAHnS$IH}KkbLVJ*Tko+!;S>No8RP9 z@x>3#@yxSUGJ)6HPbPA^!$WC&SBzR}qcsZim*^G-gS1u`mDx>U@=%m=G0*o{!K{Da z&H1e`ne5do=Sn)^mO($Q!9!1aqgIAmMpku9C7Gu@kvIb$`_`=F-M99F<3Hrhtz8Sg ze`*RJZvUgEkd_Yt{=bU~YR+a(|HG_+_o1>jeCz)Cote3iiLC=7%MY{cYbYrK=|JGN zdSc4_owzM7Z90}RjrBYA>*HcGhu@c(oe)_fbFU}VxZYe zGM*se}Jr=5@2i&IW8@JT1?EiL@$l1#%5U_t)wVEU2PY4I$nI%Z14 z$sc(ynaC6V@o2Eq7CVP=n{GSi({>Whc%n14Zv`C_?Fwb>m(rxineUg}9^3pN-(}Zfzm`EMTmtwyqZ5|Vt-Y^+I88!~PS+(OenKube~7bB=8nt+{j zemS;_X~smz$*fXncXWCWrTXw_+48C!x7V;-3_E!GoFe$AZU-BP0KwF#!7dD7Gya>u ziDAp)2vLH`d0xR&^>I7|FW66lREiNtaX#WYZ=Em zO*q87yHh`4n^x>%#FUsXA2Q7f;PmFhdto{XP?IoTCa&3|bEaZCc79g;);YCD{nEdJ z0g{I-e44;y$YgNi$MP8{!+q;fkSC|uGx3GZYR!M)4CjKkP4#}n$@@9Lf~3J?%=;t@ zFX+1ofc{_%6pG$ojgKpI$mEx#Jg+|0#Tk$3h@;G}*`A1her+%~`Ld7v%wx}tPX)j2IH-;MoFPDSrgZeFL_vfc)p37Fe-xEI9+Si5Q z7q2G`I?gxysMHaz0W)^ym^@s!P#3rxZ+0{o@Hn`P1Z_G;V){NLBlL@#Z-jy+jOY)k zCFFhDW(XSnqLL!wPnOsuS;t%o=VLJ@NcrRNtY_$-Kn}Y@yyV+-_@bHN(TA!(MUbv# z;^c5|Oj!%(CPhWen>s7B62areu9=#D`xE~F?oO%(Psg)@WIbiv+Tyk7?M7f{=$#}T z2B59->#ENt$bYks!dEPBaQPhsg$PQjIr?Cu=JR`MiQ;ZPDTvZu_8^wg!0#~ZoQakO z8Ke>LgHioJ5NtqDgTcpe%W&yT>KR}JU8KGi3FU%}^p{5j0wO8?j)t<1A_|}>@dq7=uaNC25L3fJfb9oN zm>6JQ*8VynxAYci>iK(@{c1+|Z5N8d)b+n}In*l5iWU0&%%V##vSYV|7GV0C`RYg8 zH|V|DG4X^D?|*LdV<}6=9v1x_0BEo# zwjPi&l$j|Z<@S}{(=r6yikun>Fk#;dmrsCcfJD0NvvgHrOEdpeEQ*RL84Ik&EWwYZn+aTT3B^1dg=Gw1Mn}^dG<3zcxi%#w(tC zt4hpM<%RNUivo0K)5Y)CIMOaiWZf9HrV)yi7ITL*DXkSb>R&R(qHYjPfJ$E`HJ!&_ z54b+h-D;s;hh~LdmB6fs%&YYA18 zraRFAInJhMTL)qGyoVZm6UN4pD#V64%e>LD=;Xq)lsJyncEM>{02K%t=X7voc8+$D z(QH0|on2+p6_jXe0e?UhQO~!Pd?CDDQ2>~#gipdE?6sIu%KLVsk*wUgVe2em;Nz3u zO3h3vy{mCF-5JTZDMnn!1_hO5qk1qHMu-BZ(YV-6Ww-LY&7xgL+u|3y$Sk@FLwvD0 z$qx9BDBc9ZH2UaOfGdbx+!T^A)$9+}@_uf{vlI`*xq3=%x^=ULj-Z*z)Qq8-1K+U3 zPXG56(EdW=kV!lrND?OGh&g!%xrkcJU`&JVh`lf{VCPK=_Sa-u_(aN22!591zU33;SfQR-@9GhhD@TD;)0H8?cmxaGT8c|0r8HGi$sg*j?>x>L$pJZPFF!|J*a;5AvYQF&jBNCypF zDe^Nx0)+Ax2^IDKHr%Js)XUK6}lL7V774!+vx&8r@m zCvkRVFYdjz#nf8~wguf#RY^%t8wT?^4JLJQG2SvCE&N6Q)?I7d6UX?bNd$VfE*Y#4 z)TS=1uE42F>4^p%=FF_LYSh?Pq!iIK__$F%2mmqn``b}?(Vo8lexFvru_Zw2R)I{J zlljXHGux-P#9vR{UoNLut3M^V%gyL5Uravk)xI;#+3(S=rlrfb=%K+$XFmYn)-k@p zUTx^**LubB?|s~p8nN=>Y9IR=#ovKvQ?6)5w%A<$AfKujjX9G!%kZVm)em}AIv6vc z`vCZP`q5?moan!j;xEU2)uWnNab10Z9!w-$@c8z}OxUs8*!bvSXxs9~chZQt6=}-GPJ#Lko4Z<_es&9ljAymlI$F%$#`%B~R0KFE`x0*qYi z({Vl2R?)G*jsC*^vu`;Co%qy5umU&F6MnsX4Gr zu|tknyikb_h;jVNiDbk>8$3S+0byml>}pof4X;LEyEH_TPG;6dv$2IW4oHK<5-E|n z#9p#Gmo(jN&blq(HAgLk5O8EBR)AM9phOKo-Rq$9;}Mu@gOdIhdRa0SLHc9?WZLGJ zy0HPsU2k!LtEjR%F@1oi;r#WeDWs_v`aDWHBn3TGJ4bf4aC-1Fjj2#(54Rc6eed8+ z-3V!Pv_}5FyGs`LD&s>wenUtZ3NaASY6%X~OUjVuM5^FL$vE83D)|6fQFQAe+&vbz z1o+#pzFVT)r^7JWyko!cJOWQ1o3q9273l^j-F1Es!C%}i_UnPsYB;u=9N*>bt|8jo z(uKgyxunEOG&0n_sr_lLklt&hwc$&tYa*}GK_hOWL>Oi*By9$}y3P#PAHI`7*jGKz z-VcYEFOz4_;WbUBFrx;nJDsF{CJ*S*PX~(WjH8X6KRzBFcdEP}z&dZ$32K;me)d%) z7-wK$C6@~F_My_=CV+Kb^c7v421%qGOjhMB!0nYbU1VSFnx$I|v|i9(U+N4S8oL6(S!3Lx*wk>%dqtD7_p;YzrRgmq=^Zwoq&{{%^g8OSX+LRe&ne@R({?u)CRNe(reUmB zF!}>ReVA%A^*R@zeog33q7#wK-lavKj7#Q~5m%^6x?@BWJC^nF+`oVhiCu-|%eA&y z3u~J|g%2AL%EOiH6JkSM`AL-W=`9@*2?^2kUF()dv#mdV|L&((#b3Rj&0zA<#Hl}Q zP6y?tm3zz_<(l;8nhIK!Z@|g@w3yS`%4}^r+IpSVf8{@ZeA`&q_1<;1_eB(*9!Pk+)4ZMA=!yU3 zuzn}eK(pEX5 zK99Lck_#!$Ai-0=|7)tNlM&Luflrf-R?^sDwr!RXYh8y%>O|OQ>_M2(q-+?ExXsV6 zPOlu@x-oKmM&()&&{$%AcnG;5aL#_SMI}&xIdBw}1;UBkn1z=}&MZZ<++EDd^Zn@` zZfMYX*O7fpocL;u;+wroz+>e`&fopw1#+F3slQHv#Q#WF*T<3NPAePufxu8a!A5@#9Eiy&vH-~SRYp=M)5#H+-)lW=O@^;^84O^KDLPTEmmXx2d#7F zVfg+4WwCtx5eP@pC3~C_tFf>7f|6s5B=#7D|7cg_8RP$>U3dSZT`wvzzqPB}Nyzj) ze=z;}zuHx9%wQK9pr7|&?F#;nc5T_H{n#FI{a3qE#0{T^xz5`rz8(U+An*XB|Iw~D zNQ8^RX`7fP3_{+msh`mQYS)C^C%dTz#ZWs-QA5a$*$AnmcQX%o6Zgh?Baf`-r;S{! zUMq$Bp6{x_+rcGd5JxopUhmUbdoU}%ovqOw25TM!Q)$2yv#))fJ>;t(??w2HY+k1S z>pRu`02Bq&J)n`ev(O>Y<-~%Nc)~(&b>PQGRY%!W0Mo{#zYi?j#Hb(=MO>`=!YerE zT7uK|(BO?Rn3E!T=?*6e9}#HF(E2~X-ZB3oYmSFFmkvk`y?H;Gjtdzl$Lq75zLd)p z7&xf#iv>;yEm#T6dk9fkS`|TiFIMIPJzPwZ0J_XDKy+<4m}8h zzL=^&K9D<^eUH~GqLDSjmm!kNp)k6wzSauVpCx`X*gwh?#R^3^6O|2KDBqr!y?kVE zCth3y6+Ugwy3$+jEN43oy;cwvOf5wo(c#bB1liXiJ0t1jNUGIp_1$~I|wm~aU%G1mh#I2=O%F^ zg^;Jr1#Qy>`fw3&F3?DS#CHxC#gb$x>*&)K;7G|2@|3*r$w7db21Ge;9c*3| zmy=uCh%~jhH)g-S01d#st-?ZV)8%NTCex1)0lwr8tLkmp{?)8;UwtV1TmE|kBfBu+ z=d2QY|7uq3$A&#ew^J2w!514Un7^Sl~P#rHo19M@L zK8^zDTN0r%2n9&Xi(e`**JnHALMbByia{PcTXtd=qPnShBYu z^#C3+=4TSP4uc#Io^~#HCD$q9WC5n(Y#k+4+mte+p{^Vup?s%{12Ap^%5A}oW88Y? ze4{}xzlbW3Ul3t~A6C6~myjJGV7U_;!qhE~dwL9Bun2z0-!VtkWifj1u|4v0+TR4u z{fF5$#EFW4Ir+D*o{NL@U(M>$(DbinoizIAsOZx+VcZir_E<&TmfY4>0dSv!y=m`g z)k430^}$l|Gcd0Errm@_!I4aAC~{IVJL&OFscwT@jE z7e1&r&IG4cBmlC7rVevA+C_*mT)L=HpD!&3ci4hTsk%_tEPrk7V#i7_`%l}uGP&;y z1kypQ54V`iGN`>f{Vmj@mJt!gKk}8_fw_B>LOa6vh+Wv)U3`$6IdCndO4e*AFrfS& z`8qV+N^n>CI$wvytP-v@!j4F)0v?I<6d}G|>AeFmD@+a?XEl#ao}#-PX4QCL2ACfhuSp5t1GI_MW+s1n}m!aV1kx7Z4gYUw<|D5kFn5hpd8u=$UjAG80r7r#5tgjHT+$<8qPNQ= zQnv}fSTPHhNsvVxtdy^3sT|^JxMVYDG?(x#U+L(yE;cR9C-!$sjmrzR{}6>tzaWSj zlb{r(@MfYIY(mYH_9SnaQ~z#IR?m&+l+A=qAuPFr$x1#|vT7uacVr#dci~KAN4b4e z=|1(qbdw=_neMN71}e&?MQTT1zoA1YsO1N2>6o1%4$NAxYPw#b;|R_9U;T_1<7y;P z=|T4MALJCCP-wYdi98K@(FZaGE0kmC>nyBe~QTApxbN`09d}WCKhs zjH5Ep!Od9T8fc&{hG)~K8JV6D5sf)Pxl>aj`PV@uT4R{(N{wMH1~C>8O3A6M-DU%{ zhlCl4XVks^-1Nd|1ZRq`>UMYi8iysC<&xctk(x5)cq* zd+kQ*qYL7V=#d6pTJfsvtlkx5N-TrI0ZIPJyWMx%oNGE7%7;-73~>^IJg6*J1gwO3 z_ksMaU*jrU4tN-sFs^26OE4{DhcW=B)j9mz}XQDSM~j0YK0gmc|q3V)^C*k551 z>r!AdDAuZVn(bW`Qqu|@SF0l|?B;ANDw8%c^wE=;gez_Pl+>%}u8QsPQph3ro09YG z{V#b9JQ*UBMsMm|sE1p#=n)_Z@2rjW2&^ zU8-w6OtXyNuHoiUWsVI#*v4~jlUnw1!U%ShtcwMqK8j_ex=c(qr#4QBPA6WW9*(cb z9djvIxr=S8bqq;~mppOtNM?VfBLyM)xDD+x9b-Lw5H#1SI3hu%rbX;_O~8mF`-yYk zA`kl%4susFxc-n#6$B79q+r7-a1Ga8;U0L>^QBu~DUJX+X@9_zSy+2&!JoAfE>$c*{;u-S!ap!Bpa>%W!#x zqACp+Cu_bHBylzKYq`{jAfpL*Z`a=hd!BWYG$}N16E8rPK?IN)>S;P381MaY!W=9W zUMq}I%sQb0As8o%hp6Ug488i#X7&OCgHSrWFE&XKSZQ6lmHbG2Iq{hR=UCQK@e%xTkneMI>p<%0 zM5=I<1kLwKTj#Uea_@MHBG!>Hus=v>)6LMa{>S-U`7Owumt@8$2f2~>b@8ZucM8>g zx59Q#V@IVXow_7N2OK2%d~?8d^Y@(&5V`97aqYgBmo|N4tT0<4U>2mjHevAzwPOS)2LWvQYp1NoxJiB(L_TfWewyPs<0r!J7O)t^M6$ zOX1hc?c?3SMOaUlUP?x?nF6;b%|xgww`nz6d+TD|Dns0 zc831%o}z}6)&KG->v${dedi_v_(Mi$r!XQYLYOCi%<7}V@SNXvAh|W;#KdQ{$)&QM zP}s>d4}6CKEl)RE6PJ{YpsXEb=UwdG)lJR4T|PuS98FQb*y`!WXT9x3-JuGf zmApvY4FXs@)iu=4v19O!#puHMc0z#fA z7^B;Fpu$?V@VjgOj-lsm)&Wy~140aOcN-073we7neptlXJ;Ne;41&2!+KYc0qaFsc zmtSBBV8?`ge9)sn3_6YMYhc80_|8ASdPa z6#50P1sAJV!c~kbYcbH@r6dQ#2HmvKoaZ`Pr%wflDR!XqTED`1`)VbipgZKP2NnZp z7{v^HPI}X*z@p7;(8rO8)(=euj7z}#^1H`%NF>BY3H}ykTBN_<#^%tj9u+^LaUV$5 z(dlDdO$1rDrsyPwRt`q5k0Z)=l}*_4R$fgFO@5(bKc}S5$F810o&2f;1`yoqq1g^G zgkqVR^*|(RfNwwli4JiuKh=eaIueyI+V{W#JA!-y9GxyPoDdNcpb(4q*OAt9H0Muy z^XLP1eU1I7+R@YA^iSnVby`NEmYH3wCR#kbdT1)O1|JailloEr+rdO6G1CSTv-jg) z#nyfA{$k>>LLJKac*_c10f2cT-H_Zo$(EJh9IEAwt4^Gp$NkLk%wZ9#jeIVl`FX1b3hGsIN92HH1NkMLtg{YTr zJgs=*S71?T4j9NsnbqL6unxr=4$oA(?3s5Rh@|<{omM9@_w(k98GtLBap!lxh|z=3 zG6Z#z1)tCvya=wxsLTPc9Zg+-4jd6kBjH<$WAHT%+b9@^k%IaODdX4h3F9=60J>z5 z84^X3athDg!W&hE{ymlkOXS7Y$wJ{3qjJ8?b?RtMPBulQxw3g#GIBzGG_9U6FKzaY zXG;ojBOoFL-P8}=XMmqNMrwWp{M;!2Oxz*^el+#D1Ot}8x65HzaRpDZ&zpGaeSHOo zB{X5%*VFF;*i(+{=iBCW&_bG+IZihl1FEh8-OYeXF8BW?0+kMz<_XN#>M$gY=Nk3i z@z5n(BKP z^5!A#v2VoWJA?ZPHPmQZR-ct!RM0 zA-_<(6Yw{Ud$IG|NWkg50%VuOe`li4gpC&oixOhkLhEVK-_U>q4{EBpt>5?PS*cD# zUmdjgVotuARbk-y?L3xxQa{kZz!uIH#K!01W03`+xFZPtx`#gAWerzOWp-3Z#TB5%tKSNM+H0eHBS;X||k#DsrDFEc5So2L8SV?WO# zx&BpgY0e}o>orQE_!q-B9yp{4`{p~b9_F=D@xdf^rf?c*1{kpS){s7eNR#L>J11u* z(75zKbY4Vsu|#w`8Dkvc@k_WCW>YBqFmOS$yDiS*Nd70VNBM!i0YjcT>^Mr1y6Ml+ zeZY{vrPF>RwstmwM~Vb?$=+%_?2T)%5Y~0Fyx7$X8ik%fUEA+6gh@ovU|5>QWmR(QP=rNGodXaVRZ9dAObqEF=MKLXxphWa zg=?~9iD{znt)N8bOoJHA2Vj@>um(+{9fH8|u16rthulmFj+^2b*==+rO5Wv8nE~-~ zBeWFAaU(qq4C%1k4N-pbtmdP?!FO1Rjs_B#$+2!vntkJw?xnx}V8f9hoS?P}j|Tbv z*ehn!TXE7aYgyZGZj05LtjrlctD9V?rT8KP(?Q|P5-c;VCxO9^v*TrgU8xEZH;?hz za45|j;pSw#U4;@2=;MZB#9x6D3IOz3Lv^el+1Qvzc!-TDajt5TVlrysOQk_C1vU2o z$8up*7RA4I0SA+OoZfP1!aDC)N(lrJHKTIkmYcA}H9M?3gQN7b` zHEr{WH#`HTjvBK{=BQjcNC18GWO3X&25j)O`(5--p4PrSmx-Nk6BE-HdF?nkgEjrU za=jBgFn5s3b}C1=qE}vm(yN0>cDySxnusso?UN1vM13qFl#N38QTO(%xb!^_54$bZ zEynDY_fRkTcCjeoMc@PWzB@wM_xqbu_5e}PPt;Ga8d^z(0b2?cJpf-;n*jxmRgE5Z zk7~?nJIk_ZAnf>+{-7Oa^@Sb2bd~|yGKpCo(A6GcYl0u6PyJQaibdRbIpXWUkT)^b{sufz|o~+7^H{6dvV>=D#}`9MwX0 zJ`qD{{OgFq=|?h5h7)i~%&RhJZ42+79K4VDZfB|b(R-ke0%)G?#E-@+YkSSCr(i#D zUoE!`;*gSLpPl$N?~K*HP8ib9s0o$wtk7$L{L84oT==Gsp^c3+4mWS;?f1u;AA@DI zLMiKpz1^pjz={BuW!2OgMw^?~+alqXX8QJ%Zj*CNA8I9QR6iln79U~;9>X$D#&iM0 z(P_-sTKcos1`jeO_ug695U8+}rxevc<{GK2aaTSzQjWfzZTD`D)HZM5pAWBpCnp!X z^J_!DTBBrY+uM>uxW4k-(^x-S&t&ZXrX7M_wU4s2(ez2)MpXn0S-_Qivf#XgiC?&X z0sr&BPiBCFZ0|cx$c^nk_vY^*6cEr^G-z5xGdMnmv)Mnm5ql>FMHx^qG$1G_sDIZe z@xSRL|L>ZJ{Z9vb=kI&9ikXv}nUl(YfAb$G$^QpfR|)thY18w*p6oH6`y`V%!r8(frdu$&uvs#9K;$-i%X9Yh6EUp&a{K9y^w!A1 zOL$tKhldMriBfsO`L%J$J-xH7=zhLjEyo;gMb)<%bm3znXDLfsfAZl)y^8N z1+cPeYu7zI214LR&IG%f8h_^xoyTN_3_XuStVc|@J7T-oV!Jj6XeekoRZnWE=4U5W z*%|hsxzknD-LOVR?)22J`12{End5s0goo$MI53*EHCPuk@(*HtkLyLpcL0$vK^&JZteVO-uxplMbh7?oIu-{m*yd~NK@Q-27F6r>lD;7^c1!o|4B_FyG+K&mgdtpV> zoBHgm`P@E!<^h*3HmSY#FCL`pN#Zb={9GKb(CWT@RBP47)KcgW$IaFmADiHO!Kv@Z z>7VcJkwU7i7VeS|QoM?smG9W@54nx>G2Ofje+WPWE_huF zdwt?n>Sbh6WfSd--7jNsTfwm96dw+~#gsaxpml%a@21Cz5Y{gPKEIV0bhnmT*8tdE z#{f}+%tPMHAyX)0D2%l?1Oy0vE+^I-w_Dz6wz?p2Cj>;MVU!27gB-R=N zHW+j)Xdd2D6E6y8)`D@_f(%$>S7is4phBE&=M5`avRo>+4XX4t>H689ZWZi-en8W5 zjrRL`*As{zRb#8F3JBJs&6+1+Fu>6I1o}|N4!to+NBe)+ddrwd+OAz2cV}>ScXxMp zhr!)pa2j`a9o*evaCf%>26rFa;p_W;-Z$UgPj*tN?&|(kNhNiyYaQ!2DZxQ+hYmaH z;AdBHZD398L#%wd+tqsUzqjxDAMRq~m$tQ2XiPSY34J9{*jDQzlI~(*zP}J@2Yq6B z`o8KLg3jkYx>3H5P{H>M>OA(};QOpVHT>XgYuj$#dcU7|?eb@<(8U=M?G0=IXsWVH zHqB|^E|jD3UY3{;{xS-R@a9%zfa+F0qwG%&AR&N6$iq#WpL!4=wNuwU#E`X#_KRYm z#qc!q4HE_p=S9kk(c9pJZ!=tTV0Uf@uR4tzc?=21=DwhT?Kz~tX0tBEx;_Hu6$}m@ zgLqkb?UL$QTkp*4=Mggl@fYg>m=;l6AU25f1lF&@<0bIS`KqYz@N*9jou_4!V5sE?UxU{Abb4 zFp_-+xc#)}RKKd3sIwyGk6$~SbfPZxaVP#sO8&DtDzB@6OkVsjCx8$Tdi9NkU zed=GUucZKySsgx--)Daw4af2=Dgqa}39hI~y3RS!c=HVAsSg7((8gjf8i}}cyPFF7H?g7m2i`hb7hPkk zMyaV-J`dsve!mqA(s32s;k;c+>{c9ejA+`zDU49wb#bc(H;nyv9) zgt?K$ny(bTZCA{t2lGT4@(2{pnUu#2ZA4L~@_R@QBD5eVl3>YpmD}**A+LTujFFx;K<#4}h{36~b=ztY7Bh@FxHt0A#bpIY| zC_4^5ENeqzP)Nzu=4y0q6ZDmhYid*EV5~ep z$AdsdVQmPSt5hb)ZYy;89N}pN%F^^9_dlkNnECmqZAjW z2X_`}4x^d{g!YP*5~mW*N>2^ZD<|)vNBEBy;fw^asxpw^NBuNBRbYmOBU1|Mawf_?jZG0q$;TTO$l6T7nX=;c3W`l#u}mbQ^JMwl$cg%d;9MlbqxlON6N) zY*pE}^o`dOXNWQmH)!_Ok%=-EQMrB zr{!Lz%E1y+fP%vo3zsUebWide!1o#ec1ElyKBhJy1z^4+oQf*eN7=dOgNo$Camugx z7DlH5OZt1w)G13w4a;;lR~M%Jh18{6TlCW%6dClBG=@uVm4$5r$^7*y)>(1^Sp5?A z+WT?&(M{Y`GN)IH3DNY`NVm%K#>7wll<>7Xkt9!t+E>=0XrY1)NLitldZ8l~m?VG0 zF5oDaG(M|g7`xTe@y&54P-r2_>|MOspXc}h`T?7KBLOYx~ zFl5Uwv|ASf+TG%f^T|DMn!u6{pel7*tMP%ASY?gQ&n~+6lgfscp755_ymPpOS<`&ZYAh*G7odm?w%SV40c;c*Hnu!N)T_NLeia zeOPXQlxG|MVV`-JJcbYA%wg*urbJr|Kj^OkO`B@Aatn~kdfPMgpA$u=D$_PEmk!M6 zjl@FFoC>O^6AtS$68>~o$E3m4eY=eJ40iy72+jWPev9}F?%MAKTR@@o8%+9=9hR>7^6dua9*t5v0RgJUnH`X59M&Bke2!xpy z?*JM5z1P#NJU<{`pYHggN7UQ|B5{jl$(Gh^Lq$_75=D&^@mLs_#6l53-s*35>0wlt z^@Rxw9FM7{-l6zMo{~%ecl%)Oo70dqmn=Bn_d{mJ6HqxbCprwyNzqr6nZyN@A<~zd z2p5|8WqFk4Qegg!q1-<{{$Z)*C+u=ScA?u+5I z(YSr5@h<3i^W?iW`?B=_6})AAgB1YZdyFTkDw#a78t=CHu_eq3;3s^hAfJAC5hy-> zN@#4Dy(TG90-gkV!|&e-7w&wdfft*10>$)TuV20x<6~d%oC|jw(#Rj2ss=8~seR-x zavGv0tZ1X}LilIB^rzJy|0-9`-{Eq<0n^U=B>tzZ}dF_Y= z&7_hZ-*phnVJ`~yd)TCbD+0fV+oA1OuhGv0t=a0EFv>)jJninj)&U z&eFcOiK_Yv{~?Jrp*$n%yso-VpzIHw#kCZc-BFzN>XUkBB1GV&|7D>P{xXGOEKXYl zY;S0gH=jx1{~D|9w!BU_Iy^lpC`zyj0^>Dtp9GJ=K}$HXvG4qK2SxSZ^*2>~s!p#V z}BUx?KX1Ag8RU&4;#z0l0M_?ye+<hm~dx)m!ovT>Z=W33_hn?y({$$aPF{pJXD0MO&#Jn&BQgv#14U z|JZXQO{{Rl!dx6N-3eFvw)%Uokq(4Kd|Z~YSL-~Ct^tkW)9Z~{ zJxVheQ0I3mNSxQgch)HIxb5_dPe^Z%`N%`7u^D6cr?BNrx&_F#)##J_dX;o=j!BGn zb`)kW)p9<+0p>s5vD_h<%d>G390QGUI$#D4=J!`)jRFS=DDe0x3FA@6#8Pv^k|XW| zVlpHi3xb0|m7wr7dL8_W7wrw*W!?l%Tbafs?%IluQcpGDkYFOtfwb8R{3zBv?$8Xi zws4&fdt<>SHc?>!epYx)?=6IS#gd#|BM>$-2m-=pfN5w|f7mmca%pR}8Phawx#Z1b z75V^l^C1OaF+7l*8*Oq3eez^#w#0>;atD|ozv(pvj-N4->{;tpzpEwnxab-|Sdj%w zue6w_AoJyxvx3JHeux)g-hEusLH)5cz5|;gHIXm69N5R_O)~ei!)L(~5MG8xvKrej zcE{-gG}CIFz2V+|+fD~X%oM5(GMHy3+Tj4-lYj3zm^0)?wcP2WtQY>BP@Sl2LU3oQ z0>X;`g^a^8l89ioV|!3X=$gy`8qYD)ahpKvkAtC-iJw3oi4S31e>&o#?w7 zRFvm0bWc+-y&h=eZz1pXB${G`V#&F1P!b>kj5B`eKD}y`>G{)$^JiPrE@$bKVI;u2 zx!Do!{+Bi*{dyO}{10u`%ltJ97(`nF(q@atK-%oAc{JHm`^D@ZjcYjkk24*;q4kZe zO+P)Kw>#VOyCWCn4%V1Ne{ge#(DHk#Kst(IRY|u6xqa&${~NKhUG5HSz`bbX#=j#{ zdu+Z{+PbV<$kKL2bFy{HD0&ykRx0IvV*7j$NZd=#&sNGCEjsmg>pun)2MM$ls)XvL z`1^$SgjJogOTPDo{1g<-`f<7g#z{(Xpmuo&+R>8Q)*Ij#CJp)?#%=P!Y?A63{RgbU zgAHNqLhzw0+4kQ7DZn9R=AueN+{Q64FF$x3%b$*vK)qt6kBn41VCD5EMpW5@+PN&b z#2$kV0mT@}2X?)4TDG7iA3E|*L9dxh17QBKQB1X|muZw~3F8cI-hS|qqYbUBNQWOQ z2J@*SSg$&=;7QE`n#CY&Z2PTM1XPfdP;AV>moozA>ILUn4&cOz+UbvRzjqV(gMz!c zVahCB)f>n8-b6|47?OHelo!YfsAY` zxKjhn78}J6UGWO;1RObBD2+J{wlLmrGqT8n`qQj)LYWqNje!w_mQ4`>Pw`R|{)BM5h zHf0_i3`nId+k69$P#O89T}SgO({Qrl2TgYA!)?EX08j@npPj7TBk^9LaRM#WRxT z^OqF5Sky~3AmO)hNGSa~IP1iS=fYh_Rhs04A3*4mW$v;hCau2@YC>WMwDPN?yacSZ ze|p614|;Lpr>u1i!bW#pliNgv5|Ns#iYxhXOBz)=Mus+c}Q7%vN<6HL`OHfJF% zx0!p-I?>*Zf1b!5$iYLA6Zz;P&2vXYh~G`RRJ zHDJ9Z$0;@ABS&W0(7}LVGV@XMt#GmX_4iq8o%Heki`U)RQ;@Y0wAWsmtiX$1q)mGj zK{39Jn-wUfH|al)1Sc0GW+@JY{zCr&4+>CENSV~9t;t^BrGJq@$W!xO=Y!?1GXB%E z=|4&(SU zqq?nsG!|OaC4qGT7oun2nmS5tR6%dw=fFJB#@BtZ+-^+!B-|mRBQ-@>+k&3I0XkFH z_c3k%?u+NOStK0}T>s?6O5Z7#bDBcCatwf%Z@`5z$5n^hY=jL8)w2yz@Qk$MPC|q% zN{WU(KX@;GEAZntg(9?ojbibtKvizILO%!iCl#KZn`Wdo8&Z}OrVZtVsv+9rvP!Yp zYKKh;^GwF2f{yJfk+Ul(J?$HN0@T*l`1@qtKOv}#NS;Vc9sO9hNN|P+OMMa>=Jb0; z$r8Hy`H}mbT}!JeelFOsWd`#Vv3-{nPRr0XgPy(k;8&|USs1~zPtsJZN$Y4xN^`VN zhn8nQ#v3ca^kVT`A^sXGZKfZ44;7(~>^C|yk|iCvH)Ayoi+#7Fx=qe01u&-Mh1dTD zP6TddTkiOShMOfZAz@Au*K>WpJrN%Lz|qhx_>mQq-6vEQCEO1}{XD}i6I+{BH|X$! zK84MC4sxkNT%y|;Q`7Xka&S%`r2e^?*&~sa|692HzAyvr^ny+eGGcK`#$3lc>;hYz z-09>bOhS4Og_ZdvNF;}G2~e2JQS(>q_9QMMpeOuj9xi(Q@melSqTH$~$SLc%+Orl- zPmowR#@?XF+C~+k;tZS^C8+?8Cl|Ghj7e)!5U7^$nl!#mKf{wvV618U-*O1bE^t#>t?fMC@I) z3Y4!C%L?=|SqM`8`{_n7@NI~T1fF%|fd)LEit;K|Fhr1hrVSgbs`x%1o#OYv{1U zyJBFH8_2j=OMsJ10|*PKLf%2wnVpgSY`jZhi9M0dE79L$3$EB(1INJ7X4olM;ZjX~ z8IRbyoi|Gnc-S>B6BVFzz=mH~Bp&k{VfE@)(H2ai67%;QG}CNekQ~2e3pYmae8@}^ zgqK|*L31#VOmkJtU(1nZ(7)b&g5a-rYe~9g(tI~x zu2bz+dhlj>j@M<$_Mq*w=)XX9^Uth}Na({v@!Siv|5n3nIy6KMcb}qlTVmEzGRaD0 zG-`TeqOmSFo>3J)zAA8zl}0Gis$gHK9+pR!xF%b?7ij{l3j4FmGI;_=qx6MvcLO8S zUJ=mp&8HNM0TgTacP08gK@E?`#7`CZX#^nWCu`+aEW)3U8k4GOVIH=mR}FE^Flu)y z(k4XSi(VF&8!p^>MKepE!i>oufSgOf$*QpThFs0Fx4)^T*Dc{tga|2n!yg|CWolOB zTZ-?Gfj9j_Pw4YG4g3wSh1Ns&5_vF8C6cef^f+L*fQ)aR^1ps_7h?ZH~xEoRFJMf4^J*NmC@maQH-5 zVA%q2woy|R)VX(e8(*DiGLkAIk|Jv9+2upn^nsl-;N|8H8@$1kj^+0~5XIxN2Zd^0rp2ib zPaz^^Ns|YlVU-E%>^&V&GNTX|k}-SiyLA+b6MZ6C%s7iAuK5kqYY%N@ zcoarN7+nyGwPKV+?2=41MTX!Rg9G=JIdC3~@IanY0>MYYe+*BEFV~NnUHtT0j|^fB z61yNl3!fAbt`l!e{<4*SHQK=mxn~y$Kw+8Q>_Zg5x5OBMiEf6Xr9|TTd?33wi&D0r z?Y3+0hKcV@S*9P>-9F}Jc;cKG(>{z~s)hZV&Js)si(GPgPB@$BFD5=R<6~#xx{jJv zrs)`(OLNj{GE}U^+}X2y=0f~;X826^XaxJH6KrnL8dy_XoMNbJv5}5)f2M*iea7T4 zyOT0NcX@1VR=Wm9yxufxJ*D9?t>sIwdAGxdFkIo)M7cC(kCZ|Lo3;IzZ<7Ua_~rMC5mx~(SMPaIlQJ-yS~1o0G38oxq|$#+?*=L0@k zjNH`Q_vW-urt*O!!x3pi!;#|o!g}jg#wjkq&hQKh;)AO;IK5YuflUW|N|<}sd9M3q zh~hb$Z;i7-ZMUM-a@m}rd3Jd@?BYdgZ;#f^(!)+{({aFR>#Kwy&B^DU&!_Cr*IlcK z$8bOGFogj)0aI;?X2)yIz2_wR*W9)+2lGVUG(%Ih#-^~77?-^;8GA_YC1y8OPhgoi z9Iql;@QMSXS>BvHD>`r%i&-kAk5JJ z^(6nxX8!LE2GjpO$gb}8_Qoz=|7joN{4*{03Y?a!MmoVKPRc1(Xrp{2sjJ0NrNZjO zLy|z9L$kL|lt?YUcy@T%zJ8NFGuBgVt6{H;?XYu^t|TwS`97uYubbDc@1?|JtA@SM|nt%a;)}gVuK_+-7*`xC$L$+*lmDU5e9AfgtW}TXJd0sOjagm z3#C6Pj%=CVnAJocz#|S?l{P3W8!jFc%Nuw6a-`IxDXM6Ax70mA}A;<8ZAY6j->!Eqym;;>cVLP9P&{#F&WfY zS#-iJC8J0z0P6$1tP3}2!S6faoYH;+CyvM}M4eTRByVU$6~9-Jwlrjxl?kH~+!n|V ze_Ewkz7`rwqRNfFHyw17qA91VxnQO;%M)`z?p0_mryVGH(CQezit|*G*;`Z~C8M+;eCHT7yRW}+2*kGyiP(hBy*yQ#SDA&#b3Zy zau3;q0YcGcf!NH-(1xXcZOlDvYa!oxcQcf)G&vsjNmdqiC>2MQQ3fA3Fb?|JFF z<%_K@7Z& z{yvpL!4wbd*Gst`UdGfB&lDY_6Hataj_W%X0uXe?8yrW zu#!*sjbWd}0nY#&i3+xNo)IxcV9=s*ijJ`&)d^<7mS<8{kAg}ZF+i<4(nV52-35Du zYWB#kDOoGwrlzyyFqJELsWa@lEvPk6kT5kM6$fA6>O011P2N%QPn^J-94Yy}n0~5k z@n){jE;PB4cucFfvU3@DS2JjE>jA^7G{!L? z03{NS=d6iRlN>fg@-35meo@{qduwO?kuEk!vvV^gJ|SWG$T$i6Y}BHoqE?_)3X&9a zl819E7S)ek2wu-NW3`qb-fqf`ms!iKQDW)m)x5w7a#P3*%QQkk%AXU#Z{VU*fbD${ zwV#b>4kZExHUnwdovBdOAli14N#lY zgCeFrsC?MPj{NgF`pmEACY41Aijgfy>^SO)3H{b!3mjyqc_ORA2%wvR!bih{Ao2q^ z^vg~7o#>3BYz#WM1Gp#(Vz7$`0J$0Qsp7Vj%tnX2hBnEJ%G}nQ{m`l3;%#+Q%YD=W zw(?Go%2wvAvNb_6a{3hEBi5m#@v7%LZ=tti%9E?k>)*ef__0yrv;6$!F|7@@?Tv8G zdCxb4Q%@$z{(Y#B1osQGUlKDrt^GF$2SPI>0JalSN@229AYb?F3KT`U6F>*k@9Jz= zmu9!PYmLimP^Hs32#m5$0Q-uht)aO78vq&u&A)govPr3@>I4&?_LR4HcnOcW0MbKZ z8s8{$unA(LX(kHe7Z&r&0}q*ySVus<9q?Gk*GzSX z%o7N8pWQu4fx1H`ULpTPcDl#V^aoi@*1=;%o$QNng2+tQ%o(O_Oh?$qjsvn&Q2H23 z%0*dBXd`6VjWHU|fa{2}0}FS@M1lNQD!6JnR8!3txKJ*WcBAR#VYTD|ELA;cSIA7L zJuDyNvNzOMb*L<;Q~}iqx)WrkN!=Ta0m2;&nI}QFgdfiEv>5$>VSHY-`E z%NgrIBkaLfX!||wB$&_iBvYFrIs%^|?Eu!MKaL4y6W6G#fKxx|k`9Bid~RI9r4Zku z+Dm2x67xx+;#x@rrP{K_@Wm$du1K?oLaB1&o!JT&B^2Xxlk><2&2Q*x77%1?a!(!) z?MH-#+`(KwVYG-u3v){rU5hBkWC$irJq9|wkL!N;)^2jE#~Vpu1@{k!56gw8;)RoF zMJeGL^-V3Tnh6By;48f&S=0*(g$n%d!63%}zh6IyghDl9C%5l7rf$F5yixR4={dV2 zF_cUc5Gya0KlYdd(oX-!)(`5Dz=sVB0-{Fq-wQ2~i~mQ(;O1ifpMv31*B-daLizk@ z)Ndnf365b-W&ew#A$&+?6`>-RV(UL~*!G-_CyC7jj+20G0*UV5ntNcjEN-zV(a#USWY%-T zD0ULwjEu+|LH3(8oWvL7B2e=0P{4WG#+~8~Pmojl51~G}5m}rRqV3$PqJ1 zi_s-iavI5K8dG>rq|#>@BxBW1LbjVB#Yxgl_Lst2eS32!MPDGA9aEww>3l1``Kapt z&|<{r|Wd5-63fsoDy#a+CmA7`# z?Y%d8+b&R$%*bdH<0(MTj4@-+&l=@tS4~u$YNm9Az^)v)Nm{x?zyE z$6ye(^2-L_mu1La)@!Wa)+WS=x|a_vrIh4%&@7YbhMMc7$qHH3`JD&~i|%Mz6BiwF z2HNXS5`e|4$la#<4N4)%Fr<+T@)w?fV#o|R`V6kOiM|ns(2dolsjz+8=QisOIj+cE z0Lz*nK!%ER^csXwPSKZtL07Q;?55%kUJT+WN3FWW*rp=NZ+be>oI<#v2w{M_~5*(oVq5 zA*~#lZUQ%y4uVWbP0VlLQVG3Y-82r+0oYF~bjX5=V^OTk`BPoBZw`lVj11HebWuZD zE^Rm!MDg{TVO*p*BJmNNVycI6Qb3m-|Bh)Ymuu-5NBq|_j=uC)P>jd*ssQmRaqi50 z`{PWohxR0$@w3i>0NK{v(bm@F$mF$==k@u9PK{**q<`qN_P7e(Owyc%bj`#Gz&GX8 z9L;bvNrHQpx2Qj{i!CH-P?9&6$A6hWJ@Wy)kcN^$ep6ZxzsZE9A|G~_>s~Sk7s7MRtDOZ zR$+5kQ!GTX!?v$D9gwEioM6hj06$ELGS{6E+{nHP#Vee0FRJb~B*+2b9jgxkq489mY@QZw|70sp`cJiM84lp1BI(!F6XB$v?Q$oy~SH3 zejzE=uOe>67LSG9%D9JyfNv?>G{+H*bWdkDxAc{prdL+WjBfU|vU^vu6Gj^IAEB-QQ*t%0?yVH(9=>jD)cnHbXOv!MEG zu6k@zc`&me$_L7C9DR=AKcz7^!}rC}vFzcXd8h`>jT!fI5IqC?U9g$j{UJZW_hpY_ zOV9wKfu=V<%(U0j6ZA84vm;w{Z2u%8($SztMh`fIDXz}o8T!P602Hrvi_{J>N^Pjs zBN_(nN<3*xI}Wcx5P2$heW$-?UGj6*dHr2Lg0Q2drx4!C=XwUYQJ@=sO{A5YU%>&R zBk#lGFe8z|Ps0Q0Ea_sjqWr-)rPw#G8K@V4P^+<2wg%7KCA%0b2>3(RbMUPqa(t=fO7?~5d|V8vTD*5X(j8o<(=dl$(4cD;l$v7q zwnlnL{2jLa?rz90I;)QB6H9id;_gnoTlIMr?_AExDBvs%|GUR?Cft-5Z_n0PnN3`w zv~!J+`xsp)pu6Ey0XBFwE|03Wssx}i{{yD(-f*YAN#6-}5}<)XH01hKu&UQ4GaRJ> zy1jr?&>k&#_3+l+Ry7(D%Qhg4OGcH7wQxGu+nM}>Rq&?8jrQTj;`RSNc!2_H`L8d> zQh4=Sb3;YGx8Cx%)3=20%NXuI#0)|O3EmO@07`#_5ejs0(Z*Ow$e7`vFWy>YCo%>_Gdwct5B3Jh${O#lB_^?;D zHo$%KrDpy|&f-?Z)$gV@4{4^-f}JEO5=8vtiwV*+ro-nxX9q{e%Z)ICVX-og%V(Ew z7d#^0U@d$Wnso7`wwKQjqBeU<#3aw$t@>EV^LOj58&IU4W4tYPX6emXQm4p1XkLQ1 zl$l&)>_`309RYu~x5-tcy@A=aqGFAmN&sLyuhj+7MK`JCCgIxVmRAK9Hj51GKvfeE z>L|5tDN=4!Uh(;t=>Tvrj0?(zJ}0yb#zH1fdvvcpXhq1l;MA{dWW-zXUp7964I5xG zYe}+H#1=YXFQXc6M)SBOh5=cQr2V$zY^k`PHs3?shO*M2^(Gi%l+QQ#9yS4f`m{T{ zRA^24*04N?8Gmt-F%tuph228yBZ!(r78~uQzS0p}G}?5Vt=$`NBH_4>Of$=ZoZPD< z#4nDlD>UDbja%ZTkn?vkOi!h@?gfJw_`49nh;Wp~x6knWp97YH#!9HUIj{PT3PuGz zpjwDJ%E3`FgM~TF`Hh7fk}Lqpz-(UE#T&L#mcLU_JQ*>6qt{Nr6-RjGVYltg0AReU zbq(B#nmrp%_$ftrxaizsLbnjsNxcj`_5>G~4m!TjUp;*4;N+K8TOU|VxJ*b}dM+F5 zjd8&N`e&Id;WY+!TcJmH%F?*M=vSZM{^2;pmtr%go;a3<{7(4I_W>ClvJ49jO@fGK zd~n~-6-+3$88$Jb+N`y1H)U0ztEJxlho|prGjtGcfDAhfA&*(8BkZ;Q0E@Y{5!ns$ z)ZZaTZux<$V6p&>9W?xy7#tj^=)h|OV0%e$xPJa6#aky+cbBG5@a65|n|p6V01Y;T zSdKy*Gyfd56#zh>T*q9<7L2vGQo2B%PsZ2Hp%J`st6ZtOZWy0ImBxTy4}3=?qBW*0 zZ_Z~*oo-ib9M+M43>Xy!qpIvv2!gN*f;A zI&I@F-xLPP7QHyS^a0V@!G2ofz%Vr~!dKv&4cR}#0S>roY48Fy$6>P=d)zt4$3Nxl zQeQs@b?Td%a@*;7nHXBKM#;!Letzqb5riLcXJ)mS!F$fk-jfe1Jec!mPsG|8q^uX= zPUsr`HL8v|S_tBXgYbwWLr-y2@fQ|Zqe%C!JA!EO5V=r?mF)vn!3~rQI}qux2q?I$ zXD4L1X8<_S|7rm;9Z-5}NtiFY;iTi&`P;M`R`1xPp~E1;{w`jZodef=_K~nzdoZy# zoAhP=f+NyHA47vAo@$P16dD`<()5r%)$5451M&3FcS7}$A6#>uUj<#@g?yJc;?FHl zn7-jn7cS#70=CiGK76qwlb7j2-SvWYTS6LuON7B#hzP7cmN2Sx7N=+g zD`M?oV`eMHYHA91KM6iPdfO@;l?Vvz_K?ACL+`$S#cDY%wvR+DulO^1BGPxt_{?lS?dIM*dkb9I^d0O6g31B=cg&w8h zz>8;qTm;H!=F2QT&vT_oUw7zNF$96hqW<@!l3{-Q{!i63Xq|cza!f5(_FS6w4ym;s zg#~9w&wha7JpW@qq`zthG%awDcTxeND52!eO*TnsR@I&fKSc8-C&k@e+aq5mQ)UnY z{O$O31u&6Y#{+-#VBWxb0BAxPQ%t$fI6(~(`G>B*_RZBdS95o05}vT&^njz`M7DTr z<@HrU^@e#hJHr24!k(XFI8_WX9%91l_QPE_7lGnb+21pbzlABT)4;|14k?adz((A11VT@! zJa*b2NQ{aXsaLEm=FOwVM!oEbIRJkA_x+FIWzm&vHX=@XS9t|mVt zWol1FQXr(%%7C;3Xjgx{W;oBpdf5ZxtNL)x1eZ1Er{IKHiI3h`U1>WRZi2WAdek9l zYmP-; zAiuV+^xb_{0oUu@GaRQqon8DrpWO#vS|mS57*lt*>|hriGpJ=_$tgb}wzv9hF_u2f z5>fFUcE2IgEX12ch-a;Eh9JKW9K?;c}bsPXD=2B=a*XEk!G%7%l!4Ut<{A+E53Xk=3p9>sPVO%q&uG-9_c< zaTdM0+;Gl%X~T`uadzw@xlnO>r8DOepMRg({&ATI4@}^{xxQL|#z7FFXC6{tdqwOK(x0ABM?27|WvR7F_b3#pl&2!x@tSBXT|*dhbRuOE0D4Bk{X}k!#qUGe-vjk9?(=hVja61weK-Y_ zU-Q}LZbD_Qs1DXm#4sEq)s*EqOH0XLpIArtCwfuAoqPK$5@+@-Aq z$?e9N^3>??RG{qn<(tu+INODuV$y1n?$ZML6)~Z)IW0v-NxuX8k<3CO;g8$zGAzH0 zUM$W@B;qSof8EfB;?33RVwZPe0|v|HfUNvgMhD6t@>SC_EG?$TsjVbGM5NDhebO?hRnVsH3@DTer=W@(EG6wi)yTp6G$=3v|(b@P?Y zj`AZibA}26oooEnzk_gr#UN9OBt#v>P_RAKlUWc(&TfC~L!7#b$nsMP0POJRX-?S& zBu#l*jtx5~Yw3-Ay$bWms&@HH%5>#G<;i40>X?4(^b5MlpX;v~=ndtehnDE*RIg&x zNY$FP7#<+gX&u(c43oh|tEEaHQ)%+salbj4JlgHal&zlYV-i{BcyTun$>7A&ZeJ}J z#QXG5&Ux;6bg?fVuXg=3GQXP`5$rum{q**qK7Zk;`}fDYe=feRIO^yr-?n`hCwBn; zYv(WKb!Gl*wuZk{Q&lN&G&G{jT*yb?tLV@2>a6YGvHoEuCe%~c;DOA5hqPBWDG0G|PP@H4%Y(-IK`EkML+p!w$3R#ux2aH_7RzvVD0ve)s& zcr5c2X4J}&;6u4CS?-6A#AwXY`CNc$gi^3GFiIp27$tJwm#5Q5N}C}T=6cK5U7%={ zyk7ew# z4?qO(2U8)MDw`s1{bh?2rAN&>@uHUqa^Ssm+G?)leRhx6yH%`4rv~T^c;o9Db z>A~`)K)ut0!g9@XPG>Pj0Zrgg&2|lL2LzOwXOxzF7Kr$^!+}f{hVFhePz?4$Uc8MJ+ao5|jt^p!PaT|XtwG<+Bt?%A} zgFO$DEdb9hBzbKJmu0m1m=DwJX5HeR&RmkwJep846v~J}yC5v@f+r#3edb*Npe^+i zp4h%^q>viQsm)x6T7!$7)G5W`#A$&PfNMC&{oDQmd#mjOT3neATB8 zSrDht_yQZK1j336zVRxHoK~58t9HGg$#0SQlicc5ki zfK1jW{-s*OlZDW1itCx>)?QA^H^KG>23|s%F4O=kCioE z=;)sTWyyKU{dkL{Yy=Rq$bY1)fUE12aSAI}vF2YM(R>fC(BLRQt=;KIA^#(PjsV+%2^`)Vy(t+pRs|q4tF!@Up;8S4*8&cn70(NAD6BYf!JUGPU zjvh&NDdB)tAjpPc!Eww`xIb)LVoL#H43pV0cs`WyS#=70Iod!gD{w;jXb7G;iaQ0S z#~d{#b8hi&|0N)fX_r`)I1e`ud7MkF<5iB^5(d4`F~XD+j!bi(?*K2LTkm(k)T!Di zPdBJda{;!jLox*cfMdVdqhNo)_4hwDmBS7aj!Irr(%|>GoNN^so6aN;UY&JKwgC{F zqxSUr?u}XuU3l*V?(Jp?AGHU%^KA>U)2)g3307cDMLkGiY2{2HtfQ3}-a|s9Nu!4I zMm0_ti^G3n+A5AbJTw@dEQh{GuH<3 zWmo8edjT?6Ka53!@*4Tjy`;b!SM_tF;h87GyYz>WKvwcPl;N4;`;$3TQjxU?%a$a= z5@nhSSv%TdJ7Z_61SOx(fpyOCYiY?R5h684P$R$?XjI3r=sOYmfos9yWb&;%^-O5v z;Nnz;&(`VFxQyi-NsW00dg(nqD`wXSh<(XCBU>ViWE+m2I?ZVDL>G3Xh=#A08orK0 z(^AQ47A&vb86=z!Et%m?<5;qe+x)=^Ek?N@msmuz@aEi!tZRRDTjOA%no_H_c50*d z;5Gm>hIMZER=ht?IPDU&-b$PV0DT-JFK=ejoGhnyGnsvCb8im)UGrK`^L@eC{+SsET=e>X)Lu?A453gDN!ZM(f-rx&UR(uB}uh(Eqb$(QIZVUl~Bf zn?W^IhtGP|c%t|y_;-V+`sUc>4$mamY=qr!9CWM*WPcGDia=YlUp~JrP$I)W_?!`P zuB1K9)s>|$KkUg@F0_l)Cln<;n!%VkvpelD8E+Gx!6vPzDU{f&Qsso^h5X@ZDH&Ys zV_9#gTahAU3)Cn)gXeN5_D2?_8@L2G(LS*_zrz7b92tg#L<;>s^1~FeXF|>u7<##2 z*N>wkEP>7S(P2ERsao-!k-$y-}_!^;lp+5pBgn0IcCk>Yc+DX5Zem%-#Bwf zu1qp9UNQrn2lsxnk{QEN@vzH9eHYnqMb(Vf&p{HrSH!%(GX}2Vo#a~7B;o){)fq1` zQM?sI7S$zjti$NB${n`l( zk1o>JghT0CgOnTunhWM+^TYt8TCdedo>Sueb3r8rR#RE4QfzKFu$PonDf|z5*CCwI zhL!_&HFwXT)7>UoX2#8l;r}07?-X5U;BRZkwrwYkZQE#UTaBBn*tXF)jcqr!(b%?i zR{wkN?>l3UbF)U)MRJ+(&UgOi^W1}Vb5{yNhZBKO$^GTEn1ngQ)96m-N78ZaM}ish z-}XtQ;%GGJhG{sPZXNjsW~Pu(dDX+_(>~%jprCIS@9p7JP$PT2$SI8HuNVmkF60KH z!K$;Pe>ssgnIZ_nAd5}K6N;7D2la?EQH%Buz8_=E3rI!QhApHnbJ8i3@n@V zHCGmdH}Yq#+4mi9^EYGvDSLas&qR=&3x4gceatsgNnZn|+$$&=%rNRup4;uYw`s|B z?0J3`b{GvaH+OU^mPvH60WP?9lKCv*DC=At9TYf6_AQ9?U!GW6@iF$X2;sRnf4@Bp zQnfn0yZ#G9p9a7%YmJYQ%eF!A1Uo@|A@$)H|Liv7bD!~%km`wmfxlXd| zjw|dMSngUOyzby20~{cc+TT-+%q9y)?e-jSC;y2W%ghL+p0_TyVab5Bm|KSUmMcd! z4k1WAtObTEfzAM8Ydpma%Am%iXpuA!u~n#DXr=qG{VYiNyIx9(*Cc|Y1}B*xkWsc^ zu#Nwea8&!5yo$m;tdw_*mUj)5n_+lK_hv zONxUsVUZ3F9dFPC3n6QO_~Xq8HX&&DllksLoE@71S@TLzKHcv_s6TE22q}X?fmz-w zsvS1-k3r|97L!~tqdPp5T~4a%6Hu+pOuZ$VZ{U~VQ74TAwG<6~cxWrtO&eQFGWW|U z)b%-eVYM|_X9EioKO1Zi3rsd^}e18f2D{d zM%piPl4eZFRDerZkh-0sJr!6!Ce1xHv#>1b+GK5fqUF zum75?nPLA-L!LDd6!!tXT2DQoGk;OfR!ljN;uWc@orr~CvHv?ec{#32VtsApnT&zx;Wp*z?c#aABwCVd=gVa0Tf)RFGIfsoRm*R++X4?~#cDyK zyu79e4YzE-RTJS+k;gCI$BQ+_lRxbH-PeWjP_eGw)~L1=gMj`2?xY0xBEuA~)^H=7 zYp)Tr)?a7(Wxr&UvvtKR{sr*PSU~y#sem#u{bQJCjmkY@qg5rWl;=LK3EnwINQv6&Ud!9OPO{&i9e(aOJ@Hf%l+88M%CG=Y_r zu`>%i4lxUGUkvg)^w`BAL1h98al9Eo_&`l)Gw#r4HE?RehIZg^t|Xoc*RN59wNsZ> zOsRXZ)wak#$0gi1YX|J4>@fSNSRJE!S^!VIs) zfv6zerF|Rbv}Tuf^WbA61W>VuvNebxm6&!i<8NfMEg6eGJJ5e%&j8vA;i60%ZZ}f* z@(DI((m{}=5{6}h-mPCa&Wu``OJ>qX;wy0Df0 z4_3q-6HS-Ds{O%F%>hvRx<*=(c>OeO_wQMUOium!l&FH#xzoV^wx>K%B`hc42va6+ zBYl0s)NF){oyLCBEz9kf2~$3EXL} z@z!S?5D-<82r~0VdtOJ?i=}I7N2gGv*Cj-iBwBW;vZmLgP!8oWlzS3I982#VAxE%p1 z4u^#*A)1C5RVX>erSFO5-@f>Kzf(m+D0B##VwMCLoQnSwoY?=gIGM~=#RNtUEy<=e z{tHer|Hw|WID2taiMqhxM2)@NJ-)F;3rLciIh3?=yE;@lJ;DklxYQIP2wcBEj4QI^ z!+JSmsyB->?+}rD4uJ%`!#C&qfyXH2Me&hT%;(C#l--U7+HRXKW1mknxQ93ObhJD* zKR%W&FCAShsvS%*6TM<4H~o+_XGYYgB~4+SkzqP$nE5~xUl?$9VLJ{%vxKdN0AQT3 z8+mHhHJUjPqdEM417kDbz?f-IAQ&DvFn+(OZMJNv{akY|tlQ(O&3ZJliu*tr2osCg z*2U_Jhwb7Q%6&M#M#D(}dr^P;Dc!v~Hf#u%M=A)?LmInE5~&?>74Hc0=x_9sYl^$t}EpwMIsah7Z{vsuAB&kd6rS`^!vD>5S%mM>g9hF zGn6>1xnMTx3lA^-uoHtO_?9Oe?Lfdag2(zvkWJ;8oetP|$9a4K-iV+Rtm&Dz$n7wK zAA^_ffrc=j36e00d`k^f&o%kjOP!J>dp}C7!T{50Ajb@9Zv$2@z zoAZg^00t1IrWsfRUm*iMGT_T^dREF#TC3wQbW>4*lYdyeeMEGYRPpdQt$ z$)#I1d#;==N1M#tHH$Cceiixfv6<(m5?VU|*_+K3^jUP@aDwLWmmeEx9%zn1Zt{^3 z75EsE(p@o-V!KXBU1bo(jzuY--q)~_d50;`82`Otf(9?Tu)VHOHCCovzYcA^9EK6s zdq4WLxLOWdVunRcNZm@U{CWU2$~WU1c1(1&P(ZyaUtl;K1_I)5c9aP(dOiZ)8}leY z&;wQJ{1;&_4Y^*W5C#Fh**p()ptv1{2}hEg?(Dek?!obR>|X;XBW)RaB}M)c`OqoM z`H*6LS-0}W)ucg)OcNK*TpB)Dp7)GZP9YHY(cmo~DnNE#wZ>4ANsy5gOKRaY@d!#* zlC{vaeiMi4<*0QYokdEMK0265ZxlmieIX@=k7i8qv}=Vv{Cdn&B_Khp{6wpIs zFq#+y0UB!>lXP|t;%)`zVizf;-?fqGxP0B*HMN)!i#(gX@U=q1G%R@0n)5SYR=+Xi z)9qLnXnDfA642T}R!#j;M09apdz<0Om>&o$H(_!AwkV2;E?5V4hz+1U&GqB1OI;h? zS6E04uTnl+ZqM*Cssqx}pvE*#zgvjL`jN$1<9YN-&Ds}t`-VTPzq=+xQ*1#GeI7Dz zl1A^6r~CA2+0<P2g3OQ+id35*F43|YHeOeKO8dA;xRdq;s&O#{SvCwTBDnM zOx6o7fK@I5Qrq+q3!q($>h?S4giYNyTa~nomb?rtyc4sSter83{*?XE4R5_w2E`mW zA*ZQHu~Z+4a_N2>GDPbaaOc+dds0@I3-&7lW%6nC#cV8;TGq>V~K zx9Ax_oRO_$XlnDfdpgU?b5(A_FgfltCX?n3&d%TK08yET#%p7lCEnMiT}1_rUe0!_ zd>*jhF>Sx`7tVhE!o$Be1EQ-u3xAw%sR!$-cN^*l(SI9JvXUQe#{q;aBLrtoYwl}k z4cy_FcMEQ!aB91sOe2$pyz&ySgej>P zpZLBg3Xlz9urR?3(;2HiP>2Y(Cy^K}e3@jsmomzgxlL<0FOFx!2pbCB3GkgRj+fZY zMK@)zN7!Zg?%c#+84i*f;pnm$%yY<*#z9vzp8K*{ilOm%t_e*cc@xPpe3u50orLU$ zB7P$}Q%r|vsq<22xcd15J4^O;-$|YQ?a_RU7C@2)`$Zh~f$Y0qv&tBAG63f9bucOg zDv5wru#@;C3#_29^0lVL{8z(*kV{44!w<6$c3vSNOSVSiZglIkdfY(K2S>PSSSc;# zy;rzP*yb#QflOYDnjZqIXzS!5Mb^caECS<6$vl{3;N0lUl{M3Z8|}(VxeRsVwGJ0m zfTQ1KUiQ=KRC!o09~Ft(7luUfX=X*^2KEeI8qS}KL-&(Idx|y7Z6iGhJWn>JLTF@o zX?{p0?L?0f=_NNK#38g5Oj{vcKe1C|eP0+E+I(IZ&ks6k)2{jry5awQ`P%8IWk-11 zdS{p41HAB_ADq<=fAZR?gsP@WWKb|xFwoCgClr1~VZ8uW*;_v0|CLXWO9qX1zy!7W zzssjIr|bWFu>1cy@YD5i#OFc-W~o5)0ClKJAa)z*uUSYUw*Gr}#!xJQ3IWX!^JULUN~$(#|uJ{sYO4(E7Piz(0g)Iwi_=ZAs)h%8oqhB=Tv*#UKwh zw{mabQx(U@cSaF0YQ#_8Q=4vg5x*4Iagnoe0a)H|6(Z5Cn$&a;gk6r#_f+`wqH^H9 zXO7^Ab91dtcaa5qTPnx|%u4PGphah>>v?Pt-N|m9hxL=fW4YQSyD|$HMeW#%+lrKmZI2I62C1IOED1F z1H|wwCtIP+jbhPAjB4Gggn8#We(j41%-d64%=}~HVoI|tN-)w?+ZT(E=8udwdIM58*z{|w8y@ zd3C0qkCz<54O-9^(T9D+0oOL1>|;t5X&Xrb%|@HR?}O2A5q9JWqekY24q ziHy7n=}v&t3lb`$RG6=}2X%P}zzge5$}McqHkHKatWD)eL1AaXT7&L@Ra_6+SFX&9 zzRjOC2o<1rIKhHmyNBO*q`;9SpRVVLQ*8Cr&!JoAUoS6c-bWo?kNHb(UFR2VxO?wD zY22?#dZabJ!9zZ7+tD^tKL24%7qfAg7xi0^0WUT%MDDS|$_GJjbhbOknIe4Z#Luy8UKizGeHUC|_pf|@yE_MDKxdmTwHXF;vA zW=HQ%FcKe zx0(5qXR4Zs06~MMdDQ(4(6zM&BgZ^Qg=6NJ#_`~a%p!3uGq@a2G+>^x@GUH{#&DF- zwo(^SvOkXh^&LpW{lNC@{8H8jt;^Z`Q8E7Xxq}_6>1aUz*{fC<~*=Ag$Ko{^otT$Vg+f_$VCPK_P3>nQHNWg+){xO zz~nGV+j`MIc6HOW5`}^9QCA@FPGwh7qi(-1ZamM5u_@3EpKCJ*W}CQBS^9$o$otZM zK`iTaoGkX4^j1$Ble>s)wg{dlFy&4j9Mw+ygOfNOgA2-1IF=#aLI!u~s|p)GY2y%W zfp82di-(<=Nk|0&i1f30$~@rk_F7%rz<@kliO6L;sIbGiXq^TlJI|w}1AD~G!I9d* zuF#7M@4`8qn;?dl!*7gPYk0`0-$0YN8C$g<>JE*Z(Kx@u zIA$wGXLA8OcxO_FR#%VWD<<;f z@QriYjWm7X|GHPvxw3H|q3npRzc#JCNM2iM5Q~d}l+p9Lmf6`7P47sqH5HE%QZ-V% zpeA>c>7c!@k78xQevka#cdT*V6FjXJ=u+kK(@z~>SYFg5>+ET;N|5{b>g%$Ae=lvR zVI9Q5k@kbO0+~5^)v z)JGH$snrMm%`AvtIaUqC$hnpqy)Hdm$XG@x{)osRF7Zqi?*5QkT5Wtsg;g(L5u66c z*&ooS#(Byp8JBo`@?4raP-ylHwNjEB5@iSUPyXnr8+7G=hnKzdA&C0p{7WIE^c^(X z)HpB3Q@i4)yhbA!$HgaoDOVUNkdBK68ear3E+@*YBaO3aX{UgmbOJ5TH*?ZvF-VIKps&LF>Po?r%H z-l-hYw!obsLAq0yDT9b>LxA8(aswu50@0EmRtei8}|CvqsZp~9_~vWuU#{Hs!yirmbHbEg{exA z!}eiD;RD|BiR;g8pgBC|0y{~hp8k8Hp+@C;?pE+~{Bgf%7rMZNavLxB%Gj8%X09wQ zXKpDTlRbmBNeM0+*#01z=GPj(!*8!}^Ccpr%RD%6)yd9OA(*I7#b4w*?2rKXH?|X_ z8g`rs<{aSevSBfxGPRqn0`doi;Pt(_YT-Az9PO&ENH=NoTGqLrTmD!H8ARJ-6nZy) zwG3XXT?DBZZ7=N+6iGN<_u@A5NZ0xYLV*m*&`5%b;hj_ZZLd8&w90ynrH)hvkj$#Y zUJ_I}TBb@8{;GXCv4lNGOxp*XUhc^lR8u^Kpp0=HQ0C*%WH9gGY&d_VoLsM}r(*$1 zB=+-4h6jZ-gwQou$%8xiDMT4Xv54wHP$2o0ADGCxJUqsNU~pYsXAYf2L@<%1hk3j* zn`A2>V5>#Iw&?yW8*A8FXsQ-tA`U|NzqjtHtds;(cemtBde?P{Wg!9JO}MO=6EUJ& zZj8P$-uV>arQzZT;7P%zzAojsoH+$(fbX**c&9(=8PG4Vj{O3guw6!(-$fwA7{Z7L zE7AnV%7=%7O$EHO>e}WEagi2g4qeJyH#cf1DOh`{^6?VgD=Ln*$Xi>#_-aZvSb{JX zn5R7NU0hW=T4#hWd3*;{SajxOu<(E1zH-$IY&G*8qdWOp?bF=({3-w}|I+Qfw%d)r zpcHf^Q60Zt3Vk{#Zkv(Fyj;&uVbBd@-Cg0>r6UlpmL+Y=9bJiVHaD;_1F?jdjsFTx*2``ZuWM8IXb-iQVhxN)wGoK=A8Ga76{!GEPHU@Wz0zgORUz<9_oP>I%k< z$L%38LIp)N+`?|odHrRc<;_^wTufj{JF;moqBfH6m(<@{jvi5SY7|GFVo9N zxiy6RhJ4S^27Dtb%R+aD0ZBkXT;JV6&;hRzY}xW6pLLs>W=|{FkcY?Zq9%;fzh}{@)@CVBInF?-AW(9Ha_CtLW!`nf*y$ zYR*uI{foAI6d6n)W*Zt;fpm)As){b)iK_vKRjofDp9E(pf^F+yds|;!ZIgEY3M({N z{@B}1?{uA39R2e)FrUN-sLPDKdvjlQj{Qr%SZCV88Id(Za}YR;ib#0${Fm%I$)MS? zb9GJ4#hE>yqGYVk34{s3CATp_>BM7*qubIWz>0H}r=vTcTryMP-v*~>w#>c`MhYVO z)q9(X!2}j_f;tHIMZTtt*r%w@x~EPz&!9_(+FAUsk*r@a>Z&(DLPzMzp=WKwODy({ zan%NBUqp}2$cNbBSj|)OTWoH3rqH6uytM0Q*e&m9rd-h^MZH30%9j}vf9rZ{et}|v zWfWa{5!eYt5?!(!#guzxFv|@`pTilRrEwtZF3EE`CR=}u?UF!ZR9t!@l=$r|{$pY- z71@?qCMB(Eh7q7^eMrxpbPi{Jch-F+eNXW6%o zgChIiag!tL4`_m@5{xjKO*#|`on%a_HUPz{sqSu2q}a_gk@IN>)0MsrUGi)6(dhSY zHP^#oMW{nW5|ee#keqQpADg)B-UsKYn2lkr)O9J;9_M)h)-5uwu3f^hJ+KPG7MwKw zKcfHLiLK(*?#%B?9F+HMIOHyq(PSsBjSx96EmHVw_8ec^u(Q|tiT>5K zngk9Ka_;+ZdjNc5M^3f+XR*LZWRtM={rg`QiwIQ_@;J=bO`|QO`+!7mSo9D<0Z>E< zE+k`sy}e0>t(+U>joXrWbrr(*5k1~sM%Sv2GHPLF2V>zj$WY7$lE?$kE3X zy6fa;ehD&S$NGu>-__yuv$bFx-=P0{c1~2sE?}E0FkQo(fc!zrZ zJxLYRlv_Mq6l;XXC%ht$7yYR?8}ZS_FaQZ+h zL+izp|J;a;@1vjkg5K$pwkuarW`Z?}W&Y5{aWG(wH^9yUYU5x{Gppd!-~mo%RbhbsbC!>}yzw z?5{bb8M>QQRA$F?UXlS=FE_)iOr#Ai@c)yiW=zpOP6mfz6zfwmxi3 z<%USiE7#rERuG?adDt==E)2KRLT00QXWxTTuhHSZ-kBIgKH&KUe^yremnr(NDg+Hd z!&d{J+4XACx7J9OrVbw;&z8>e40VW?9jR032c(a=xGS45Vs-%Rw?(1sr^1$9>^Tyf zrOYLQu}M)tb)1)s6QxsptXQZAqMYsFE0K)7y3PqE9nfNt2((ymn{|c()egK!#Bn<7 zoKejNYXwZa1pMXEz}Qf?1-^NfZCdH*ov8z`za(OK zC6yLzIP7T_7=hja`#DOfEgY5HqM?+R9CnUN_$flsUrUd-O2AJxPv6JL z#KQ4u1}FgAMZ8WfW6sI-2}3N-DEh2LC@ubfz-)BY0PCT6e{FdK(*L&F&M^PIRC7w% zwnTG(FlCpf_F0SCo>5%Y$qQmk9m24?-N2^W2n_zrTjN+7j<%>`2Tifp%`;Oby^w70 zEw1c6;{QILxz}Q4AN;oM)340gaGw-OCwL-V>c0ANY=MF7Om?wL0{0E3$-=u>(IfKQ z7;O^L1JLxDPduggJ_L5Hy7!_?Tnw~VL=DATSyE06^|mC&7HDV z7{nIdWJZ3uSanawGb*ETS}Q(&h~)vnLx+5{1OV=93|ZTey~Wx`x?5>Sts!gAV^2a$wXAS1p5ZBC zAR-#W+qPkRyc^ZL$cO;zeri7gEbi!OgM)k2I5NS?5z5cIep9dS1270%rW7`hkZa zcY}eG?X=b2F_pb=h&e4f_fhOOQ9|O)#pBf5<-uF^dI!bFlcgne8bCezif)2!7@%@y zdo<40*X(ZWLNPl8kAje?edYrIrefw#{TKRi#f02puLe6 z-XWH=Z(Q<5DW10y@jkJ&(9Re#Ks_SaLAsY0BmoQI0hG%YDkz+qvrN59WVxQnZ^NC9 z)nWA>1hoh*CGty8*0jMxrqj2~$v=|t$R){2ri2v1I57*sdEe#|ic;oP;Dpxp&sThx z`7-B^!peVey#HRb!2B*yN0vriep*{yuqESb{zd06vNvx7FzlF&&Tk8l6`n?IHG;39__eM;9M`ep{*=r~YDie2Hgs zJHH9Y6uhErSL2l`!Pv*r4cOfd=`u89!(cS!xWtx~heXa%Q}gZCBnkNEyNG{Lq#9eO?u!X6vhx&0d@vOfRtxaYA#f9nPh(>2$jyC$Ok%bD8N$+QOu58gu zyvw5>_E}xh5NY7vYqu&lI5j>z?(&50G!JvIC9U8^DnZ9g-4)TFDo1<1%Pzm5Z|$4y%o( z3z=EqWn%Rl-Uxu_?Sf+$12z-Cw61sTFpVO2vw8!c{oKri?+3T5X|aEA_up)Rp{1A4 zKEc5Y{{`2x^zRR!!V_iji+<5N{N$ZMM!*VIiS?Fe2TWIQ;lRdAi)4x)uX zxaJ*YPteOpe^MRa@s7Q~Ca=f0TJH@7Vyi^Hb@~aZ4l*Kz8dW-KvF4 zTa=rhwhH(ZntBwv$4%XIf9WlwJBL*`){1%ttHG5|U_`rq-3wwT?(|C+F#exk{T{=Pyo8;2So48c!{iHnYn zKm0=yD!TSYeBwMLZaMmlHkF)cwCYGB=08+W0J>^8!Zv@p)(-#Ek26typL&wkS~m{^ z@3via!HW>Osd=&?QB3`mC-gF9daQu^|}7SO)@vUl#^c}75-(D2kD73MPt zJW=l9dgOQPX{e#++*st8i?B|18kGPvZuG^=$SQa8zVQOv zSwu@E@kELG%{C&Iu;^VoNd)m-!i1}cvs<}X;>z@$YVqaK zp!H=s{`Pi;_HpF4H_-sq)FN6yUUbc<;VB%TQ_7~`nszNBirmQyqxSc_!3A~hLI7-3 zpC2A8QA1v;OrglB?KqFidyEwVudDIeuvjNEc#aV2l>69`1??Mg@C`Hv)^KwnAd7NZ zjJ_?OC4d$`oP-qdHf=yNrz%gApu6O&@=OT-`p80;Ben6jPPg}q%ih5fv{W@Oy&^rr zXx-uNPd)8{T@D%txtV~x-(Eo+S<2ug$HVgVl~c8)1%J^C!VBPs4fxvWu+pqky4+O@ zM3)NmE9;j_B45$e7e+Z~QiU7-0`8^Ax)7cv?zm>0b+bT}q<|!aMHYueo5Tdv?d9HqMg0Zp_RN8XYs2eqR<*!Om|SJ;=#Ldrfa2Kxqi44C zjChLE-pm*jgcN^5IS92iH69{sh8i-a(HeHP{!-G7lk}b~w#b-uZl=jMEM=@wsf8~v z5?wN2XAPN|ZPmfPX=>c+J|*nqqs1T85RJ=b$LGW&5&HuN6#vhJ6njlrKB!n*Ug}h# z=C(?yu@w#SjUUmhe@G!Opf{|*3%Z2|&5;1>TbTPFEuuaX_E6CN;Qcx)B%p8b7ic3c zI}x)9OFV)VD+#}9NX0-43r+%S62CL5#KZKhXBYz>#KpIu?=E+Fl)ihe8P=w-ru)pRjko35xcW+?$7ACy+4b4)bPPek&PM7)jQIZj*QA#47s7Ubd~IJV=C2h!WS(Dd#}3z!%k#T2j6-Dcq+>GVikGyjO534T-Dl+u_fzx4omxEJ@4~RotFfc8yea5qh^u z7s&oic^aVPnjHp-(I1ZmBWS>!wfNWJc^*-g^c4*IkQ3mL6|y>>2oe1|3ob$=ynw9C zN5F25TWZQ80V?SL*b`hc*Lahv^(gY(A1->9-{qf4hFe4WO`RH5^ms7SChj+;3ks6! z^TPZR(%IUWGLZU?3|_~^PEF9v>yQnLwbsjYi;1!^!ov=(_=Bo&?_v+LkY1$WiN(6~j(m5GdWE z`o*obMpl({hlO-?Qdal#m_Z_i(?0d9e~xQ&S24oVkroGqJD$s-c2G?OmdRl5>P;3e z!%9h3B>Cfh=VWR19bxt2W@+w-BBqgiO4w9YMD504O53}R&{{>qxC;$R`Z%rZJ4Adr z)J_G|c`VqpjQahaCyTMRhN5a`aHm3P4oW{_A6K?Kz^~L*SLc)m#v%+54*T!mFZbS* z$yxfKdSx_mjRdPd@2q-F7_IjkSbwH}U^(p#Vxk!PpON6uEn9BdYV6FSYElwi)_9g~ zOiwI3KQSFZbOztV>${*ZT&m=eZj+;9XK({1@8=fZBjb5>U+Y=*tFk)V)Q1m1=lvY# ziYk#I88gJxv5-yvj`V(!ELz15ZJ;DN3rwAwN4ewTG^Q$i`z}}Zo5ug~%k|+XC3b+e zOh&9~%tfm?5410ZRTQiatCaLh&61oQP8#IJxSKhKhf1Jzn-Hq@k{2D4X@gI|+G7f^ zb>*fwE%Wwq<9zlWmzcI0;uXo9lFy%!fXs=oRGvCmiMCye-?|a@hToh-itny%hsRw+ zZ_*nT+5oqSRDKHsrUZnS;lC1{|IvI>c5K(=i#^D_H<*O$Q`agLutpCLa(3utUd5~o zQEBJfRyzRYT^WnYgVKO>E!ha7amoZ>^(m~FXY|s{Qtp!k{kq1$(o1|cDY{Q*gw}CN zwidb@AXGw9&d8L@wwQ5mfRhVCyE;U&@Q`3>@@{atNky%=EyVWJsL?f)$Wtz?{5HT{ zN6qJsTlC9Y_J$Ilsge`X<>!o-N4t=53NqWot&O2|k~gNWnJa_4YO^>vehVu=6!UUy z@y8DR1udT3qeRFf?1$$IS4G(==97>i4_AVlv z%I0xb8V;N9(>Dhptga_5h|b{*cYXc~W4^~EZD|;Nv?gbxm4(8|%H%*Ne54MuH{uuxxP-hL3IACY%fD2IsO+0<*F64^t zymirU*WS@~k$W`&lZ4qN_1#$&?MZ+jxrNUS`S(nOM&SGex|zVsQ~fPFAUVtW*t6(D zEKVyL8jMp18^{{npJ^1qgtoGa=agao?y}dor#^Yx{osiF7{!_IcBb} zi#RE~zDttyVlT7VSNV#ZyN+-RYa(s-pRdNqcCU=TwEx-f&=Q{j)mLQcCC^kQP5sxG ziJ-IO@YErrp_e3C|9+8?Hq8SSejNax03!0Hq``o)OZ2OFb}!kqY}JzV^_k6UMO*rY z+3YKSo|j+eUOQZ%G{*{!cMxTmX! zou$SI8iy52-A4fB#y67zzmnYv1MA``i$lK_)qOk4L$t_5stCo{394K4v7Sk&Sj_j) z5~1;VWK9oA4{2J-$zn<{j2uv<2_$4#t&vxCFy|Y7tP!`)XoNY&U5LCH9x%8sUWp2o z*L3lGq%m`r7T~=<(j@I8t^pg4PkjmzImBt(WpB}+ek*|RMtnOVa(EJ3ElJt2l;crm z?9{{Nr5Tg=gbfT=htt(~r1Gj<|9QmEES5PqbQPAwb@MB)stR#Ijc+FF z1Q(@Yk%ugpDO6DAM(rVYN?T;l?)m=fR9jJO)$;uE+RwhkZ|KubtgzIn5bViKOjay$ zcrX~UxGaEf*7#cK(|}m=d1Wc)SK3qnQoOtXqaKJ>`ate*BoPrbM)Hi(wN`}_C-1-p z@ef{E-fhTsQuq-_#9;)(Q4@kr@@jtWvGuD@2M5`T=@^%|V{Nf!b)Mh)WE|CL4&*{g z&}Q$1#5j?r-d&x)7-cl|0(uM6k$D8kOvFnC5i|gZXxE^t58^nHat}CggfZJ!siFe) zL4pN4M0tVgfo6hr^x`8{W+D*8p7RP$lJ?d*Wx4N6X1;2;#DO-iFo(FN)lq13=C_G; z;pv>0H#?)HTe?zL$O~pA#Z_O&b36isu#Lr$4ue`${6@U$U>w6UnUluNOuY%(x%x~P z>H>fbHniRhaZ~;e<|{~)818-L>EjX6&Rli2J{RF)2~!P(5YpcOLioSQp+sPdrQc@M z>1zW?(-w@%b#{jmtTj^C+mq?sWr|CSj%)r(YSNnOY~!W2xim8#L=)OAk{p5eo9J*O zFh&c{qqL`r3ZHS+GthpTJvL6)m^3pp1QtF)wB}; zz}KpD>3{3Wxn|jgpnl^ry+1Cz+9BLgnlp9ceDhEckrvP{D$7#&e(qoGy^;ov5C@d0 z3cLD#e)iryLDx4=ZxKsh<@N|&zkdWAT_N)W0NYt`2)g{}Ht*wd6 z+Y-gG2sJGj2A8;u)f^ul6Qmw%!{+uL{hWA@f7-%_&u5^vFuL9RqkX-;(!HgM_i>`i ze(s?h`#K&zu07Qa;9`toiV|ArJKo;W!FJ`Yu(PGLVQY(mv>`B#NoG`n&O0<4HQ)$L zt9_T%$B5()yzJXJyQ)_u#>~i42sr;p4C%u^@mRy|srHq;cI1uRAgbrQKlG@@RRZ@f?(^fj#FMAk}LZ$iSg-`ztMGZzzg9INE4GI?i zRWgAD7K8x!x#WmbVqFdxRaSGCD?%&`nuKAm^%aDhSB}?Pw2AL+nXd&x7%Ytl2v70- zjjSE+gV{2muVK6%1AD3OsrMbdLWno1IW$)=4*m>crvG(a`7rN!6hJ-&34S4wikTs9 zxZ;uqrq*@*@{?y=72?MUh{w1v&jRdrZn5YfoK3($)IJl6IkL^f6L~N)69atlVd^V{ z78i=5Fy6jnkR$Hfx^5QK*3uT=tB)q&YUgPnARA{cH~ZoAV0l(u+_FJ^3;%pQNDxJR-O{*1i9Fw71+DrTGy+v0zhWHQ!&&o({h(P} zr5wO#1ylcw(I%|ccw@oe4jw@cHiUXtE^LeF1A%W-C9n^C_Zoznrz{(tk){8|z`l%(c@3G7n=NRKQ zAIls?eatMvGtFktC$`b!O6h!Gv9cyG{Ivi;7(?&YEk5o4uo!N{l> zn2m7YsAwpNnQEI%@|T^ssB2{l7{o_vLx(pr5mLDj%WN>NR9d@s0wi0*yi`7mQK0L; zQIUmWWTWY6OZu6EArQuZ#X0Ry@EUDhtKXU}D%FV)7W31hu&Sn`7Tntcz~_*|Wtf@F zy8?0mq<|2OJACj9?ds5(lQ4(;lxum;RV%8_*F$na=J}{s@%DL3f#-!I6u)B%qsZ`oZ zX+F;K&litt%b@#@a5wRB)>8}dfXFQPo?r;7l5=Q9fM7$6&1F{&pn%(eyRhlg`s|+=HGHu&f)}gWu>d4k6Y8A(5F9-0dS|=KyBf@Xx;RGSqoV^ zf8zqJg}@{5UqEYNJUY-?XapP;3G4}oBXTd)KVMteE}Lym$<1SlMd{XNe*YRGa6v8% z2bbyd%?!lHvbpcODUx$!^hbpyC2s!YCV47xdBE=d4~`*txRUATcX-ZG0hBl86@QGU z^1W=p-+ntFkAc@Ao|cfK(ATSaua^yoW5|}{bV|A}$FD`RV78hvLJ+e-rZ|Vtp8L)g z90tNRBiAcvx8PF6BM_eBIQOq=lYMJ(R%&ly?O~lnAp?}mGSbbPY4G7zQ1aekE`<*3CU?{&8RWNbRq7y|Ol|zu_i2b3< zG!CAdPv&=1XK1czW8KQekHv3WN21Gn68uBLom~1U&yY{>}I;v+I5ASB4r^D*Wr+s5t3%9F>p%ZYF`|f0)$ZB!URxTsKG+O6Pq!V(gTIc{;65zX9ae4r~Jxqha zI8sz>t6kl-^l1C}$EaP3{Cm2P?FbLDbOsN~;S(*z-nI-%c!Y3t;q#pObv>uI$Z1mW zWKW%Uz;&f5p3__FVC~UQJb7m4KxYj7jF9s2_~fIO40Bzb`cl2p))Qv)qaTr(+bKir zvo~`VQeg12fcW_xXd5XAPb|iF3ajnC0PN3z z{W~l6%eKGY_mggo0v~a-!p<4Tly@QFvX6Q@-DLYP4$13qmuNgfA1|@`t%`Hv@e?2G z(DwY5r%77~IH92+*m(+Q@mivHX59U>9W2iY)5}{*sV(j2ya0Ziou7bj^W=ytti7gt zS+0S98dCeJU5LefbeYvUJbR-ozoTxG;yK;slq|76ZXG=+~Qa@|0sKqrX%?Xf7} zwDyn1fXWq(faG@DEOTuHo}?v1vCr1}L85q0v#XRXb^DO?s$U&SJntAX*2^OsK8Bdd_&3NN#o5#va|cX&)SiT3X(#|i!OKTnTtMCvAmRf# zJ;zx1(2o>JOZCF_ksbX{6C)Gv#@SQV<$+rt(s$;-Vo=|5T02T|;#HDVqp_?%7_0Dj z!x%Ge86$Ed`>d&q3Z4=^VYS2x7W3a8yafp&{xmhKh!}~`O)IruF)m*;-Qk**S5};# zCH!HJqF^d`jo1c=_R~&l_E&MMj0q^uqh)*3wFZNfLdi1lN!o})`7y|j%8dIlqj)ss z#DM>lPV{|F=d`7duWRAQb&QXGcb!TZd6o}|!;0rg1!)N?_3TlG_(9)#_eYQD!I$?W zcmerLrv0}b3r6Dp+vfr$hYC};i7`~_C z_!@K2oN^#mR(&kBe2Hsu+5{`ws?(C)FrZYf79|IUEKD;URPVhV54XW2BN+^<`Wm#| zE4W+eM!E3-ipCJ?6xuf3WG@)R;LM74FeoCpXnX@nC1nQt-5IZd9>O;w9Z{q=R>RT9 zZYs-?CAP(^;`Xnu%m2gGIR;7Ab=$gZyUVt1+qT(d8(Fq(+h%u}T}GE}+r0ID@3|-L z{UTOm?46OnGS=FAV$5gI8gqLz1Ghn%;zk?A3AUU-{k#?y0%0-*i)u5!5txFe273&s zKrF~GdGuvsJ%Dq5wS1g_15yxSV-1`^^J_6;8l86BrUszKckus4%i=Y{ijgU1`KksU zM293Eo;-+4P}9WBNPaFwVJ%S)$#+2a;C4BN-eEqiXc?zKnF}fbjr?0caCEzCeD>#h zq#KO$kw#EZrmSH5pfcVr-4xoV22Ln=WId?3jWX#sG&A()IR~-?Ydv!*IgBD#CoMTw zJxph_zZpRB1R+FbL$!Av#Dr0%#00T;L|yd38WMFL94Qqm1uh)MWjo_1asf@DSt|`C zqr5=3`3JZ<7LK0}CFZeNE_Wsbm~se|`5lpKoBQU3ST=U0;>eTQbrjR{HnE*V3ytV) zCrF}7-5`!oeqpbOJ@~RkVYEd=ydePm`sn^spc*h3FS%UV1mki!=}*r?BiMu0b&0mT ztOo2<4LVLGZg`| z@(yTBSEvPvBB*edTu%C-!=ksf zTKi`mqf|kDRBF02!Wa-!fs;JC+^uMMSgnwMc3jxn=L^O-^i-P&;e)ppKCxb zNmDwRWYi%qvt=%nC!i6|$ZFVvs0tdOv_6;2279y7837yORxUGxG3jYKcS(tuMg%(o zKuA0`eI%&xxfA-Tg zPKK#8&1M{%0mj%zW`k)z_Y})TU8pm|L`g=3FtVXXk~0MRvRSrlC8z3CCw%Kv>#uC? zQ6y*&d+E_A07ZA&(aN(`fzEh5S?_RSHnWo6Lc7>S%&0=|Pugvbl(cit)YzYLl<|8c zpT%lYqXIoSbVv+YpNF~L44g`Ub))nXbA`NCkZoM9M9Src33?LcF^p?}((b@^bnfo7 z)9WYF*=lolY31K=I&t14O9_GBIyaW)jbkeKDW^cB%xEuIMbcu56&d|$#?R|UImk^! zGmAP76*@sES!$jKC%a{;0d!Au7C&eTwRU!zHytf;?z)Ps1nx_9tAyhLyQ#-`alI64 z{A=UpGVzP0E|rl~O25iO&+bm}m9L8*7*_A5^Mh7k>dW#2=dCtBV=A$1KW)Ua^=7*u zhGdrj$zGz>z$zMJGi5qvE#|*t8yKqBWEM^9DtFMW^V1aFTt^Ph-qdHGBE`P{wz!uD zYM#_Dxf|M{FPp=LKe>DWE@!Sne!SD)o&DAj)#;sDxwPepX~pyhdfm{{>O;4J&|N4u z9m6j2Vkg+umWM>UxXzi_Z#D{;90bnk&sY#G-<8%h*5+{xMS-l<)2_!lmhbmq{1;LG z`!?H~PB)@ra!jqZ5Wuj3YQV0+k{cg3qSYW8$I zwlXl}_jVWy&nPKn6Y+{U2j_shlKG z*E6u@IjD^3SJ;4E+1JPm^2>|>AJGv3qI@jRV7boX)f(P7_c=jjBwkYkKzMl36?0AgCXY7G9efr5@?5y_MSAjl-g^iOu!;gxk z0-!adJcu;8An@gWvxQlBfDv%i&k0=S^u)URNbYs=7P-5emFI6@3HJ{0Ntekj4gBaL z&fK%7``hH@83fnq!aM1XhSd#O>^;nxJ9tOz-yXytOW)50Dt+5tZ#p5`0D;dU>edtZ(6MTeYwK5h^x0oJGhgy8V;HED|Y!*eqXO4+$M|X5W_N$ zpzca1Qr-mWIGhb0ayaP>-Ek2o>!F5YIqnL4OLFkNlxVkNI(S?YU=xq!Z{^d91mQ@+ zZiD?@Vfbn+Ev-(?VUNMbAW<=r(8v1r@Y7YZLPB2g)NfpPr;c9i_5(&p)lUL;FLh_K z+4)n0{5&+9{7#m4eFQHxdBi?s$>IoBiphE2$y5EYAHmINge0y{K9C$UQen8LI{6l#>c{HDFR1B>BDQXC;cL_B|3izQv zu)JZjem)kNj$nF{wN%$;aOKCm8`@yh?3ZmX8oT z7ps|FHIJt#aOsdIF%yx%i&IIxo77D0$*!!)e>M-SPBsnbj9g`sl@wUY*94h#k|DUh zpS`Ko?&*(yT)6cP<)99laAA2#(C_h`rPz2X-r}RM zxY$Bi#gwX9ZSD16=0^t+jSjQ8hasg|5dr>Rv6x%06YacD+42*)F;jiAGB1Shyds#_teP$<_% z4ldZsACsg`tT=Jj%*^uIXmt%t8cjhhQpAc6_yyaDW8D;tpH4FfKNpO;dp!FLAGtMs zV2?PBWt%Pr_P%-fjJO!$6XL)1pNt?_4~(?EFn_B8a9zJOYPVQhSHw;k1dBqhKQj@p zGf5hT{gj-J{p0pf8D&hc2x%qt5jP5eqHL9byx_3AqDf!l+Ev>JVNDCpuYJLUNry-k zbQkhZ)2^TWX*0nN=v1l{TQ#iWyxc)phAGHlsIAmV&gKXOJ~d5WKo@Y#CZhxITNRn3sKb#38;r;!fjORpLRJ*RXeA z?-X!CAMm{VzVvba<g%xJC1LO}? z7orC)D;{6u4TrI6b=d=OOeKB$s4;?s91BJ`OIv9?Epp7v*n%KO>wA9(UQBw`sA{i5 zR@_WVH?ye$4ldR_2q$$?^fJnz9Dz%`_u;A?&tEWJ74T+CLF461@KBRTxe9YZuvO;M zB|#z7g122MAh1ngFrUGqNi}E5jfuK0AE|Jo9K%wVZaPSU1e}4C18TEpu&Q*jH5pb7yx7H(B?H!s{ zm1Q^Sv87~CW;4wg$5MZE>Aq~5eE#a3*bC7_U7u~hyBl5LCv10VL|QtP_drxwv_%5iAq)$+vi61Gp(J z^y6?_-)!fyF+q*Mrie|%Kc18buxlEzWv@GQB8HQhWzEqe6Dp;LEcLs5$2TgQg1ZE7LYR`k861Sd#_QXvweJ&^s|ybIYz!_%6m5B#JYttfvgcnqm}f zP>d8Q{xCa?-!pX^{8perdm8SqyJzs)k=1SuJVuSgsOKgvZp1E_aw2i`JIlS3L~GLE zBKl0L50L+jCB_$r)n{#^MzGhz4ucrgiKEZ&0LHv=*>2qo`<*IZ!f)jwC1i zE@Ah+!yL{hh=ZJI8s0Iv)gYYSD3T0z^f~v|x3r4;n-IX50oE0IMbJH75rdJ=V+aF5 znEPB6n4r1fK)Lr56L@84uKN&FJg8^TgG+75vS9Fo5yR>kZw>oO>Jj`oxB?SEfx|$k z-OV&ar3bKs7l&Jf+{V}kUsZgTSAfb%Qsw(JfU7`zA~n@MKf$Z_Max1}u5tq%pi@WH z;+WesO)a6j*$E&mSy{`72dtwCn%=)Zq@oLSL-l$ zeZy4|7Vuzo5u+nGrF21*spER5=v&inx&v?ZL#zjCL)3SF;*)+B+(j z9wKp6sL=#9Ki9rR2n8&r(t?-uYn*ucb{9u0_8~O057UzNRw0FdMSz>KlhCuuWH9n7 z0i#6-hveSlSs9`yWOIroqxktT!4-(8=_Uvy*I#5IT1H6re>KwOXKkPwmGG>al5f5I z7RAn%AYl*jj`ahSFJnZ)4}$%}tL8Q|J%GUVIm2VrGA}elrk~>a>hd2sCWMO0>ET*r zyS$p~Be;)gXoHvwJW*UI*41a7Tkq0<0ovpMl!+&ucaWX=?TOaqM9w@10ndOkv3nyc z!hZy2G7`;&&#B;7mR6p?hsSG%3BSO|8nscY~o;5w6wVnvEw_ca+f5#Ac| zhz@>iO%P*Ym1}Am)b+Tl!V1xSz>0u(_PG^**(+!6ifz083O{11vPI(d4vGg2;G6HC z{#vN7zeV;feWnTJx(7LlpglsQ&O{dx2}3BLJp-$}>Qsk;7x208mt_E@E6`$U_8-}F z=!9bwyCJP#?e5`aCe&tXhkn>Kb1-@<^9Qp!z3u2vv`j83Q2X(>W17WM;sHF(Lvytu z-JO^Bv@K2npXVao$I8uOQOOqrP*!8wZ+SzzXqzU3k%8%6#>@vY^b$vu9K^JC-6fN| zo=TtfL^X&<74gT^Pm+Xt?&RIs$J}3EmGu6=e3bEQL+Esc0va^b;^kHcMuOs4r60^U zftHHQr<~sx2pC7g#?B3(RZ%t7NJkoR%K9jVeU&ixrmyV%MX^Rn*7|n^AeYO$%S+zr zvx&*(?3}8#*l3!8Ph#O&r8PHJC>^CL>&QE&KW!mR{q%gdHuGa&oBT|zFlvdFWZLL= z{K|H}718DCTnF>7-K4*7ciquRN1@Fl9lh$+*ZlTxqdmJtA1iV1 zP4@4IogaQr%^q}yha_LXfH)KW%3o*ImH2KOTHiusoaxB3@sgu7nQ5)H?~jwUe{UGl zat-MDdUU<~O4D*#rcd8~JyqZI==%C~yuL4MeC4PVki{Kvz+DS=F*ILD*(W$TGAk-G-hE-T}lcv#jt$tR9rY~%`0xy|4_ z@6z>?lZTLidqiUYeExEF2fx5|>0|md_w3UBQEnu2UXwg0Jw%xjIfT|>BM4RcSP)P# zTY9Fir^lsHC6D&BG1bANIAAylUnuD`qQP%VXVX)@GzQ(nZQ?8cuX~xHQIC{oI0;1d zi`%w6?>>{tI>iRn%OCQII9_EPw@vPtsF)Zrl#pT;tfV+vQW~7%8#`xL6X)MT2&;IF zbDDl8XgF1sa^_ot9-xoX$08#15 zioo{1HhHDAoUQ!p!BJi6;{G4bF?jYRg!1QVVlNky*e!9g zlq&9xnUp>0pq84IiA@;lWZJk5$ZT!b2=e<{Am?JF>NjSjX}yd!hNJN_Zg_MUG6qe(8sTrCQ~oftE=AF z7nd}aI0RJw=F7NHK#eve6d9zZHhBKXT!Ufn9e?;Wl*@JuoOEwo>#=C@w@L6qObBfN zjrB!dP6Jo3L~qPJGZ4lj%(a2$#jY#8%ut2919%7nE0yPsQM%_9U_AE<)wRlg#6Wrz zB1%M1x5J7(QVh#T8kb{>2^o}|&8dH6eoJ&QHRTzW-A$1*&*Id0_jWnuIcNQC%}J== zTMUL1B~D=jQktS$7%%s&WX$IyLNgB5RZmV%BSvRiIwWJ~;sQVM4RBKwK=!pQ0=pvC z4f#LPYip0<1YY46nEW5pt%DE_#KL_J1REgF2)R>LS@fk zVL(A9QWSb))pKIN=T914`zHkhjrorOBNx~$pmxXgg*RvHheV-S@khiWmKRFRY%=SI zwARddkZ#f}Hyr;F5)rd1S@~w1c&VwrfV^5}c-@$!ppk zl>3%m<9$C<(FE>KPztQatE%j=?Kf-Y8KRz|PE(B5?|5_`8^~uW$ z+>u2mMjXAEj)Rn!plZSB=Y)E1G-9;Jb=QgKgo^$G^b1T|m&^VZDg|H;Zz17sD=wiA z_?i6O+4gSMPSKWmB6RK6ih3wLtosGPac}Xi zx}|ADCc@80NO-U1Q73j_^5-6Kc-mgwBXMp^AVD1|ejwHfC^jL(O9pGBmO%2Pu*0T> zjeCL8C4EjySI`g9<63Rp1pW3WGdcO;P_|JASXa^V(Fi8rR^7wDdtSem?|r`tw&3j_ zXj9`Mi@7vN;mL+oN@A_4z%Se;Wj@PLa#@oOzwVm`53oDD?H6Ul zWUs8$HD&L_7w5|!?NkYOcka?+`pvWfS%SbA@i$OHO^&*2UZlqj*2A|;bXtGS9CZ~1 zz)V-^=5o3(h{gl6jFwRgyLqmB1m!`&2FxqV7%iOpCu4yqPp|~D%>n7~@vyqmmbh82 zDJ26h+aaHMtJ#miy&IFay$10oBJr#acT@VZDQ7G^lI8e5p?mra+^z4ZgBT;|`;yV! z16Z3d4fx&xA%Gl70W4B#tZ&TERXULrK=!hu1=Hl-Ja3ouku!y0xtTg(2s3HIEwY72 z%DhVLtPyBmpQxC_E}%>dl9`yLq{0Pt`;;PmWmJW9jFSNc-+3M_#tDQM8G_Gn7eM#z z^Oh_RCIr6@zR&BM*6}9p-flzc5*1Z~H@+82Fb)kEn->(;*>+Xk%|}_4?%@^(7$neN zi5qMhTbO6vKC0%RKd-M_W)+*wTkd|Ve9Z0$hp}Nkfg|LtSuY{_SwN*)ij4ITFa$tV zyeq-i`(_|#0q=^p5&<+c=jleO+hO>c>7;XLf{BSRqTXPVdPeO%F*kly=T~id8*nPp zzUe4Vf)dMPx}iQLxDY9OX@=XMb$T~F zJH|k~2%GXMwOZ~(zIv@k>Y!Q3TVE$+fr3uNbbW%3U4E`v#vvHY>pV>oI6;;ZlHT7` z%(kCZnnf(;9|MGohmbcILdoL+0$>AjkNC16mJ;yHhlrad2`~sNQH&Tt5Z5&c3|@gF zucQs^-4~TYT9@II;Xm#Gf(0Mnv3s?(dF+E*`1%+{iR}4Qwi$fb5 zh^D_mXn9*NF>Q8ehqYGXP49jc?n)1sH1DqOq1>74sx)BVCcpLPj+)~Im&P7vvIpkX zq3UGufMlg%qynjbbeLdWLansWPjcRpF*GeNC=%bv9e$e~;g%(U6gzs}2b>nCc>t^l z=l(Okg1R1uU)0+}9W#vHsLQ~k(m>UX6xgYY9r0Af%CuIOGbh3|*4 z0Z_IM0M%B{60R5BMKh<7*V zU7-HW+c>NXUs|2lG~1UlgD+{F@4`hsE-H@60$X3pev>H>`1?^ncMFMCsq9H zP9}AlLCf4E&!ABjz}I8?@}79`?|1y)H^~N#6a7_RlTWmCpGO*Wc?K=n@Xr>+EVq?| zZOI@FTwrkxs9mBLfeBBePKrWV=3=c!kI(+zxA z(2A>7Yto{W84bSpt$-sl=X(`^hw+!Er}XAB=F$G`#?8wLbU~=uN13m&mTy-bx7*|) zLIVlLVD5Fl|4XVXcYd&ZNIHN(bJ41WS;Lkk+K%?^PiACBkM)ZYmh(J1{Y5wD>lovx ze;xe_JVhulJZI=LZTpEL{&qN(MJ@g_52D8)nERNA9DgI3vq%`L+l0a7;lt-A1~jO# z0_Hv)tfX}wD}d+c6~Q^%*vTk)&EXUcnc*-vNqKJHm$t_^0v|MJA1J_R`HZVGvMPfm@njF-T zWLXma6UF)F1q1el6~9~r~)`;%h1u$5KXR1qW;(=x4@1SYF|bKiKvIUZ(& zjR%o$JfS@Ul#ggL`PV4Ly9esrwMZC|xomd82{?TZo;-GsM+2~|2bkt*_|HDT3ULks zlUu9P{&PkX)Zzpf6s`GlKENpG;s$h&oO;4#^x+~Elv+}?>E2e?Qb5V~FEOlrKp0c&K ze*F>B==IoZ{1Tv}xs(v-kBPbzl`tx%q8khrx$`CjS2hec+L-#JqLCE=JoIuSe8A53v zf0C{J6Usr~%g1amY9(6C8Wj)Y0>QOO8J03?-}%r7But06Q?=%Mh|p?;mV2kW$9c%; zLB9S4e~Nflx2a{vF$n*JRhK`mJt%kM+6bK0Ou*JRT%Q{;=%u@qci<^3ymUPeXPcjO z631gQ0iX%n6OPM{fVqncG7mxyg_HOshRE5ss|nT{KCn$i5rIgmf}s$BIVw(d?FvSi z$T)_I`Mdm;ly{Rb3PI?XSuOf1g3R9RQ?21pe@cX)*p)O(Lh>&kEz=j&`}xMFp*VA8 zBnX)Oi1EfNm@D@`vncn?M6at|r_vvr1NZ$e`v7nbB#MpG#09yq#Ob^-KIiHzc&~oz z%dZFf^uSke{40TE3qjQ~E`!1OVQ-k}`ZN-SYnC)S)XuK?Z$x4Dt8JX$vRAt56r6LO zK(FREqA*EpTQZpSG+EwT>lZ?{wSXyoY*JDmWwN*g#jc@b8UHt-@bBn4H)%seeu`27 z7~oriX@jha6n=wu3yN!{wRv8;!tOb<%97(??ujvRXzFA#^$X}OM5Ln6RzC=bzWMpt z!?r04*haK;^zATA#L2ocpWoj%G#F?%l=Co&aW}>zYdx^hJq3L9g5P;#o=mX_aY)oL z%I5gz%;&YRh3`?lF|IqkPOmMqk>7+hJ0M8JS*Q?cB13vJqrSREXaML3M*GsYA(mCL zwv1am#8$PKgvvuwoPAUSoV}}~SrW-0e6my`Pb)_MT}@lj4&ivd@d05{IcY{=6$rCR zQidc16I-sxY0ltJfAq^6u0aVXdSrucxZ#_3#V`ciRo_uD4OVYRgDv44V8ai6S3vR` z;2rx96e-)AhS-Udbf&Dom?0{j7hMy^N%}54>@6iikm6){zvaAc_>r*Yo$t!To^?vS z?ip#NTjt775-18vNeKl>2j?>_5`Cfvr6CZgSzU*wQ{T~>*9lu2MSbifj#>596G5F_ zo~UX$E!vFu<|*G+@e%gW?FT6gaKO*NxlIBItYBb;6V;k{h74sMI-6kTMci6(Y9by* znG9f~-ahA!$_M9;yOxm;Ip6IA!khJ(jFR5UVkTF9$*#)%c1U6L$v4G$FF&yx`?4$= za2wT{WbZWRSLw|hBsA;zd7++e5Gkwp_v>n7F0QK>@#3u}@8YHk)4swC2|)91jjfAG zv(BS_gx|dS?(r0%z8EURknsx6%)$tjewKvr#bzZu&MO#55b<4LWG=mi;$n$pD5xdF z4>+r=GGu&=ZOr1kjThr{Zv@VB(Gf3($zj~H^vKUu1(LGB&_52&DjL*rOt!KxZlk1< z)t*K?;qWCuqZ!a7K;l0qsR4hfJ7IXr;?KLsQ-2+Jv8-YPx&X8}z!}M_#tKs9%xBTTf zk0#kFFp#;NDMWIGYLKfR9=C-nmI#RI>a*|5fv_ApV~pU$8)4FnFb70F%pr$hFHGh% zk!n))M#U(Arn#Zo7tJQ)P?j|R{AZ-jRYq%>JG^YCa(0zl^d3FVIl0KQ5&MEc!vym$ zWgae{6g-WVFA(@@ZMu1PKOpAlNByLHxFarhFGE-@$BhT+6H1(N94!;wd`=Tg1_%_& z0}DlwB^?=8;`q+NBY>alpAn*YQ{|MZeglHg(-Afb(3zA=)wCV<=wc`qD1jX zi|6ii#PptcWmbhac5{~7q2k+=|TT7k)06 zOUI*_>_u_9bezo9&;s-Q`jsm~6GTYYUdU0);&!*1AfXGDmCj~;bL=z>m@ZqDsf^fExkNa_=wC>{|oJT z%l+`P9L$Zw9w2mG%B*z{4g+I(lmA$ z*fXBSzH{A9EH$AD-|5+54DBbC#%+l>*rt3*w(g`Ki5Ee*7T_tTcOko6Rl%?kG<~nY7Lg&+ zf;|N_-H}q1v+6g8x}Jf%Yqh7(-kQnK!wbmE3kVm^n@>P?H=hBa!2d4orX$$>uMcpi zRJo6I_fhSyBkTR|W#wle)q8fDUL0LfCG*X_I|1aSei?82-WdE7Aa-JFM{Po*0s%QN z{8xmSCQt%F3~>0K+cB~*qce9hvNijU#HK`5$9|O&&F`v?^FieeDNAOgGnUXcxweKo zQhcVlY>c#Qux5{OO>m_yFDKZWLrz$@KW*>I4Yy69j-YEcP6*Mis1A`4%h#{{3%+12LXKV$h3_bOy~gH4MD1r6rX>KPIX&M{T>Lz)|TGu0X^+AmBbs`#QnRtC9h_Y zYagc21>#9ps0h3TQDbuPZx{A`C^DyYj}_Q0tEXqHTex~%>kB&x3@+2hrE{aheQT~CjX z?r;n7F-VAtP-9{uK+U>+9(v$mY@*%slJXsur(8l!W1{M{YmN%TC0#dPr;<90Wk;9BglyCFX67K0+M#rwGJYv<>z-cvih*98b5D zmzpM@^Xt~k!V=)#gIeghxKs4nL2o9ge4{_>ypSU`nw)R{BMWPdL|AhL0Rj?%`0wpn zPX+OBM)SXW*4fq8*2u~8UtyTmH`tLA;~x*;zaV&!<;A#s=9$Y;r1E7{$~-zQP6@Va|QH3$?K z7^cGaUO(%?EV{Sw+$N)rHaGcy0AMozXb$m~L|o-P;qHn`PwKyY8aG^HgyCbN0-pQg z7FazmDY9h_L#SQ2c}5g;)9#mdBjvFi^)!3=NDEGiFY3|UMWaLA_NHmg0;w?)XA^x2 zoUw2Hn;(A@{QiBG#^4UEFvj?2lqWMWD9!Y$Y$=Svpl6xnD2Rw_c@1C&29V7t1pDi} zVz0$(&tt)>Myqz|z-58}J)yFubgph06DNtJM3i9#!0mPfh~}tPqbx!{FJ#@i^baJY zRd5o~ee4&S+fnXvq3+LkU*g3lRYh%>Y$o*-tcM1n#`}XTh1|UR$;k4mR-%ToX{GG3BnQ3L|H8Z6KMV?kofvvPw$0HU~ zJSfrl%`kU@y9T+vy%rwr(f%vW2y(AgWV>iE@m&HipukIB6AX#wJS+nHixYmu7O?(G zluFNN1maXtBRcH2Om@NU_~cIWo!KY>^WPDIH&XdEgxX=E9hGl;0@_qQA%+6Whk{2# zHZPvLr*h}usTjILZ+_h&JR?Ta7)$kQ&MARJz)*GUXAqL~VJ1RfEssq0mI=pJY)lE5 zGV;DKl74WQF82`sPBM^J;NQ2G0|5m^Ayt)j;K+M8#{HFjq#}JpLd~l=9TkN|oVQ4I zAg3Fj3HJ&~?}-i}1~~2IuFo4m#iI|jg#Izx9_{3Wy5xF0+z=1LJ6o)qy59-hXGW`5 zAXtZFTv@o#F{+ASlr!?JhO^-=F+MTc;m+ySW48h(OVk+5R(2dtH2nevRnVQ?hFDc> zsB;c|`!gbZI$`6IVmJYV-M^F>4}mAbj!N76ctCELTXK$31$df0gK@M>)cgbM(;Y`? zJT?)6-N0(U(;&QS@$GAU9By%n(rFI?5!hA*?ygX>^knP;3CAuGy&ob^OihAP=A{Jd zLqaIxf}k34R@3j}gm0f9mSxDC@&URStNv&bq~$;I+&@4&h_RbYjCXr)nR9^ZaaG-l z^{z?IW|S|O0`O3K)Vp|@azPEe2sRPv(0N*zrr;C_%HquFWrSMNn=_3S`Fsv~kBE_5 zoTwmNqJ6nAFbsV8hAR5%xA>>0ZPF$woh5;85v2xcHbl*Mif13ag@x5U>VJHvD!;r1 zDq7(n-x(AmV$f%V}nl~l{)m%6VzbvzN6?x~d*VWn5 z8O?^q=MUoLy^z9{6BNAj;znyM$Tbjm;ZzVq1G&vi=rv{dN!s$yH!?w~XUmK{_#v%q z;=@DT0Arz;bY*J*`+`X_k7%QPX-Iw&lT67)Bshq1wg~B2!nt2EMhDvCJ5R zN#8w_#5{Nsc{h6NAi3Hi@=kgYIYbbFC!g}v08vOMtTGglFr$B3ooj>w?BJb(gb0)@bHp@;2`eKRcjyvN z+0pLKABZil=Kq>H^spH(-Uw~^<@s038#~b(2-*T#&)DKe-+lY+463yt=K27XN^WDI z9RNO|cDq)Mw=J~8DUkb<_sTVE)&lf%FbN3tHMupfh%IYRK0wK_Lr{a*l%3h1syt9CD-oF_18jd1=#35&8I?8+7ve)CPg=yE*jZdz zem@%gh7*DCRb~6AhBZgaqIcQ4$R#4#7LemX#L~Sq+N{Hmbu@+ToyK>j^$~OTr*L*L z1wP+VYiF$RnttEol9G8Bq<_}!vG)bY+JX_)m{*b@(*oM-%)-N7=GTR;Kew?gs5mW7 z;fnxCxDs;Q;0uH$FC@KrTYS7_z$j>C%_VM-e{<6?5;NM;!C+9uKZs67GfG9-=o*!HN6bE9v$4`?5FD&ncjweR6O~043>AITA_a*G#KR$Hz&2O z%5LsWVU{D{9^8DwKO&v{=E~u=X>tKgYDaZq@~@S@^Ega{6eW6XWs$8-bsRGcxs(Lf zA1W1OL^9xJp<=VxGbGGfGLTyGWI!)6y!yEEj8jb2`?^N=6v}&}Q{`)DMWxPODQk=G zwh@>1-u=bxJU(Gh*SZhK@zd!`c?atevE3&B*LD7wDBWJXQi9u|V0Z%zu)Qi~)?96~ z{`JsO{U;px1ytv=y8dWH>l1{FcRH^$Hi2M*tAbpF%tfFloGT0tsV!}19RUBWv0=0Z zSFvDi6H<>o)RUs1OE5i1+Z ze`Iz1$>a7L6D;xkVEE*_Kxv_qmjUpg0P`HAo{|f@BQefq+J-=f&Xpt1t$-PP`P6=T zvF&wnUR&ta>fQ;!^NHDM1Dx%KlwUO`8SEU07VN8o>rrg*3yf19|B5b|8WEEQaxWuv zLqNyPEQP$%#J+}ejOgg?^T{aySv#oWIz9-?7N_j~oIW@z2YcW|1rx_}X;eb5+YtY48&)a?b5wP>>p%rrN@jt6x`sV*$ zUVpiUC>p2q9MJ{-{jzsWsD~zC-yqx9fR;;N2vimrdB)0^n)-L7KH-|eJPis6$c_BJ zW1N3R>i<)<{ofeJ#mVg7u>3+BV86zW`uR_Q<39yKJtn{EVr`7rkW~8};K;1QGei>S zldYPQMBz)V-E1Co^|&wCYsEG#dI!KW1r8E>x=-W9xyOa$3h-RGLwh(Pd@Lx&hdjeEqqSl*p0pv zp4s{B5*(<4^gZh>t1CQ#CfhlaaT#v&!B!)nrFj3)z0@ILT_&T2ILyxpVe$%d{vWlY zn4S6E*OE0S@7t_)2#9B*!KREENl&b#Z(+qZds#sP9Cg_H=U#%3IFm~W0aSqbWJ2Do z5B{U5)W7Hj<^`>gRX>`-G5K0(Coh|Yd_;dir$nACj`ZogK@JvoAZV_ks#s9>H(ZBJ z>E8LffL5Y;jsO?mlhY`(G_e!6_>N)9CW0Q7G%3i_PoIt06_bgh%~4rv@q45V_?KUZ z&u8r)T5Rsz2tEPSg4825sC+WA`Jk>5@?_4^`!6 z%*EwLf$nIgtg!Q>#s-)zxO49BqZLFSQ`N4KkD6Dxt+ z;gc>4ZU@rjfE<^I7pf#0$+Kwmw$gLztXlEsD0etr8|qy6@#6M@j1@jdd$lR1OADvX z{!|(^ReMbrSuJQB56t%*B1{Jz(+tT$E1fn^^wiur2jY!}&jpkg;W(7u9?mSYLK%-a z`)rc48ud+tnxKyV3L41{=Ru6j5DGJ{WylwtCW1n`e*dxV^c-dF7*zLzHkUCm+n2e( zO4#EkL`+{BO5$L#kbb)+U!g+b9$w{7mNBp!FwPuO;(4{*FZ{xm+q*Tx(@TB?uS54hAc?PI-ELy zkC|_+JtkW&5#%#Ef=P*}Eh{2l5>X5F%n7Yp)l3&O7~sJ%$5A|h#8Ts$G$_aggVCo_ z%h7x>F5HRH(&$8cbvIinN(vkvDzAWHS9$4R-f^$jXy=m#k~?Nx@4A!+n@0uTIFFYZ z>hcz9Sa#%4&4Mj|58p-q&w3D6ZIMTO0amOj~-u2{E zZ7O1;%km*y4~s~`T#`A z_2A~bdg@~p;+kCHg_0kr1|yoxtfG9C>3t2jn*;V3#(Eg(wZCR3C4J+Nl24uyjY#HT z5pZlCp_($bid`TL7P)_0?XE3HM>9$`=SMzCqs>B=Jv!a~zO$y*^lyN*H07i_e46FQTGli5cE! zbvDR?PMd1~;i$BDf!HH>5lJojazRBlIs5~pYoHH@s}NsgH3h^!DRB!kI3fmy1@&hW z6Oz4P|5Vj`0QIpUx(hyKJYHq{Qpe>}rvp%EJ-pPx*dEx=h+4>m8mjRCQa1jaAwW(V zFU*R#Vo17KZ)B)tS2q>?L6TyCaZPj27JgylDx}CmH@EcAzQU%38z?}dere|tZkH`7 z8{!?2{BP~dp(;Pfvz>IWA&C8~$G|m*dceYPDU11n!%a)9!wz}D8@ob#{i>%NBL3vY z;Me(-Nz<{}wS5%8Y7aTYgF|0$5+E{J_HEy$yRtyy^S(*~h)C-a%X4!$jnXEdug~hf z8XSsiw}X`TWsSD&!uf&DtX`qyyG z%~z3~6GuW%<@owOeOsi%aP)l4m)XF3mW=lm;Gas{6XASEEF=)nJ;{H+)&D`d{`*!} zbFsAfw_Jg1{avoO^#*{afj{CBCT44_$r%&ep0Y=gP7Ph+WBf-=X-OlaA1S}PHVNqY zk?5uEwoATZ3ydR2oRGcau*uTc`8D8pRQ|Mf0R1w%7jh zh`Q$H9CQyBl_&_|I4C^A)d9#4epQZj$2)p_TxR@M`|B z`hpxM#(aNFgy(9Y#p-1vHJz;&^9-i(nc{8wHi~oXBYlztNc&lEOhoC;E!S_YOrCMr zFG}JjCaT+W zA11fI){2q!Bt`D>?Y_#A>bCMfZt7gclm8fvZxi@KNE)Mr`^^fdXy8R&cMxhlxAjiK z)y=KF;PEP1VKXM#EX2>wuSZliXXB`zT^8EE>6*&FsUvIvg2v1jprayxH?S`LOT0L& z4U8*bLhf(D9`4KB59>S=1}^l(%==V#yCoQX#?g*+BK}l|3khi14}}IHzB6GUqPwMl z&vbbzbH%nf7Rb6j@>8futgcJ_wX(9Zy7D1vmQ*_*#7KICo$aT;)w=_abt%pHODEkk zjAe}xl=~Ql-jm;Arb!Wh$cWYuHd9}Pk8F3%hWdBu4<(|j27dXHCG*G*6pwitTFSWI z#=!L=&aV5wtVaMt?|N;jZ#)u%B+{rzSJp79(5s+$f5`8vZR1`QAc;5I5`wu4JlzM$ zBfb+?`mv$Dx-dwMlj>GwLBaKSGU#Is-flyVeDw-ovGdaDVEDZXNFwY}BeT(cnfL&! zB+nQTH(()i8b*X;`@n)Zg+Mnbaz&o#w_=Ixk}-TR;sii%1otkvku(laHh9DYRQo9V ztQ}z)7t17;%PaYIn>zE4nDq43f2{21$E9CjhSz@VPlG5lb4ze0!lX9RP1KSTui5l1kd z;X&_!?O*|fQ>3)k2xlXxo)AhuK_I~b&~j!#H|u_3py!VpHB3vLzK2hv3NVMtJf|RS_UCq~8JfK^GE%N!q89xsDX<*Y%7BvMlC6 z@a?c6emx`N3Vng&=J9JN2;LX-<&ygCp@vw;n{mXyFBF{x+u7UL{%GMeDkEkg)mqJ)h?lJ1R{7mjs@w_5HoIy82iiMQDDJm>9EJKyW4Q!a|M8wabd$*00)jjzbw4}lDM?Nn`982iiiH*5Me$@u$z*LV|Ym30t5bm_Zdey>p-lp ziW4wPquCJSi+qP}nX2rH`?yzFp zsn~W>v2EK<#ZEf^bNYOJ&NsSyU+nR$J@&=AcrVs`*PQb=Yk@>Y+z;h{Z?dR3>_g$d zJMX@x2rvl1NL@zjx;=<10tq5{-(f8sSY+ZyM$J#9_pU~PJi<-nHZoyY6t5b~3Cxvb zh2{&VFe>})|Cw>dW$s!EfFb>ja-Le96S9XZU!K|sI{aE6|#s7%o z60X662N&(sq|KDtQN?1dgHFkD7LKs*m1gKH&K=NgCrctITEeIcTI+@YgCfN%=6+tMgBlcfJ zl0q&G^@7l6ac?pwX9#n-v>c5+qZQQt5eUr|^(A+xIX+}f=od4*KQa+QhPSSVK5wyz!xn6E(xAi$`J6_u7D1U0cGDe3?B0I zzv8My_rw5NoCd3yR3Q^0;~@ESbveKM0vKm-V}4XKU(e(ecPpQn;jg*cPL_Qo7;is> zQ0Bday)@lrq~cybkQNLn(9LTU$gLNE3|($2r+R|%LieisBD4S`oOx!WWHnXVU36FCw8QdfuELYy@Lp^`1w7RV z5Ipi|6usYmeC(dLM#eA%^W8HxGkCQyJhw)ds?tV8AR89ztX>T;NOp{c$Gz#MgC{?j z0B;xkydk|%Vu~aFgsbytFTN4h(RD+-H}_d`thz4Z<+uQYHP-tul_kP8Pk zGv6r7NV=pPU3=Ch&8RX;b}LrSc9 z>s`&1u4(IeHH1#*#_JM1IKXCMC=7qtT-MRT7DBFa1oSEP5(*|U&*C|g!Q?d}bx1YH zQUhjoz7#?^MqF0-o$QKK22e!1%-1<{_qz3Z8@rSz)9nM)ExUvH7gNFStxB!eB(ZqA ziecU$ay6^>76=x3Rau@WV^My@Ghc+4h*F;^#28W%OZYM#8j53Tz^_lRq+n`_-e<86 zlMLZhND+>gS(*X0dS!RaZy4IuH;Qe z0Efb0@mrMOlT^E--C0Q1raW5kU+3m`*@o9OWNngoVrVZ!Xs}!|QW(+)DSb!xJUNL; zJh>D;jV&jZuy|sbizs?fPaer{Rl`fi-1Q4qYXX}_pC&`LR@F;zKKKC5iIAc7X73EM zG({<7)Q!cd%|=KN7=Ssrk;cSzD7L8x3m%x$sa~_3i`b4jbEUK1)HY_pMKkU&a%<`= z1bDzPHNuOL3mtK^PO6R=J`S+b>U%MKsC^eDEs<}eW>6!#;|1V`52 z*T2sKZ5Kn`u)XqB167PETQ~55pq0_#*h#~-s<`Ng0NhWWYOS-)-|(w;z1OH+^IBRi1CE=x2{o&-@^(6u`}QU{QY1zqadS=Vsd1(< zoRhIe-pq(XK)^$ph`9z%;vulz^D8_9tjx&fzrDSfr6m{K|w(QT||TaC*<{CAF7|p!P$b**u}w~ zQP|kU)!E3zRpe)(VrFD&=FA}KVDDH0s_%Ma*!gA3(9m#vi`dXVAdCvzGqK6|TY z9DlnQ+@I^HB7;&-rK;&V(C|lEr#${|^}=Qa@DU0sNT8Z_l$!oH7CwG-*jiBdzG(!# zYXSI*O>f^2;=6~dd1Qavdf=6A+?*rwx|<|DfXD0$LGTs)Il#--9K0*WyWyF3n>1Xxb#>CoTRSRTtJs2*#rOb3 zNH@ATy-8)oB&&YNq_vx; zR1SaZwRXH?4?=|>LZL7?sx_xYFy5o3qoj~lN6&`q#eMsJ%TKi6zob1jE^)FOFPs~( zI!EgvN1Nq>k5}l>qrh^S6=hz|)GvA4=?82wce3nmUsBl9Z+5bS2&znu3Ifid0YSv& zp_|2JoE+o!kO?C-3SrGV!EFd~=|FzgGR#IjwMphli<~PihcB!pAnFqk?CH_}`X=vc za80g?H)~fKzJ_i9)0Al=RqVL)_FT^K3k@8ZzesH-zTo;i9 z38K8qFl7*&P&C%lL341<|FD&IWqic{lyPiRmO4m%KSTqvo4(f_@+b|Oi9td4f3w93 zAHBSU=m(XMFQd&(0Hbp>Q4)!=C5T2P-=-0fFFoCZWnKQzDctk%R}COAWz3*)$Th{y zSYwmqob)Mtu%Kp@1gcT&Q7C@c*UCr}zXFn6kz$}TCf9#)Ti%=XmOOg0;3zXUBLA&g zF1K1{0oDQ}xXW!Z26U4bux@GRkBv1eiid^n9did4Ul`t_Osg=NuRiTL1>$)l5a7Zd zlMJtjrgsuwlvK+`p!+XcVc|50`WndWH9G1-zA%9~?6I%xWQ2&@{Q(t7klf9tU}9Vi z;ltPh3L5HeJL8AQ@smJ-BNK@6LlLV`hJTR=*rx(4jiO>I|N8#%m6AkJ2;)!Wqpv^7 zd?Ndl*6I3M7dn%4Xs^X%c)c}^-f_Ozr_5mj;F9_ciG*_7_@3PMKD7sEg?*30>sIb* zA1!c2;htrY^a8>jj?;>)c`#m|V(2nVmTZwe1?vA@^ccasasGSxSI-ApAoz2jyIc{_ z{09f{S%W3xeW-#rzOuD<=&|hbe4Ko1^Jgv3#2yv|1jeYVEdEX!Rl`xKMB(|AInX-v zhv9y#%gcoG&RygUdIv(~fx_-yqASd}@F8nawo0L-DyR2XwN)@cLouq_Yi-yf+H` z%p)cOG9Z3li-%Q@;v7YX^5JgBn<49~)%tNF>ZSgSujtcv+d))~Y7$65-{ zQe-qq!x1d(VkAagenGpvW~ikzwU5j~=U8j#^H-m?IrWmrtxYTHHvdgyyHp-xycnSN znrJ-&y!Q%ZOkPUjsM4G6Ni+mU3`1pG1k{5aN4%-3)^o-a z>T+E>a%6&xyJUajIot)LggA#d8@|`fPZ=5rC%55l16hL4 zm^x<~_AWxjIww?bmLhYZCO5X*{ZYmI&9NV-mT&8=`r}rrM2$NA1i_?hK@JjtDT{V9tXqCV(0!V?Xg?EF*4sUO#1|#KZ_kiN?ot68g3~ z>y)pJM+eVc8ay+(B=jQLuC8>45dQ%|l#Zn$RoSOTgo>M?S^Y4#{1GYDrTb>ucV$MK zqEUAq(r^t&>jpXlGFVF#lZ6aWN{BNi}M(8#o z3Dbo&X5;J>1IZxyCeg(23mmbYfqiS)jU%_4>I4bl6$2d-{qcUIQ(N ze`$^1omgE}GUtsVZ1;EwVr7ADpM|@EqW9TrH2hnkkjr zd!5+&__E28^WuOF_@ESKJy_{ZA!j*Kru* z=0wl&A}MIpbaIiX2i8);?mlgb(W|?9ZE3iMHcU8BG0L;FPQp3on-4K3gsn+R9Eex~ zwIZ{&qVbsO?QFVX0+xTW^1|L`FyyhsR8=9{eRMv$z{7xhf#V3T@*NVx(YIu|_8JW8 zdqHarYma10cE}_TUu|kOxy<93B0MKWDUL9su`>JRHv5)FmRRlK5ThGWwU_1=OC=!OIe z)M8N5U;#k8YAt#%<%)7lgV_-j%!exZqzr6l{Y+_d^&>wYJQYFBk?k3S@nsdmuq;}k zZ>$F;^L6B?HDj~c7DQ%D&}P7R8=kQJjfVIMWN>U=#5<&>*SkF#7CE~G;{~bU*=O`z0tx9CWdP6NmiOxf0XHVLA zBbhSY0uh{WEwZ0MgEN%}XOngymQ2=E#O0ALbNj)bEoM{Mj=#Fn(2$|4ql)-<% z76=8!^;1Fj0Y{;%e$MCsgS{$E?hAs4jWEe)JucbURr{)}vjd@nUQ~tWUzA$zc?>xL zu~e80**!@qI=k(^WH`gNItFUhLdJG5Ujcs})5VLQamSg*_N0j`!pi3oxFfj+EJjnn z3ChwZIr%l_sAZX@H0+8HKx4h|AcGwx3Z$_TWpNZVwLcZl@8?UAau2rZ0y~V0SZUGw z%1KjP(Kvg+#;~GP8v4B^Nq8ACG8$JlNPXPXuo3l4H9pVL2kkGhD}j|LDHH-9FLqQg%e-zq5UGkaxjWwQy@r_p@xm4`ROGk#@>0MgYAarGZiYyXq1p$6L)xHA5=V5IUUhJi~vAQ;VyuCz0$o;tWUiO0B!seDS(BduP zZM-~2@Glc6hgTb3gL@1SA=N|d*nC9*TFoX3w?bqhd!1}xql4k5wGy_ z0ho*iR|H+_J`oJ>piTG2@9}>PgGgbKpIZI_%%?w{PBx!OF2!|%OR2B(kvn;=#a@^T z@OmT)>(N8Fc)slZ-7h2WQ9F}h=4B%cP}NDyX`T8I2Fl{)$3)z0z3POt((^iA|FLZC zT-g#XC9KKqIji^1hMdXVJ&1+BO4ycp0c?8L|7~^=+CJdfwm>s{ZbOw&WI!0flEg;? zF3j#x#&VzK>TMm#v2TU^md(AG_j!mJ$q}HYKpRlrmHTmv?WLr+D`7<&i!_zJYpim6 z4KU_=$Jv;iZYbWD1Ct5YEiqGOw@uGpJF1m#72Hp9j5JpxyD>>$iBzd4L}&3QF{8aE!;-uLk4Xh8n6Nc&tf0X(hcfj*tYe{vfG z^cw^>7+-emzS2@P;zZ<+7fC3&AC})mNp<6-{|vUrFYKv^w2d0_zmMR1etmb{`CW`u zH?ZUHLI3+0nD0vjpdy4ChYY&=&-{OkFymoCcYpGIsi+A5`Rrv#*Le=;E6BU8djEs& z`bXEbGhFRl%X;cxBdUfO|3q9-87*?S4>}d(-Sad)xQkc^?J1*k)R>PLY9pVULkSd$ug~L8T05GrW|XfUfjgu%*Qg zRhtLw{e)k|h*iJJNpIcE!B1A*S_O@fwz#Po{@{UQxio;jX!Szc1jm#D6C{*bOoX=F zTVpy|S(&Xj{v=l>D)kaB=5b6e6xB20;2KaFy=A8@B;Rf7UF3uZ^7RwExX9cVv+0X$xZ_rR?1JL zf87D?-w}2Ua!GH_N$al(3w{&dvob zuI-mX&>rD5Kgxa$cMDXvrxp(nL<79;&6|%`Uw^fA78a5hd|$TK;o+-ETxHm`Q4^kS zn^48=)1(U>4zE~_-w!fQn^0SjZL`HuV@ncYI>+}bRF^1)#r(qKwqyJ2Krh?BdQnT-e*Ct0mruvs7|jq5YjbbI7aWadWkfcn*`FP(}L3t zsNcd<4CT=HHe8{|6{lr=)8X?w!jx;=?Z4k(a1ZB_;D9ijNf1A&dB0VMIZsw#da>eo z^DM)KkcsI|0n{|}ZBJUNEKQL(fq1yyXe-4-Tpxq`!HRt5V=atct`qkTV>+I-;DIG% zL)jjzu;pyNp=pjZV&bpeK2NS@4rq=FF{|xI+fKf4W+08f=Jj~oZ$tvP+^Q)-s6O}>?ydb7nEN(7<+0DWfVm`!ezv9Fhp z5C@ByTQVKbN0I2(D9G8Pokhf_*l-)VeEI9Lg2;@mx{}s-fGWCg8t%zCM`A6QBi;>M zlm3KmOuenbEZrh#exoEs=@f1YgN9>!&Qw#>0ShUSf&5l_BIsErhI6u{}-!y0B)Ufr|}{Fb#D_W#rn_*m`nT6rdx0lqL>~77@qpG!6#9CB-#|4(#?0U+|m28YpZ^nl;{u5qg=?0Ibe9BK^Ub_$-S zyl0ZeJW5&JeQOYG>)K5a{%(D~Q55{*MaMf;QZ$Eg0iC-1wda{8nHN3;&KDADXqe{P zLP|lT&)SznjPL@A&-MVSH0X2!4u-YrR?5WZJ}Nn?=MLY1KWEc6vjf;1^Fhy&0Bnny z*2GRuGfg8yDq!7vb9@l)Nro@|^*nbrofAks)3O4Ig$#sY(;SeUxy}xMNvPD14=h2+ zju@7nJ@}F{*9?43P?X?R0unBE;B7@nCp3!m{qkLi8b0&Bsd8ms)>k_^H8z2_&KJCn%63n1QG(<1E9Dg)aQJJ<`pzb_-;EQb<o> z$*uDCCoE~&QFAb2^#@r60p$)in;5ZDF{8Bp&3kft-4<-|G$KeK{Cf`OTC$Bcf zoaZ3h1DbRh*j9RikrfULspCa3bfj2|$dsYjWQW=-t+cuK@dOeAWd`oD z;i>(L#m6IKWZgK(n3QN%{|;Tbet~rkFY+V_qiU0AM2ErBHl#-`HiSNiGKo?RmkdUx zG&uCG`|S*+uH;i;gC^pEOTxk?Aj3?MdDgXQbqbvIWT6nQ0&oeqP_suBlj#_Q8VW(P z6XI!7clY)=G~cXjU;0YxRhw&#_s`7t_V%M2iLH+0_H2=xHKj<@tI`XPh&j&a`?tXf zxKSszwz)H(#S;V+Q{N(C;43MQMduYGTgB1H7HF1dCWi1wo-7_z4NZcIZqhXvr|9Ub>MAlm@Xt^Rv*d{wih`EKC z*(H~0V*G(pLt_xGxy2b*8LPP?iqqBen!8pYQSokXOS`!i%9hnpzdnN)cAXlwB&rSO z7x#tqiHf>0tj&Cpi`~>_l3&ioNxE`~U`T2hLVvU20|4XSyi=`I1@7%=H&$SLABi0Z zWT?)lI{CUd=`DD@D#r$`8)7`p~^BNc5*ONfykV)G9Ws^!Kve7+3-F0Oyg~3v8 z$R#P!F6d7o?0O=l4Oc-0kzU(JiCL}aAgbUYtTQoOTn9-ow*X5vUI?mYBmVh8sxx*o zgW+r(QMwgcF={U^|5w4#fC7Zq^^=F3#87YL9U&m`N%eQrCo5SJ~1smz>AA2LyGI4(IY-vd^lk_#N zW>OgS%-9fQX2w8vphk&*kAHQsrA$KTG=)+$#?v{7s^*c0m`2pBo*$kZ$#$rFr^}fF z-g%iz#1?y4H&|$FtZQ9DHaH;w8mejT!*GLTZfNrp=_29QBH=M9du z+zt769JnVyk=NN)ArKNB=lpkVqXY8UM3RGH+x1OR{u z$XgWOGn_AK1qHr4-am2X5XS_?y>{0lYAer=Nn_0eM-~qf=xd@C6@tGg@U_t_qJLM) zcQEHZ=@tE)Rqf|6(;iuL*O#F;j=_<1jnLm}u0sYr422sW(XTza73Om|l1Kb&Q^z|>{ z;7`YV`RW_uDi<&Px!37E>m#w~>0*Cch~)D| zSKNG~78g+eUibbjUz#YQzx!f&?ZAME828?v$IogJ(FG?;rtC(S{G(Y8Xf~Aci2s1U zLN9tExqBfoVnpDr-tRgtx$8`j#FJhNwf7DtR7x5ipf%- z<0fbbQ+)vX-oc75Pd`HpuuFK3nOO1G&$l%$xhsV2e;jO~iRfxeKP=uYFAxvKWHgye z%)1s75;f?MQr)NDy%nclEM|WUDdPQb(3JuY$UdVbdc9lGuk}Y4oQ!B6TJ_=^A(el4Ca)BjVO13Na!dy($?xxBCm{b*atruQ4--X}7 z%n}=9*d^-0hsVoRVJIx>ug`)wu{&7HV8jLKM3IbuA{krp&1Z_^l1{jtg*GfD)03*T z#3Y^{ZQwq+o!~8}#ydc}%u%ketdmU*8A>&*fQYeJw?bC36(^DvOV?QMfmT+4KmM#E z`oYz9WwrXM+ui|=Zp&wVh^{B@IBGW8YEBsyx1Y3N!L$MSaYT4R7gZ!sZfZT{DeRMDU3gQtw& z<#y^UzgOqpwPBwCS4RfFmY*$S#%L&s0mbR4M0fJ9@R70s=Qa^8+Y zqxp?MT@8SUYJH=kMO&3mIZjh2&r&(}88TUA?Z$mk%*{SYtFW1=yVM^XufC+Z>dmcS z7mB_oED>mzsD;mGXs!l}C})nTRZrF{#wP<~Se&04Jc12)Og6MeusTXn+O2Pw(Q+!4 zmn)9lA*i13M1Gk4;#q>reche;MQ1_ux%(DtD}hl|xV^A-3P%$Bg>Q%FZ0 zM11ZSrRBdean{~yDE^ytolqrDD{tM|t{RtoM5MHu*H!UKFlmgCO;13hl;Ox&34iDE zCjxi5445(+qlRhk_KbZXrV!OGXm@U2Qsi9kT8~V14hgkN(Fs3&+4Dvy8(HsmtD8{a zQw4BRi09p^#!>rPa|@eQuL%Av60UAs>@XXh&drC2AN%{x?t(Z{QB0oV3X3>GFj=QV zihMs;LAMND49YDsb-*>6figc|GNic4rJeG~`^UFUqRgjBf`rqg)B3jBj;p@tk~g;w?{31{mnE?S1y>uMxtZZ z3k|fypC@4*i|=s+@_E#f%wzOPYP-H0QdP^~-qY{TePBPN_i4?wz7j3>OSN<;1`EIq z?<6zzZuWWLmc?@8gU8jXNYZ(cT@xC|u*6eoJ#;MDxBtTER5~dIpk#4iX_oTa>sXolLG+N>akR>7qfRnoUUc6i(H3Q(>o?q)8CoHez9)z zd(Bwpr$c0A7PF-jp@>9LMKITwC1RnQbM<~S4hcr5-98?ShW0_hxzXH9(jq-^VDezM zCQ}EHPQbU$zb)-1Dr>T2wIY0&LQecLms`|gu{o?`?Tw!qwS(!2{T8hp{VL zj8zFkf%jGqU{&6#t@0Fa)Ua{$nq|eLj_Mwc(EhZ}Qk>IeG(%2AxUQ1S0N_)lFzQ+w zz~vSV>0|qJ!(6*qJ*YqbqRcls%GFN9W%YG@rt819gmGO)9TkL={@n@W(_i&V>)9QN zK=-A%k3DpdIdZXv;2QL;=Ky?A%}eh&V6;mA$%`SKa2kj$A<5u~9TIf?e?$tho-Tqy z?e-97#;~>4*yuA6LtYGt;37n0sAWV~Y3euov=c%83|44CyEc*d6yk;BRffHWk7YDo>R)N)~2%Kmlh# z?sHmjD<`H^HGL81@zxQINljL5^~Zo4tyQJ2s@KUqMP}xY1Rjh_U=w(n?$%b}Q;x2lw7v3_-$MsliIH=KB zQzpOq+^W*nQRo&Ejyk}ZCl;!i zyJoXHnLlGh8ICrLj|bopg4;nvzH;JKV;Ooy>41s4kbr&)C~AL@C@#%BmYi1xPrm$; zz$ecgBwIR#`3YdEdjTh6pX_IkZx5way-^iS=pJy2DwD&eH`2^fC6|B}yfVp{Bs_u3 zj=cc}+A&mYUjJa*811LVkQ#ET5^G1)gww5lz11v{xC*&+Ov$ zNNSPoj79d$hoDnV;`fk(mEzuIn0L~2GH1Nj?`vovhzBod9pe5{{vft{m8lr_cWXg6 z)(S-@4Mv@}ZXtF=I*jCn@Ly(6qXl%qQE383L&EvuNk_yiZ9@ZE)603ku$|#9WG7RfS0Al0g#8d7TqK;% zFN~bOx}foIBYyc;eDdo+^J%COGJQ=}JXnYZHzso@)1KPApcxVG%lX++D+YoztWE={ z7%m+-q7NUFU}1END=6)sn77-i&Ys`egCGVc6Id77Nlf!iwELU1+P7>^21Y497>QZ)DO?cFIc`Ga8WHq%8_2WOTgA-YUrn)hy*MptbO;Tg}aR zw!*z7M9#xL7Kbx9Np|k!y*Oti$`5v=ZITC$Q}dnAbQ>Imo}FyYv4Q!$s_a_g@d(Z3 zKKH5UuaKhEswj1%@I1x4!KMI+Es3awlk6FJxkWps+V$>9eg3rUT6prtRehIr2v^66 z)^516h>J)i{H1^Ipizd`v+=y@3?CYLosb%s#J%JLy{U+8!Tk2`QC&P2Rg zUMW=0Km35C-WgnX)MQ{N(D%Q(q8o zrm1e}qTIGlVED~I2m#Z44~8*Lq0nm~$Hf8ESB zm-cqOd_^=d-nosyqC#q#r9GV}ZXK%CkGn3JYG=33rtU|$MvV#h{?J2MAg4c=n5F;M zYPzRiB5~10rlJ0b7h08b5H?&-9$*YeY-&NRdA;L8C{v&^DMxoh#)+4w?;g#kWI616 z9E^avzDMsSTLNjfY7bdNT|-=GLOq6I9kEv5LMO+^^!ps@w|&PdRONhdF|Ewd35FK$ zkhLF__S4#^APokzqn9r9KbD|S3|?rKq-dmb#6aqbzy<@)zUC$bL^0cu?|?xZR=PJc z5i@mYOS$O^`O< z6t>`~G5@`Jcy;x_AiW;di8-~qA+eIEU5+!zxvQ&tz0?Jm`1ggFVJd8qME8|KXkW}a z+Rr?@0_AM?0M%YzfugZRDwT^ObWA+>fP|}nx8f$kcgH^~D}@29D*kcI9S5cOIoI|h z#Wzoqkmww-y(|>(9C`I9FruNuj5>d>pE5YHnjKYlRAxIzXxsx2;5L~ix+J-cBDT&W zn(oo+;HmuzbUwQyAn5C2*YZC^)C#nf(pBYzN%ELt` z$<$&lO{i>$4sPGA#0&7QNlO2L_Nd zh*SbTyAAs+`@=#Eiz9kpp$TyA8^!1#bfb`MOdvDZRMqu-_zYvOGAB0^kgCi(U0B`N zEIR8o| zYFAnDLka;2Xm7g*k>Yyl15Ll$C|uR4wP;Fe)d+PQLp52M<#d-a5^YzztYm6Btxmui zM5|I(hPsIlUSSYFqtTGLQEt0)rTt^YRCJZxMvG?q8qU2!?UJ08n_Kjz;eKz(u8g05 zb{TvyeuEdk5 z=r?l_w}c7(1D*q#A#%^mv(Q4h26|@7Z`~A?YK~)uNME?N2|5MX4G|AzoUD0MpUvXc ze9=ZL*MV%Zj&^fAb*Ze4@E<@)xkVS*iJd0r9|zGAx>laKy$YUIj%x^g`x+C~l$U?oJrj%;4a{C>kJQAk~U9WC6tnj)+ z+x68UJ9!Z$hOj29){&Ei`AqFV_C1z2A%7F13|3tuIPWG}bDQ9nS)mYgzBNh>4UazT z@CxX^kHO#9sAlq3N)$5wXm@ki!6T{24teIz1+jiS} z+eFW42~{NABo!m-5V%{GB73UooDgvh6Z;wizu$z-9;BUD2bnG~L}) zGmA1BZO=0u7}g%8C+v8R9WST{X_QGI7+!f7tV^- z;2>qXuFU=S$dT~!xrMJSVX&Qen{zNrfTIdWCkCl*JJ!5Hy+j*%b<4~I(hIxe^@eoH znt;MaoNsZ9IR;2^NbXM;=}R@)Q#NcNZNjO`&~36siY`IO`3aUDXtKG??2#eLOvw6v zd{x_P!=7K-tTHwB1xk)SFZadz8M{k4!`PV?%o+!;pV7V9fDW%8M^tsYyjjquOiZYD zd%L{)B*`_dbn4u7Xm>$#1bp*~2D|zQ{b9<)ML4b9XY}7fzt|1HvO=4b-A)1`=0mUD z^V#v6L87v6L~c!rn*Y_AcEoNPs_nw&vz_~WPzmL6i~Ifl!~2BGBS!Io!9lqD@yC&& zw6CR5)NPR*ScM)Stxd(@0r}m9+;yBH$bdkudNu;w2CEW~*z5d{?nE~fgH(sS9PMQg z=YmbZj={fa0A&Sm+j3GC#-4kYH&$14)Oj0-M*q83g}6x02VR56#=~u9FrUSMK&;xn zt=}#b6-OpW^F?NYxomII0g&{tJqFL0>d^nS>;Xl9&#$ z<2*OIZW#NM6fQNGb?gAEBWn4b zo*8n6F2eB^j{Koypaaggh(jBLSDa*rZi2%;3G-v7QV6hfDh0#xr*w98OlQXcg2jaf zhFt+vvIyy<4yf`{=6x41r+3_#k;b@oszvTI@$=ff-hBf7iSg!J4j~n z(-WxuqnTZ0X5=?7w2+)IR#h%Re66IAy2<_U=Ll%}Tcglov{rkTUg-~tBD$VPvi+%U zCt=L(>3vv$`C92oN2ozH<7jtBq=l(X^QO`&3|%=yoxf;zQ|SH&{Rkx-z6N`wf$;rw)VmiAK>i56rnJ9BZp^07BXQ0 zvO{X9!LpjP8*g8*u_5*GlJ}1T-<q8d+?cLvhQd=aH0skt7`{=xZdxDX5>M zXf3+}(4q{S!`69f^rWA9732g>D+@&K@n1r85G(!qxNldvbH5V##wWqb*uKK zy2#-}4%3Lg`W9;TggH=uEm>}Bq1TZEC~Uy=FmhkQ1Idpo;k4UEev+Dpr6w#Vi|K=; zgnb))?*8<;b_K+P;175@Dt6Eez3EggU|-53JQ2KUG^DlXhT>+(EYxV4>U$2uK;NQO zmzp1E2zEo%B1k17yvBP9b@%8-bo>VbCdQ_#+3uw!}8#EEr1ED;5i^>$TjU8+GpMM zuSgi^tKqof2wUk^j+Sah-K=7m-Ai=>uDbel+LCiEp6J)2*&i%`61TVD*1=_z3S6FE zb0h+oM8E*XpfK8*{;5=Y51K%7lb*xsToi3Wx4B*aEauge769?Il6|Oe4%Tf%|HF0! z+*qQgyhv_pP?{TN>3aY?cqHg*r3?49^uHUAaxL_ukSGhf;IQIpOLsoS+rNT#rBAIn z9g$vuyY^+(ReG`ufPoGyIL7N5NycmxAU{7jX{=22ZLX_<{Q9o}UznM_Um!7pUvjMg zp!%$>GdetnkGa5|{E2SVJ=)I32p*q}&dxAK1cPgjFJFNk8oM>fy3(CKNf#U2&FL=W z=J*)Cl7mk5m%|u=_HMJJ6H5~j%Wx>Y4$@N=65la%RSup_mb@Mb;w?SIIP=NW%|g=% zef#M(iSHNrD`Bd|_LIde|O5^WI#foqJ|z*6h2w(oZY)~K6<1Q0$n zZS`~QZC;8#8dRVWMg{F+0Z4G#_Tetcfqyi;OwhCnnTvC}=%_bNUkHfHlz#3%-j7}- zD%g%7`6-GAuT?*5HXEmYH7W zq!$6Tm7#l`&X`+{zZ`#P17jUHouCStorI8xXwItsDssANEHSl2X9wZtc%Z70jdFU4 z2!+Z^+$G-_JUpYH=^v`qocM6ntX$Lw$Z*9Rl1DP6 zS4wd#St!SA(xx^4Cgg{MGWMVjWI)Uerw-%eF=GE#Kz+%W1V`VL4IlUiK!~>Ei2NY> zCYf1U|nl{^Z?&Gaz9R2@lEh4$d&gVx}JAqdiTqSd;>yyO&`^P~rp=WSRA@@`8 zKjve%zJ!b|S|A{?BjEp^d?oq+%2xvZKLVEWM$R_>D_!Zb-u9m=Tak-t*D<*|Xz2wG z=u0H2)-!n`&Nd&5(uFf9ok9C(c{|`e`}?gM?!=G5_;|?;UepqBoq6uJvr|5^lYgxW zwRT^A{&L${7Nv(D2XklAS(a)8FEapz4JICQN%zb1W;^5Gi*dTw5CV^I2W^$eQ+vK$ z4p@zAa(P#$!k$*?n7;=kw`=ymg$G@;Hnd$1{$9j-i-5)w6Ff5F;@mrh z43t$ve2x78Jg040(vxakWv+TjQtUos^xqp=Tcttr(x*dw^99Op64p09bN&K8w^|R| z91^|l-kY-x2f4_hYX2|3-Z410pj+FGvtq5-ww5JwjL8Y&upo)xI`M2D>`p;JFbu+T8Cm=9K8V*l(Tsd)EK`XNj=E%+A1@2#7&d?2>H8hklMw* z(hTF3Q=&5BS|lgK&$9*JK@cF(0C>@e*Vbo{YTL7<^*v;ahp(aTQqd;hMT|+sjIs6A z$Mm}KKbUhaoEJvNoMCZY0NT3~(|gBVLHq z*+a(DPryiE2Kn^&S@DEcU>t0o!g|PUkCe_}F4*Rm1=hq^k4y&!HeyB_k{pmzyhMSa zIHQyY9DjK+UAl7qsF`qoYt)yN<&#qV0GN^68e?Ns&o^4gl(A(Lng4l6koA$IG5c z2G53hKQc6V8I9`~*~jm`d9Wq$^q7C*&8~ePY8wx{{=M+TwZtUwkvMyAc?!}mbYO!> zWwE4F?TW9VZXIH1aDH4#Z>nb86cJ*Oe?aZQnQ;?Qv@4QiOJkGi?*TLbfA7i@zuWwj zgCEa5^}W3f_SSdoQxmASRUn?r$-IIuEB!cq?ba{S00|ET665jNk>_ipL9B5V|E+77 z`>s#yBm#i%aPjmYD&lHsGi-D!4kf!#|`un!0w@d2F`=iSO1LG9n zPjEI3Nd-(8X9;06z3k(~x#@1q{-k*s!;Kco`daRebg}e@4(pd0de&;lPQbUUm zv$Goo$=WL+zekGKjzJwN$49mTy@D!$48Zve`U#8@&BC=nR{-hYz(&s5YfrboOJ;2i z+FB%%oRk`5ucZ&YiwPKmxRasn!eL9%YvU&MW-`)a9W6NhT)5QNRAxc&F^^i3YdTje zerv!u$AE1#h=|C)#z&gR`~EUFt}Xau$M47M6EI3KniUXHl}H>#9IF>r1x@jJmUXAQ(bQnBMgOIs3vd0*$k#b(*Y7c;+~>_XqDtPSho6KJc(2fOzu@ z*O=TOivNC?Y9=LMD8>Aj^UO?F$b~RRzF8>4lKukRK^__gohH1!b%gk^TG_bGBiWzo?rS8TL2JsMDA=1<)ANoC9iIp4{TjK zJyE|Tl3F0-$MtlAgS!Ugx0FZ$KJyTexg9x!;F&Zt3Qed2>#D2lxY!S z*+uOntgq=reL(;T!>s_4ffxg=2)U1uVZZT&;RLXPN(+Gpi`m($YBK8jAa+}mgP4q?2# zsT@H59;S;wW_TEv`cQ4qhA@cx8^Q+0_?Zcr?}?T^L>SjEZz>Af%78?H61Zg(_mA^Xe1mHo z5;mM#351yuVn9ti+|MsH!)*&=3>O_?*5!cbqLTC~S67B!wkw=@^lvY%pBR1Jifj=7 zqlg#w7m71nXmoalkh+p9W2(LBE_v!dS?trDmF7khoFAM8F0-$4o}wdpB+VB09~uDY zh6)2(+yDmN%GHcW`;M&r3ngvT6y5LT840gy1HBRT{(}s1UeQ4n4`8W#L^(nx6G)gI zh#f<8N-!LenD~H=-Ub@=eqR#rOK=_Ka)Ouvb0}XGHq<<|36Ny1Lc*sOJ=s>8B7v!> z$>+`~Kj1$T5Mk;@rElXG7on_td=dbK)5X!R%m?iS`Hmzbg+PA?b8 z%S>RLU!i9O;EUb|VD*w-_ds$2_Xwy=?hg1E?dScj{tRK$^jF~fT~UG;q`Z6W>BI8S z4&n9u_ARNMy36Jj;;9RzFhpIK1^EnGVUOgk#3i%L@-vKwnpY=z2CFvYbus`v9Ul26 z1dbgI*|&NTZ#sBsR1DGwt@Sj6>TS)!VqeQ|7Ks2F1B2H+gH5v+pBS{$GEt)@UReKF zI*JE_&{n3s+&W4;Ft-tP(w&5#{=~%a6&m*YP`geai*YeN2UAbK9C=b+Hi{=}!Ojwm zjcrzWNq9L}$6twU$6qeAw}Su{Ias)S5J7cF4e9%VnHyjeY$tbIGsa02p?lCP_~Ub+ z_}_eBXa_Cl#GrZP5X1hw2!!RjkedJXu*t&Vc~9Rh9|*GR%(yNpnokR40|}|R16})@ zo&+yP2%d9I0-yRBPI_hh{4lRtShn4UdlgCcPzey8V^}n@N@r{W0U#!IV=j@q{Y)5y z4q7aMsjyc^dR!9zDJe^`;20VFmS?DRKytOzp+?Ed`1LtcxJAP=obrQ7;p;|GOjZ+2 ztt%aq5*50CI98#mNlR4_fxZDn!DvkthKN!TZ*)Sbvfk=cEoPLO@y0ox+CH!x&nf9o ziBkez z+|B8zbAOZZ1(-2gZU^YFjvikfg15doINR%xYpgPSaa3T7=C8+KioJaSpS~@?S=o5d z{e#V4oeN>x@pQ7nh#wWs#yQIZSUOcl0^@Uu1?{^5&(qqNFJ{i;j~UMy#8bPEi?_l; zsReN?bXJ;83?hSy(kkDm9x-J*n8a=+e283^9HtgH0dfE{&$e5g>!evyZT^g}k!=T) z+;!i#FE^XFvtn}>PNV6c{?B#3g!>5u9Zc^YR@=%AZO0BrcMdLG23S8|lF0r=7R&(o z0FFGLUdLVGd+7%-qkTGeg~mDfMll&5%%5j0c_!U!J0CGgq3O=Yv5*?8*C*Wj(OmC> zZo` zWMBetk^WHYl3{FDIb#Nr#1qQ^}Ebb!|>`qTT zh$7*)*;AMEhrL`q!p?Mm=*Uq6`Q28hm&eP~OZm`qBTwZK$ARL~eAgwe-W@OrvEaHi z;J~vdgLnk^mcX%#-iO{fMA*VA003iK)QCfFMCbY9yscZLzWkMbnI$;$ivo@2P z&8RZT$ycQK2QXi8O9I@H?bT*MHK;P;6CoR>CKPAJaEa@6-jO2qQBZbgK`Z&)K6qEK z98^}KN`VM{fYmZgmu5yb=ihnl7`kZ46_DYS8p4pm) zJsAp^u)$?Fm^vtjk+tzjXlwUFA0R(&*l*zeF%5#zDcw%$I1ljteW0R(=VA~n7>Mhr zp?SS>yuYFlBaIFlJ`?x|Bd5jl0D|&E2KmtDfZS zA5ZJ0tG#HVI15-H66)!u&lq<=Oi^Nv_2Wz%uMy{?C7ckpKU`O&FFcQ=+|fR z#Hpc`}=da zd98VKxI8TDzbvs&%xoeR0T*e4f|71I`C3@g+V?}ZC4q;+rZd;V-bfpeCGzw7FDi2h zMps!e{9?JNS$d*YjB+s|xgh8f*NA9(3jH;~&F{fnj@uoJGPY(b5D!IL-HX9Z;jw+8 z{C3&GcH=D;yd3Gyr`9k42qK8Pf8Xm+t;>bnw!Iue6hK{m*|lBA^@=rOSHKrSLBOH2 z#Yu}D{%dCJjN%)l;FzS9vt3F^+u(K)yCZ|J8^m5`U^J!-7$n6S2N`Lg0^BwG4`1Uvhk^Co5b{U>#NB)skKqnF_MD2HSAF>JvKd*3{rvi8jU~p(gjs8W0!raUt{k?tg zhTrJvyOp>Gs1n8;54?oOSaCQ@vszj!86=Yb;D64MkY|IX38>W@@`%-+iKSJ9)xu#~ z>+DXUEQacys6wB3fl7f`2b#G48=pJRPsD{hTQ-|dcUo9^_cTKcU=PMEh5EF68AZn9 zJybKwF9|j8)}R5K*`noBPtYV3=}gg6goDXK=`&#jnAY#W&OYy8Wxo<0FWDKY#;PZm_cw^^SrlaL&F;NUvf-9FXv=oI6{mLV?N>QnNcwTH36Mh}h6paDRAL z=lp3}77zlFWKI%h1noC?!E~_0fa`{YTIjb7;2X&NsS&ElCB%M8sfIQyIDYME32Q>w z1#`?mn&`CN80Jj4CTJ{j4fX`*4zu^My( zoGfmD>y+ni^9Kj)D)IhSVxBGj)jE*`O|*(4Z=j}JjeZPwE?xzSr~Q)ri|UM-PNSG7 zj{9p($z)KYw=!c(WF1a!ydTlXSMU$Wx0u9 z&;0fIy`Q9QQ;8Yh{K-D&?-R(6t%;Lx?dXLQLr)K}%v-~~Z)t-YkIOw6JN^&A>Oc;< z%OYa#vh+kcywa#~{d?=?ik%Nv`&0^c>X>pnZE(SGGu)6B`fsAtP?Y+UOYCX@56s^ETwI2%GSgA_ zreL=M`r^?~S3c+JFS_8M{fI*W!QDz7S!FH)%!>uCe~{0Kxi1Dr&{yF?rPSdYnQju| z&5Q*T;KT(`w70WlP}oW~>4(o#aIgG>5*y3LB*g{HGezJfTsDp2B}lh|`Rg0Ghe33i zd7n1<17kv=Xx#C5fy!w%W(FYK`k8t|QYoU77(zt6#YdDY&I93JTMy3w=gp=`6*)N2 zigRfRXqdHjbHr1IiXl4_>w<;aKkOj(Sz>gUT`@z69W_MG3bl6H@9%O1!#ZQz{IfW?YCAz7I4J zGD>OyWp6x^+KH()oz_+WY*o#YN^NcT@B$RFiIznkg0ETplfm-$~n41a=@4+~azR%1zMW9#nlA zAgXGn9`q-x_#)N>9`UXx2#+@9?HbXs}UxpJ=XA+$V&4 z;*AE60nB#DyJ;=};XJ)-azc8-@dKg{h!@i3TV0HLk`lKJ4G$s0;9>_&OVB@w+=lcK z#mEa~e=?gzlKUkaMe2Zc%CwWvhol27P;E?}JRDZo+h<#Vd8e+FyBLC|`ZOc!Mb?Ws zX{It%R)C_JA@OuD;+bDm8X+9v^?%oEWJayxWG@1zCyyEdz-_eQO=Uk0Zd9|H)_`;m zeJjz2`!u8}Oc5~9CiIx*;r|g3GHfG%0wDdat64pkSR$vFz9u zIvJP6cqcY+n~kpa7BN>;SUy#BsS29-yn1Q>edyL+ad2%RdiT{3(U0Qj6!B_|)T=nM zowFPDEgHnupn_BU~DZp8p|*6Fpi|<;Myez zTJdk3?r>yEJS58qT*x=;5Cs>RN^DEr5H?&=*@vPT`3-M5&`_Fb1yCjs0wS(j@W_de z5Uiu5uG$@0fANW8QGvJhnFcx4agm_c9g4=dk{teY$c(d|s3LfwIw-$USQ^7kDbiyE z`Ki1BfNbX#DxC(U6wsGr*ByuTn-@x7n~5^ax6-Xh=-<`k;=)hJRG9QRF4T$1`e>Im zQ_R!#1S~H&RI^S-hT5{ln2XPI_`(D*uv!hZs_1LxqG=wd-bFc&)Aujf$8O2TOfPMk zy;8r*IPW7JruR3nk8~zT>X+KnC1zJ{9;M>|XXkJ-)$A;tTQdb)I<{u+ow=uvK}E~h zY5z62!cN<(IsLwgBLn|>%qm*;NXy#GD$1i2-D08006&zmT<92*PsRx^&nf5rZ}v_z zcgVp5JP;6u=Kqmq|F10j|HF#{{uf_V)xq59fAdAPJpS%C{a2!$>u$QnAasGaf*#{U zP^0bcYbVi^IW;vEWk9{s9+kKT{ok23$t&hC31ZtiCKGL~ab|vY!M#ccB;U`C<|iMW z+{pXaD`xA5os;t#q3C8EzN(eTK=ZwY?K3Us>7zt_ z?WYDDgMlA%fT}4#wj(`hcGp+Wx8&K>&;(I)vk|t}CQ!IT&MG+w38fO@)8&ypM8dVt z^s--oM9?BUKLoNnI7=^=(rpu35&L#0Z5hdM6RHy%Ee_Xl*($Doe0~yCYSxkl7`HZQ zx2JfJ$D`npj>!A@qt-r1wyys3XlPG1I!g68+9QJ6!Y&pJ*85WdjN&V2BKIgh9^4#xPy z7Zseo%f&XlAm6xVo9hOeb+)8|-QT@tqk%C#4GIElnmLpe);OT=x5V&RkEHEiU)q-W z=vq(41;-uHsn+S*aBF>@MT9dP=XmgPsN%rLZc1C(2soN2KxU~?KU&51Y=W8ABXb@R zK1#*&dCThuc;WRCh`ySTw;_l?XXz=-=27sTLavf;qXo`}6WNC42 z$-Jwo?Pejv&=WeaqY*)zygVay*udXo9@IDiYeO;;?JGq>pV*Qkh@*zM+bLp z#e!9D{}#^l_^j|o5+U;NcIB`W*w?CnKbY_fp{yAK426Ejirgp6s?rlGyFY-WPr&*M z2mc^Ow_TSNouH`5&BV-^qfq4R@!~lj1Y?wVX+ha<4Xya?jzoxn?P6i`tc1eUOKBiW zyKYw+@MJ`Zv8JRO3`E<@(^1I?#^<9-KT#{}d`}b`kIa}_qRdwGySlvw^-j4~w0hM8 zBFvirUM*TaLX*Av`!TC#=jXf=+VQyLm5Bp$Q46KlmUVwSstfE=`KtUeXTh#_+2*&? zUfj%o5Ti(@I|ctij8@3B4PzX=?-e~`I5}g6S`*rvA0X4mL^|}i5dMn#9Z6%ql~yJ< zvCmUyhLljdFd(?@oy)hjLrH_4oko#iW(dg=bu->2~jBb(J*rmKZBCjOqR+Lv^G{htueup7_4+W&nSL z`@`!^HRV$heB_GU+87O?)vxo^vz@^;gvRLH?BcA${)2xt_gw49{xPrL&)Mb|lLAm$ z^h@YTL6s)@%4W@(p{-Ls+lly0p-^T6m@(0R#2Dz{bNgW;WhD!g|IE8{X2%jd= z{7q#y;));u;@n7M>$JJTs6OLqzUFE4<6d9H+`%TM<7407C2W^2VmBFp$IF%Wc=`x# zB@BIFxIfR^%9`ld{o`KW1LPUVVE_=qtJ7!@u>ro=+yMCz!nmeJ;pFo-2XgG=Xqln{unNug4o0oJ`$_cVZx?45C(6^e*EsJyTsroM6nnt7t z<$%!c*TYH|;D(`942N~lwWO`#OpC-5Wr2Q8JR38I^Om0+)JLTp9j7~2LVAYen`J}g zTA3(I4XNCB@oh$?I0?(i2VUQK}PA>?WR6pu7?HXU$+)Ly=t7rH<#O8?&#O> ztioHGgCqh;6wRBN1p&MPt2(6TGadKD(}Du3?-In?)=^xcw)0m*R{4gPw5#v94+2@U$a|iYXwF&e zsJ^`X4`j5!O>fB(@Y<7SDA%N>MpW14Pd}j&baQMlnX`jS@cIb!BZ0-J_?PpOkufo@ zjTV-^9MamezPa{JmL-lstGNm8G8j`j$tFipOe&NK7EVSPk*y8mk%;+yknhaw8;Jk3+ zAtS`o19!{0$PH2$deH15OFZAgB3-Z?FylRrtsy&Ij2PqEls35ljz3U0?vuzAP;!Jd{3nJnfH2c~_s+3k#m6mj zh_{_o@8x`qQdTf&Y3>MDV@loZyR$5Hl(SOyId8ce@HTVmQZ0Vn|N6SSh!0-e2z@`W zn>0jm-^l19*6zI;f06^GH3yG&Tswz>z+{jQ4D%1tA69QzeT4~Y=PKnonh^KlrbJ(C z(_dxv4lnC`_wbe9oclFgj(CDqcB9we1M)39H~ z(98s}rQPIAv2dH;umEpQV|}B4knw_Y(MU#-y6nfas%&YhBdcaOM%YuhY_R`FNR)<^H*yhQqUyEkm7(A$1FexuM z51sty9g|nMH2hBr(_9@3DUyVlD#P1cDvPsEvp2?+YfK?cG>BlB52>#~whq13Q^V2* zaJ4@x`c=S?FNNS++s+li{wv>=;*|g+aqAKnFY)kmoztZwcR0cEZyIT*M$}crR4gTM z>oD=2gX@pNcYujnwX*UxzeF8MTL?D-9FGE!B=_O1fLFokt|#l5OSr8aRvO9t=hYWD zqADOmMt;q(y)%x{5;jw$o=FBK>4O^{y`p86bH(THPf_fcQfR&jb{a{W=JR5 zQa|UuR&XY+JEp>MJU|?-C2i(WL$vD3Cvm7k{))c2i!D9Zn_yJ%l9A9y8#hZ70J=&% z%9Zvx$lVYeJ9#g&9I+#%ue2O`?0a(ad23_gm5?uKs>J^N?kMd6J(R8h`O+3AevxZ2cJ zahZ8j#{(A;o91G9@7o3}ArNmHWRt<;gt#deIYcvXmlk(r)c1aw6Z?%5jc1M;|JxxX zQczgZl2lQOyRA-4zVoAeB@3Ki3~&BBd3hIfD41=j?S0ZX8Y;@;DTWe)57d7CE;Q=lrsw+Rz=h$BUq^)Y_~?6EfF~ zZTF33kK#g8b`>Nr=YTpzH$-L4F0IVVTFpium&d08_`VPea>cuI0U87s@emWu={RHX~2@}!sT=O@vE-j)Mu4_PvB1e zTypb5{%~h^pksAhkJ$gp zw327ZeqsF|T+{zas{Wg6>hZ%hjr$MRRB3WeIq9I8S>l3v*qLoh>LR0ZVnNx0N+h&q z5K6>CVl2v*eEYNQmZ0}pC_$LYeo`1&oW;lcqivSNXSq8=HyiHjc^}-3{pBXh^W)*@ z^APjY>HU-MY3l9s9?;9#U9-KuMF=WZuhq|NCB^*y8D0*58o^`xR<{lC^t|A?dbB$3 z;%hmL?hI|+X1881%p1X{retS`9FD_UQ1nCG)N&5%b$VJ;?EJ~xZ`5}!EzJLNu9o`dVaAK%Hf=go7(a*4DryiC{aCgi&fosCw6AK!vV@cDKAa6<+fH92 zm$jSvaNu;}9>sRI)zb7BZ0Nc`h>fz|*4)0*Ty=$kAm6aOetj7?ADx_D{oavv;$J9p zVlNhaOHpaS2WVgC-rN+j8fK}e9>_hiAAZb|K8vD!b)xszr&^ez6*Dxmlzmr{nKO}v z^m3m;euw`A_Z`7qr@uxF_gEP0b&Z)M+pWEA{n2mN4&V>q$`KpRV$T0wAsHSnXs<6- z8tyJV0%~?A_*w<)4pB%#6+cdtdwj3o(LGr+>kz;dV|)Kp?~ZP}&*20UW^ekJj1&Lu z6mdBmfVmkGT^M=LQd;!{cte>%)Pd zTYStT?k=mKgPihOYV1AkuB)Jf{{Ier3p@!Z@x{j=^iP;x9d?k=~$lLA1A|NqAS z6UG*Jl2GDHjETkF{qL|_FQL2JAnd|isAw=464C>bp3kM@a!TcRfn^l3YB!Uw*}2vg zJ&c}qdAWCyiT)RSWTuKRC)_dwSNz8Pl>Hu)qdJkiOCT<&Rt zQ0OE`Ds$_ccMH}j;p`+S>JYybH)9KSA0)3+2<>3$TBRn9Q!Em7o+zl9; zh=Vb%|6Who@y|RNDju5@U0^G@+Wu@%zSP}FSJQsHj_ih@M0^+zwdYf0D3fkyxx+t> z!Qlp54^Rga#o>ZzEDd{}Q}AXET^B(zw}wtGNUXVkYne0~7_Efpq`A^$zFE zmkNntBslyYABoui;`^~xQ7eNDhxhO;%8Zh8DF zF=3!X^g9!C#BqJm`Ta&4m_D2!{w*_<#!VJ92(9jKiz|;)gk^DP2iEgV66qqomy#0& zt`D5h8MYB^-%ngK4)DInbuciRfl9lG(FMT8e}GrHg!j$hdu73ulakNg&u9P%Yj~g zL4zSV9o#=<1FA=w@estT`KJ&k{HkxZX1LdLv9HixAu>Pl41I{aWR~gia@h9BWbN1_ z#sVX!ULPSDHQf+!@+n$9Xgn4`~o+l&4 z%?IE;gRv8SA&l`U{jf@zl9LXk;&36QDT5J@pBHn!0T3qSJ0-R}Gnnwva|jBSYyug6 z7CaRYQ}da9e-yY3XGnivc-RH(h~vE7l(RY&R|ll`Xv#4OaMp5r!p|8Jy&nZ~4`9)4 zyn-u#=|b&R_6-I!wd$ayEeR6)L5ERbGH(6RKEtNuF)cFO zfJ*#>Lu59#BizQdVts7X~q0(XJ*k-c+I+J#D@?+G(3eNNG2( z)Nq<4rcKXDjqlfJZ!oB7j9zOPxok1GvAY@NI@*eN31u*vm(#& z8iHmvgM562u*VP{0_xYh!S~9_j-LUBLgQaEr!v|7gGDo zauEdesi8$ZfafDTszvCf+H8t?k5G@uihnqR8?I=3hb~4OA=F9sqnbySK4NUOGa2@Z z)LvY<;6Nf!meV4{O?w8}zo2(LDK>Q8%+j{RwHh{zjSsKnk^N;47>?f_vK6@%GKYHv!| z$rN15y8A&l?fWcIbA9fOt%QTr$vAdD$brn6f}qmx${4-{$K4Pq7Q~-E>;c`MzJ_i^ zHLU#Y_i)y`YNxCyTT*%8or`=Y# zQeMTZm~$w}wE(Q53PA-MxSsFiuMGi>GaXy*f@mmv;SsU$no^px zV1vN&@b%uo){x&ed|oeh?)TlXdbzNV1iGmhu0tqE`#eaI$av%-F=&4NJf0oFb@7wZ zCr0A9_Cmq1){r2{`%`RSI14Pr3=-@&`iFSma2>d{+jiOwfDH+YF!K85UjP$WMzH}8 z*#IN`BkR)}J~N-U=|_9ykz6|L5y4Vz z8K+?~@mD$CeL;RPS#P#5^E1}|eMx!vw~Z}!-npE&_~KeS<%UQXQs%W)vu{dyCGg7RlLwqCzv=C+QP|R|)8IC$b1==@r48C_`rmma87C<%b4(PYQqnoyfm~hJ|3L z9#bH6{pbJNyI`QkYj6kciK6Y>CQi&}kt32lO$EGl9I&6u#&vB%G7b zU|S$}S2E`knYbTrGJZ_oYg`ec_pXAUIM=;)LPcZ0!nx#>JEM;2!U*78HebpalQmO4{M$;xU{`0af7~svPHZh*rSte?N0P{!yXtnw zex3S)QVOOePVG6=N+EQ;NN5j$G5+%hKj0Ah)uNfStl{zYFD-J4_Ch?#xl6KXInVpG zk!(d?0W>uybiSip$T^{2bh6V zUBgjXt0$M8lq%mSc9{juT1XX=#l<19zh+06)o4!p0%)`XhYp`G96$ZZ{w~YMjK@sb zfY75k6m6Jk1^Sip0PIk%-?vLTgt~oMY;Nn`f}D3mv349|>52f-k4Oh%OXKEzrC+np ztgNmN4|BNd(b(E0HIbCW&pe1roJ0 z^BJx{tNIjFYD{#lHE>?2Q${RB`PKNi(6{MRTaYg8y+UD{)4+dW|A<@6Y@Pd3hsH}f zk)krCb>QEduy6trfv!0F2+qe|GDW1dd;npP27{^k)0hrx%1m%C$OWE-fpcq!3Lp3gsLM3A0b1T*)=@s0j@MEQ+?j_A{{cjam-@|yAc>L@sEeabh-ai+;emc4Oxq63hxSi$LgKDqc?5K6?)F}pWWa3`0#r!Wnq z=AM*;#hJG~m7n(ynsSaEW>>@%74QLBkPJ~{EC67G zT_c})dAWhQx$@#jM7q&HojyiEuZ=oD{oVK99nXu6cOZRLfw}-#J^X zs!%i+S;itLo*}{@^bQ;AH5Nd zB8&F#G_gvnT;*v1jSJGAMF7a!fNnTyTx@rE*m00M^YGq`#jb|QQ(GB>Ojp$^0Gm}) zcJVI`pHGGoW?~#dPicDlAFjU)9*gsc)SkQRcB@-BG*&U&<7W^1DImv!RDg)}9FQ0J z3-Y*$Bdt}>{xXBgQpUnrC!DJ_@Q!||!Fy|~ze9Q4tvBobF)RAr_2BuZEuK^0H;~&` z?|0n8Svylyyb4WcK@zY;APDnV6#Z8E%G3H4l2$f|7RIy|G0#r28v|xmr}~uW&A)Ey z4!qVk)aUF-ASKIEq?o93mDJIvl*2c$-Y`TK97-+s~Yo02PRR8 zUTO3R4idg+7K#FH)B{(BW0!{;wXkwMo27WyDbPF6cc^$VU&O}#AVh+b|&YxL>R+NIFKs;t4# z)O6fXj*7_C{e4Xb!u>Q6sS0><>w3aQ-o2_dxlI?ueIn`IHawoXjw+R6BxKxbqDsb& z8E{C-&Q2PN&N5Bg7yU>oMf#}xxmIY-jcF=Y2mvFVGV8#EM1W4cet%>G>hxyIu$4Ka zygVH2NaRw6*=c0Q3f$xXUZ-@+mIyX<*l(3 zY7UtMjbE0^5&%%gny?l17^|K+S#k@9jBh#05^*zIYyuLrl%k@gu*VvS^*b5k(sV;= ztDcsre^*c^3YAa&FW|z7nprgOMsoM|l-Y7A3D;E)G3t!go%KzN(Xi$x$GFsiT{IFy zC|dritaVPROu5H|SnYVI1#IH1DH3)ugQys!TUwixiv!9PX#11p}p;GJqcN`+5zH+M@y_yw<-xChNr_pkU!M9)f0~QarcK8(*0~ zTHv~6(hfkO+(AANTFOiFr=g1A!U(7?0w zpfglS(lfGddSs%ll}iN}^XIjtHTO0Sor#z2=fd=;$qt_5n@kQi%7VmnBNyno$G<(} zdy8gZ=HOK4p=%b(DimF9Ps9}hpW|J}>fYY9#Q>FKn-m*TF#GYXtJ3e8QbUKdhb79Z z#VbYIw{ut*g?-pwVwI9l0jnwItP)n*)cv=C+P%&iiLhgCCYUu1tp;?j$f(siqB)gg zT7^&zlgLpbHIwHCtfUn_bd{2Ah1sMzS~g8riKsN#ikQAlRP@PYGi*|>aI=Bb`ruCH z%7DG9o>$b}_cTX$5j7p&K&Ctk?`Ig0}iIS3N33>34VlcR>frlW{gYG&SdmU+>7I_KVGpr@2tn>c$eAyK?u(h^h?!$Xe4?Vt#jy*`#qpe^BFIGqDGx4s?!dRyL zutz!D6>d}%!-mf`!L(Zo@v3+n+9f6v45wZB^oiY07I?MNxyH;vv}X67P00TCZPK!A z!>KAnaU+o;?i+T;34Tb8-@u~9>t)!^isitg=vp4&yCbvol)u?`MQH$vJ$9j%lpGsI zJ*>qAGVpJ?1H-PQ7$N=2@KojoHzpq2C%oh6Fu~484@9hDCMh0D##9%8zSlJWyd#kN zckh3_V40~YT<)MuJkG{E7>B2prgDJ72pD&0P$=|=FA14{Y9RE=8#nH}NHnDhwi1hM zFJ2Qyh*EsnF}k{V;fVlFS{c&b_pMxyrr0o36aR8q_Go?QOtUas==g~^xe*H`k7tOb zm2|*!Ys;Heb67A`wdp7_xAv4}xvTku`TL{H3uCMWYj0%@c2Sv9PxXt+LmJqjB~9Yi z=@5`}64YdS>m=gt5lz`Zy-mW~k3ItmWev&&qI&gh%pC?kDy{+gE1lGTE@@?4pmCpu zdU!njqptJ~)P66@`YUR7z_9lHb?YJJWO3S)&52DL2JD%iH@1=R+AY?GfWlfoi0AUU zI(G?{k`FBTZ*acVc^<}ije#T^1aHQnmWtc&Omj{!sG=u;uAI+8eBVrAJ>*U?3;S0c zmWZH4AyrCH4p0D~-BKNf`SPSN_CxtK4sb}DN*MWS zf2<{G2(@(!qF5ZS1#M7fB5J_4gUSj}{aC0VHOQ3`LDdH|9xoz zaB+nn!DazYwWB<1t{tJtzkBMi4pB2Qlm+za?i{8h%1gj_2M<9?nPOTS2pyiJBlFOQ zE0ton%TryqWRx*)^W~Gs2(%-9H29KXsReRW`vyU`+?udk6xuSVfxcr}kM?nt5PdgC zDPoS^92NVWtF~04ckO)YUcr+NLN5nhPevx{Kwk(pS5Z#EeO+US{dR6 zeWMeRhJVXF1*`n+=sYc~6-bfnUCZnAWoo@uBNE}jXY<85nN)AT7i@N@0yr1tR+Has zOltoh!tOCTvhH0QeQeuKI<}3DZQFLzVa4j$wr$%<$F^;EoHx(&-+Q0;yyKugts0|N zeW|fV%`xY7{qAF$KQn?{5grOlp4-9`S-giZZY}w5i+r3>;;&BoneO zWf+fY@ZrgsM7HBRh#{*GgpO_DddUGlz zgJX}=Bh)4dKXN=_slc%Qg%+IWFs{-I3vT)_<#@ucBnYFDm2y&9HDcVEGM;v43eZ%1 zC~3}66d6On4*v|Pm(^hMU^iOLX0ld|mQ3laYn@SBVB^S1{^Hsbj%*O*n?HAS-uyZh zKDN6&GyH@vv3iKSrGg@Za{R)Ad9=odk*GRt%9+IK;kYnuxaGZ5u2r3=*4Y}T>uwy9 z*5~;!bfgW+&&FOXOe=3$j`m?(&FG`$uYUVP8>T7%!*js(nG1h^X&c)X0JZJ(l>qyf zPG{BZ?GH(X?>$lY{X=dT@}rxtC)z)m0G6~l`EYnvs9Y_qh9V5j)~t8 zvMn7$tC|Iu6{}B)gjb8zdy?nw%%EKm6)odA=^~xQ<;~m&VZ7P}OXHrE7g3exI=SeU zZK!qVoY5aqz3xVkE*Ii|Mc&U>Xiat;yon4hx#u984LO2!pgtDF4=| z5Iy)*A1?gG`<`8~t(B|;I|-5bee*>TXqGVWoF+O;{eLG7F_l)ij@7NH2)$uQM`~kE zCu*T~2}6ygc+nA&sJU`r3Ep8NFKxN@#Q?1OL=UP^A-K=RKjLfWkrFM_X6c8;GORPs z?IPH)lX|d4;r^UyPvTmYrpCQ=C^k-|B`iQD>a zr0>2MX*e3C7Vpl**`CrnI%Y8yJdQDUBXc*2@7Mb+z`a{0u`%@j!nJ8Uw=MYd?OFpm z3NAV=C*KHz*Xb?dZ$F~7P*F|zt2Lf6WNCgD! zv9r_hgPn6`bYED)av7ZS43;W!lL_#9s{Cx5y^*@Maa;k@FeR#K%6~Xu6pW|L144 zRkuOegH~IKBfe&w+O%${d}$vwS%op6xrK}vcLZ~kgX3B_0HdruG^ipyOv9O)?;)le zi^!y_ZJZH9K&G^HGrx^z!HLpHsx$5FdMqwdqtvd(lF8;?t&k*S{oDDG&%GifS`!kD z&Y_{|;67qbsBZQLS`yIE@B;u_wdDIDQ6m0M035>Q9Fdqyb`Mrwj6le||Im>}=EhhC zN)ecK^ocEYGqA+Wtz`0DhylY6y{7{wMVUUM0l|>v&tecLe#O?AG`>Il-qcmZSjDm| zmeeSksowa7yKRqRKR8dmf{?iKG8sZ_$yHsve%tP6s~pfInv?TNN(6A~5VEZU-b^=M zjsa42^^fLMarfs$6)@t!*BZ=gpA<Ja@TGkv(N({QeSix-8p;21(H(kZQ1xv}#V^=0Sx(}9kG*0W z!NWah=R8-l{`XeEf8VRPLqlh&-u}AqB1O}Vj5UlKlj|L<}r2-Dio4v|__@UDWLPU7gB@EhR|2i2$Xa6K!s zxkW%;zN=u~4n`jTE(D~KDYl?5dF$FictQcmw&#buW3z~FonrX4(}b>i!L-yOR<2@qON#{u_kSwX|}pVwwUYX zYp44asJBED4)lE;7Yful%i{vEQlVaZSLnBmUpbM+b{~R8r1a2A9z{YFHnHGlonbfJrZ94Pla~wL_m|fOGN5-=HKTiG#2-- zr;rf7sGu+zp(S7hmQ}$(&`24IpQ?_!J9$$>lE9!D2A}X8jcf1~V-SlLpi;|cUT3<% z58IyU;?{GPNrmOJ(U-Gv;=$Av#JYv{h2lBHSwmWYB_-ej!=%Ws#T2A+~I;U^PjbY1!~QP+>ssq1OV`g{o<4R z?7xx{^{G-Z!!8d=G>wEXCGcm5mVDfVjcL`lBJ1pBX5pJ`A24Ok&7vCp#{wT^nRyLL z90Mp*wF!(Ioyw}8g!I^xc#xoYb|?@TeEHugJ*d}3uYG^5_wtM?_##lB)$`swP^L-8 z#veAE)pYbY;6eQ}NKugie*s$!UQ~)=LbAaQTvK_J=A7cO0x$j$%26>0_^ZiNd1R#c ziRENndQs{4XR_@fkp5Dg-@RArTpMHU9_rQ^qck&^xe9}l@y|y8qbQr&#kkr*8o$6ZRhO43ZZsc9bASR z-2gU32JL2XzX>q>va8<;Ns3v&aIgfQT@77*$=dk~S7c9czywj@hUx}LtKFfhX3uZp zVl$!&TFR}ZG7lmAlL2(A=^*p;NeSuNQe$POYtRF9b{(_?cM7e-mAvt#5xw3gOrE%z z;}}%JX3DdpI@fvZu4aKxfP06nl>47TT`ZTvw)EshzeV4rq!yQWQZ{}Bl;b(!Ngq7r zO6TgbOsdec<(eDHm*`B~x%=x&2J78%7AM0Pv>Ng(k`FtT?gFq-fhxHZ!3S(u;fJon z`KBYnX=VKNqn~)9+o|;j&^SpK&MkKtS@_i9(xr2yV8~UCg0rQHmeiaG80&F@^zlrO zosrn~EvN8Uu_a0GXWWb|0{5N6)zdh&HW^!I4^zdF=GB;@{~>Idn3$sBYH1~S-oq%5 zV5xtM_|2!L1Ma#a)vgL)-BRM+bQR{h@!YW8zTn=9;APX{^rp#6VEj@I-N{(Si$Bk= z+-9#{O}+=L(&=(e)Mb7jg^D3N3N)Y*qhI>o+J%NCd5p5K<MVYQKP&2jM%cHuj z{<12ak}|+AD!x97IZu^ZUTw@kx-2MU3avVq0#au);dZR01fH>6V1T#+I2Et!e<*dX zwdtp8uGYG|R>8)V{$CLk5UFsO>zxuOfn|G9^Ts?r&=}**X#*Xipc%Yr^w3*i3lUmG z-$XBcHJmQYU|(szY@=pz9gpuc%G3SX%8oXx@pl%*blQXDD|~{B{GT`q7GTF^EkTrz z?2X!~$5EV}z+d;tIA+qSx0_oi0srp2#xTC8_i@UsQd1Z#PQiEvxXG#U@;YyO+wg2B zYS;v{cGE34{Mu3O<316NsQ4wq()(v6mUMi`JTc%)mU%dpH63!2`2Q=F0@wnP(?83i zn_JypUFTWjf4$7TKQ{AKWv`FPmG23RqF7pK&Cnz*CdQS_daALyN??06T1$`qTi4gh zh;$m{MJnhMqj!@s&dx2&!l93xa>)kOGQ5CM!&G0Yf`qhZzuc#v<-47_VSoKt+T_)1 zBwK)3z}3-lEeluiHwD(U4gk5mK(L`K&wAbMfn)La!Vjj0G^gduTeSP}#^ul4FDJ4xamsZx~4QHN9G&SI~A))=H>XREgfkWvWJ?wh<>0c!W}l-e3o# zZC)mY0xD40u~c+=Ud&jG$AXq}{bU6L1x`_(=*`EOR0*dpkpEaI7w{Lkr^2&&HI}QH zOh5jDGyYDIWQQ&>2Bw5bFh!yEx(_pe)bRuqF)Ann=~e=Q(!6NoCk3m(b>bGO_bhdT zINlTNUGxhczt^~z3*^Tl9;5&M6eiHg6!ZWwM=(0L<@cEeC6ktAAW;Z{?*ywRlWWgS z?}0QD^H3<(#%9w655PvE^^fwr3Rc<-ull6TNEj5N6nqpEHD!^>_fUA3GW$aJZ0uOa zAGG(+SXgAY%rafap7M-`i}3DNR`O70-md|VvlppRm=zYQ7?0JF)ezpA^f!1Z$kuFod|w?Uo36 zRTZe+#vcEFj-Bki1eFQXCd;RzjA1Lzp@~m8zKUoA`sG>c6U@I5|G_QQOPcMDsDOZq zcmDryOMtzTIfK#viCg|x5cPk@E$!F8t9=4F0m}YUz(!*pthNa&fyO1)&4W`>oA4rv zXpKL`txU#>EO@%DyWjXi3$v56IAxplh{R^4$fkE=4m^JIy_Rj-K7O@x5?{X^n;+~A z+^$;w24JcFd3A0v)x7l8cD+bzvYk6-4ddMn27aVFFEmCPKsWL>&}>+p$h=G^?x}xG zNv09|%svb?{I}X?ynj;ija#l<1n4pS2e;&huReo-bqM-XS^)Vu4l-P3fPg(QhRIzd zXOS@8{4!kWv$efVW+?c274$9!THhcKu(C&V`-}Lr6`!D&bFt8@UjZ#9qY!XYesMmS zu@t3-1%(l21>iS>s9V(DM7j`@7z`bBql!r_1)TI$bPLJ!qw-s`LdNYZV2mhYy^rzr zwR*_Cu$4vj?@(8g^p+2FQSF;7Z?L#a-0!*Ek17q~NC=8o+HuyFPAot*YpquUt}gaX zx-oT7r{3FpfGyZ0cp~8ToY*UIi!J+dTr#QN4kBF(LMKO=>f8RO*th4_ zFTtLsPg3AmsPDHiC(aC&^`g6h^UDDj%r{_qZ2JxxuobKFK2uD|`k!JS$EM+-IYT)J z>abAiS%Cb?bVeaS@5i@p3CHz0oH$^YM)Zwa@}H>kpQuC*1U+7gy>jd{Y{KmGX1}=& z)GI_3C!%r+aJY~t{Q%(VO>(YOZxW0n2tn4nel1pPszVaOE3!047GEbgiyC^bt@Rz@ zTkyk^2!UppzHS+86Fm4EtYwDFw+(TI|R>~GV_k;;4KN6lLGefZcqYnZ`ck}G%X&SH}gU1 z!sD~J=f{z0j>~qO@81BIbO0U)!@gco`+w?uu?-FzdCEvN8o?mk_zHHyUN&lBB=r{A z%>(g`?W?kp!rSHpI+NotS2e4~BmLpm(n_L#UlGm}~sGhy0U!ZNPE45A# zs`r^$1pK{8$F`S!?`)hA;{0y&MN`z$a|Trcw-4MMj_l?A#e(~8^T8ATcbl)@9S=-A zLM)lno_mqu=$1fp0eW1+NA!w38F0}Q3U4#_*N}F3;<6eXFHs2SP#76(qMmqsa^J1yeqJ@m^lz7O}-6Rc?Bfx ziv%0R(%!c{o}XZx3-z6|surY>M|#%1^XU3 zdagS}N<@U#IS6A>WxO7cQ`q@HH|Tq*@FG*xvlwl_wJop!+*mH3GtM8%xndpRySo&c zbBauBo6h*>S$)w=ylpO^Eu*oo$TVDV5R+}#!MV*e9wiAyw&*e1W>IDEL<*&VugGB}i;+*PLFnlxIDj|t zGs;vk!*`#Le<2$rlwED@P&LdGq>wWv6g*+JYuCkqi)NRy0WjT_z%QQvVv247$89{3 z7)Y=XHOvqZ{?Q7*;!Zf#;mX0NNBTkS=rl^-J zlo`w0H)|O`<7EoL7=9EGs%pm*4LB~5`(`c6er_pPn|C4D)=f?{u$yX`2>WqAo#Mf- z0c9>V!F?z`7G`h9FhYSQ&y+8@6Ubn!T9yK;0rKsR~gqJowF8hFmP&V=guG1H8qVJ)!=? zTGr~xfM9@pvz9rHnJ#OGRMMIMu$EME=asAHac&LUWRIp?2*sN@5DX63jD3U67Md=GP>Hdtcjv|Nt#3}Im-spv~aQYz)FeO?LY^N*e#RX%U$5i zSecQmB0F?sLN8zo=WuP!vwi8ZMrKYW#&@{(gx;qCiQx;t=ovw&)YCn^#6N7MPV^$x zJ8b;uaB3(BdlVN8Iu#5LQr`g=e31Zs{N z4g@Vm?uPEA?x95fK1%IJhsOD^lOFF_SQJF$IWPov5FW3}W~sljVYfg?=AVJ_k7`fI zqPjz#hx1d@wl2;DYFRtv%CFK$0c;Q|qHHKi+75vK35`UAA$wA>O7Mr~v*fQFWoK?q zXuJaC5jbw(u(V$4SuH3ISNl(%$`xQc9=tzUgMuV3yh!Mboc(kN0tG{}tHFCXYh|D_ zaI|bR@)5F*beP&%;Ivx#%3jH%wGI(zDA5$7mqFZptQ=Y*=O{6^AUWl#E3t#PqwrNW zRzCqnOA_BBH9+de%*bF)IGsdB5en(3u}W3`9*i&WYbr^>z@)(rpB=mxes!&&`e@|yL!A( zcM1*EeR9|z8j7{7tx_l1P|L8Rb|4V-?)KjCxk#J;sF<$bO*k#yZxxgJUlmic@cP5O z>hiZ`Hr5(CYCTjvLSyPtc;4ksq}Iw9xUg)jOen7a zkPGg%U;G|c&Qe3K8qzVCb7O{p->#n6qTCGn+D*?Bza zq_b>0)rRA>l91$7`UXos_vhKFKx!nD)18e7q^ZUuR;|%9%j^l^*|GCVz zpW@rjd}FekD(aj6+CAj@Zijtt+<&xhpe+z(!Ox-SOWm^$zQh z!Ktdn|E$zUv`ohmPB^=@yWar+F4ggPzW1+*gfb-lS*nK~iz>~nB39YWzu&jZ@~5h& z9K6oI9Ev9V1JUo7T4K>Pkkdpzet;T5EWqMlJrlUX7i`Xku^)JQ8)40#s^k!y`Z^e= z5=IddwvB|GzY)*d+F3tlH4v7o&Kb^Idk#o6!GN!Xv@Ud%Sxx{3Fhs;`7r(*FIzK0~ zgwM!#QTwt>?Lw#Ap2fdC-M(GY-Z7~I&@WM*2RCf10C%T{*Mnz#%fB*Ct$-UbH%6n( zZ-&DZAfLIOzVyI1#jD3=Zd{Bky|u_Xb=4~9EmcVjFFb6WGx2w^B`ln0!}L*1-~hPk z+2h0u0ES@hzXjL_ict~kcHdV=He5u=)W(P<{m>8~i#q?k$s(deLq>pKmu?2CS#JMR zdsCp4pnG^rXXH%`qBM}s4efP@Or%=v=y-Ec;p84eq$i^iLCy-4<|A7 zNEe}1KoL&hMoxs4+*|(D zV}-hSjU0gA+FO5p9;aHmnk?(d^cv_lVlEakw_5oT-4dP%d}#?fqaWci)ziYE?Diw* ziSX}gHcj;B`Bv)oB_joT7E8j4d}~#3X3)IUGKf_ai)1B`=@vAl@?o%K9QT^;*=Sdt;Ir<^MQshRBfwEdrPvKD}<|KS(4zxpMD|Ss-^ZR7P zYl;Ai9pxHEAoaADsao5;=SN}Hrj{WT!RMI}vPbQZgxF!#;X|;T_kK)6OF@6WC3-k^ zT*wLGZ9P}Ri-=0}6nZj@>;frW^*G&~58()6=Mhy0yoeppjp8+2RE`R|#%uX!aVSqTF|d* zgk9$!orS)(23CeX&YienQBR!`5g`R}fG={`VGUNC2VecPx4!@bs5^$6=XY`e5E1~* z<1HDU8o#vzyz^=xl(V6=*H0dPPHxYJucJ+x%Rg5Gg+?Z+f8P<eO!I4jCq)_B6%Ej{-Nj>+_1M)S&Py-O2`%zEk(&j%jlM%o4>cA0&WTBKy0kA zrcTVhB+R#VX*Tb~LyUVZ(gSgQ00+NPsWM@}+%3U4A}g*2?$adgxfzk6W2fKr<;Jq; z2RtB;u$6$r(BCuR-~Ckk`J5mPu8+ZD(|xSgFST>UdcIpI^i*Y~7FAbCJefQN}q&@=GGagn31i(GW9Ve<;gOU zt#JH4mm6zHXprS7Y2yZ@0GZs~cuROA^}xs@Aqq$B`KiJBrbc(F^YA)R?9Ld7-U#w(eRl~4%7Lb>2PiiV+UU@!gPdH47)DP}&~JLUm(b( znTJ|i_EX@^{&f|gT!}P}mDJtDV;mZN1zHQIaU$DHznS$aIRp$68I~ zG^|(W${{w%uaSyUdlXJ96e@(zsg`J1_YcZ7j^8S&08|W*2(ZxoWUrO_;YgtzPdjxj zj1W_whN-AY{quvA_gPRoh8w3&F$cWdU+mQvs7+FKJ=7(j?FuV-3xQxCZ_H~(OL{}3 z3nX_g-do=(#xrI|j0mT0<~Ni#6s*;B$XC#&5dYQCTRsN*tROx3@tkM$Fck0r0kgT` zZeFL5&ZxKgObPeDye0L^7kVu{&Fz!&>X*^bT)IcT&L~KqRM3{_zlD=&c7Rg-TJ|)K z3+%vjkn%Hzc2dZS{-xf z!vF@FHpW++GN;_)5ogZuyvs&u*@<6#I}c-djMR2{T&22&FXY(Jy6`Nh0^q(hZsYOC z5*$wCX&^gF4ARpEo*N_hKn8Emh_*<=-rK$k3}|J{xArYv*z?-%Y|VH4(spF_K$)n+ z$7XcrxR}cb5Xl575q_}UoBC?(DSe92r2w*>O!M%%vdG$4bOAcyPV?jp-_zshb*#P<9a3$`rcE7k^0`hTf1yLsH7PX4^MH#eP3rv5Q zSw-&*VKoTMx;;7)81O=tDkD{VRsUZ1c&%D5`m7E5iZ?Z-tRX*}4vsrTuu8bZF81dU zY4rnOo9oE#Xok~Ar8BLy0}7LSVC1Na8*iAOo11=GNdEE1`r z+nn;y>|-5cIfIvp<~{N?Qzj9j<3L`$e*#eyMWmr6r)_g?moS)RL7bK`L9RRuN(Q{= zlO?775m*>I(Alf|Y&+-=62XT?H^Uh-dw{4UUYn-R-YCggn$|bT0ia;oRi{i|vwsiA zV~P`;Lc<2W=O;~2Xy*rmvv9u|n$?kKB?H}d{jmH+Qq;!cr_-VID%T_`CzXS?Op1JQ zB@x&A^RF4PIq7DOgAbk{%(W-FHRd+WaQ7as4&O)`7bJ90F7pS!V^UK| zj8W!$3G=uXEeER>VgMw@^#(5{xqR6#_Zx3S62kgU@obT+(GqFU+lv9R0|WhM>hm;Z zb9W*}cQ-RmR}umsze+)ZQt{@JMi?vidOlck6~4e1wKaDlpO_a^Zx!^ym}yhSTPm27 z0Pwt-S^Vi^lZk-10mo}w_dM|3f;Cc8!R23*vD2OKWB7D!qySoaNmU7xQTJ8cdtd z;_86gn@slfB>_5nUANdKuT-D1YT7tjU-^$eOK&RB>#e#F)hP*ZKiz^4UhiHaQl`~A zy}N}syS%&i4)4(!a%z6Pcn|$Krs=*vririorYB)BVBY_T)9UdX-J%iJQED5aRR!dW zD$JIP(OJVi0!!ScO}tKheUDm$gu-&WIS%-?Cs|d1fZ!FRLBY^~prD|D&Lcrn;({Sb zQ><;Ep#lGmpsa~4e;+#;RZKNbMIy6L70FulFhIn|jtu+4S>~`O+(I>Cu?gqL*ABd~ zZh!EZGqg)f_(fSE(6Xa#OF@EmOJyhrNza`K%whbdJo19+?! z&o6~C%z2d&5ypCFX_s%{*5@WXyXKX{0L-_Ys}-IfS66afJW965#r&=1@||Tbm3C{* z(yE*DNeMrCywxk>2)a5J>?q3?iGcqgDL2?fqgxqN@iB%yNR=8`LpWQXy2>V0v{h6PKz0Msm+AJ+G*$xNJb`5?J@s5Q z&bNJ{6ZzMdbpwZ07+;~lcsgyKFeiTBSc%6Qr#u?KG6`%~M)U!ALHox(NesPPvwt{G z*a76)u&x$FlX`u;7V3#lwk_g;#AmFuOGl3Z(DwyBTz}QpV1@2A5c9_j9<$uO=y-P{ zeCmTd6MCl+y!o#MkpX!^fd>)8W z>&Fmgtv@+*Dho-6=`PwtLIgvk@gGyTF+$vg7m;bcn;oZ!>FS_Pw;^!!^pZ6%=a%8?|e7!{w9Rcoy)`=g75C^~$P6t=n_pd#J?=ubCv_*>(z$3jrec zEyM7jzyXYqoC)cXAEU$+mP#Wb`<}hwtb0erh49pw*wx3VGxt2Zl(;h!ebW%Rt!yW{ zlUed5=?x0A@RUC=Nz&%Q7V}-r{Wy1qjgsg+tP17As+A`#73X<7^LyJdD2^L1xDq4G zAaB?L5%?iCm+#Y|jWHKNE~l#|kN|BEl+@*}x9)aP&}`;xKqiX2`0sE@HPe%&%@!hF zS6TikIRmYNP=+r0dusWniYGoW!9NluYJ@4$d5A-XP&7mB@&2JlcE=Ta2ER;juWQ4N z1Gq6bX(YVxX=1i65LQgL%Stm(Y7%q5cTsOd8pp1Q^uym+-ch4|a)W~O1CsWA08#Is z<9wJx%cceQujvO1>lDM^&sK;lC{t**iR79C+TGu6GV@5w0-=YF;v@a9kZ*Xz;`=P@ z847Az#oXDw{;#6{HPN5$-P!Nl59;CS?(FQJz!U)ib$&iwy`(5O&@uf!F=gwEsNNg-`pVfROKa|AfN`ME$iWEij&5%dH^q>?SH#RjNlkb~{v5MBlCt)M@npV| zkVRk*@kW3CV>?q97pGF$;;-uH3(L*Y0Sm2tTvsa%EdMSuG;e5S2NAy6F0Xbh3l2V{ zpMs+!f$}wDm`S0Me6cJ+8ap(d%G}NP?Z;OM41yQSV4%Wt%Pw8c0N5sE4yH3-DQ4!U z#HXP)sJv-EV>EJ1Mu(h8w)rBe{@hr+)7ksR*`OwT7mUJ7s^(yLF)ew^r}OzP4XcTN z(2>G_(2;(ATYeLIy2+G69)#3mINkMfj?kUt-qoD`m~A`-3-L>@ToycnBEtM7?+8xt zMU{W$k-h^_z<=lw?0=?8Aas57;j}j__sbg0Cg>8n{9XzM3FUx_s8OXrk^(%Tj)B9 z8*K`UjxT_XSfcfc?1K7&QnU>VrSfssrDg340LcBMq0Dtj_JX zrI=+}YaBOAp$^JtQPw7Mf$!t4p@;YT4ddY>hCF^=1&ab+x<%S3iWEG>N(SP9N4z6HvMMpfM3CSgIP#dgRw8 zg%a@0C(Rt10=T6>79hjC#>0bnB$o?`k>gJ3CH=zoNJ;F83RV~%B}o@^!b}MslG6?`fB``0EW4}y?#sj^^xuDEE-by>eFYK0|KXEp&wtU z`s(4t0y5U{L=)K7j5!b-eo>_>VNQDhRSz%4*2xmRdUaVt1&!Zx=1|;+4n!1|LgH}F zAUu+?OPa<6{j{fY=6IlncN<9qF8cnzR%EoN-O{P90vqW1t9mWPLPsBT%{>i501{TX zjKKG!J+yCABp)vdKu+v@lorjAMTqCN+)GEr%lxt>f7}lg#L-SQA!8Cs#&9$e2eT_Lga+fuE0oY}lCN_l z^m1lnDQ#|WerHrQMtj5B9OS*{0F7btKsm7M#&@v8-aoJ+Afjr?Qi-eyb{nu${D9!v z$|0I+mHY4ogyjMNU>d9O@IOvJlEhVJJ;3cy_F!lR$5f7g)_1Wtkli0sCQJ5W(MA zNGwCUIWFRD_OsOJE{P}~Acl#DHTqGkA@RIshzZvtN67ngA^6hj za)tMpvmG{IV&M>HvLHF8dV-Z=8*zNb-VdbEa-4Gu2(_;%?Hod8cWQWmE^+!2qjCc4 zw;&peAepHxgQYqbGgPKhz%}YvlNNPsE*%rX1s^(loS7<}CGlXsdv_d|+3x9Q?755| zlXf^5@5n(X%P;p?Ig7uZFa(I4%B~rZPJb(xX65#9=-d=ws8}-WJRp5n(6#w6aR}Fl zDf4df0xDBNP|A@kx7E80t{%s;R@}X!N@^S}S=*73=gL$^f2n0h0&-#_pR-5OO*$#% zhmnoNoxDuRrJQb0;OSq*kxw_4qUwaW@OH(jd-Ei^Sm+d^D$Y>gM53{X=_dM_EDtn)6^CkQI>2hDzHZq2Biw36~q%)M166yN~_Am-d+Wh)6Nu0(ZHQ(XUN6 z!y;NxWYmxko>u3C0ZI9Ma_d!QQ=HEX06j8iCH|!e>hTX;F@PgHT`v{ z*rh;5lMMpl3$HDsj~ik>sK8b6> zlz+#vfC-j>TyXd6$zVmD58o;akq>0^L=;p_K)O_A_MB}RDL<=9*}7&O;+v2ZS+E0L zG(oW>okQc5mgPy9HmEe| z@pgn?HvlYId)CkdQ*dlqPgSQK$=)qs6T;@*QE`JXA(;#00g+;LI@|2R1p532!{eMi zg~MZ}{`5A}KClzk#0UFP%`T(nWNKZ!Ylo{4jVQm{Tg&xliX$Eq_h$(k=5waXfxWN_L;fMBF z_-Wrp-w%i9LWY<>0yQ<)=r^G2$Oud5ApJE(!Gi>rsPnv3j2M$ga$|q!A$|6p?{LQ* z;P@lPkEvNF32>8lBLuT@cB ze!v3M07h+uysn`K_i!7lQKsJSgAFc|^Dvcv1Xs+F9Zb00O}y8}%<{CFNBqAWWHoHy zUA-nNwu`Vnc(X5H^?7znvugBt>WlX)WKl&9T*!Z)sV9ug@f4aAp;Pzo>{xo-&Ir}U zvQ%0TA>5*g-vXy&`;VUsL|6;aZl=@sQ>bmG@$B` zYv%h7U1oTA$$XZVQg(=ptMJ_^_#x&`UT5^Mzg1OS9TMfu2&qYC(RYBg>1KUa#k>uI zv+|hou+0r3PJ_b6LRsQSRV$c zeg@g5H@om%u22IW6M2ooB{=1?af&Tl5%bkAk8+*)PO^Wvj!jdQ379TBwv-B#sJrL@ zU4DeFIZ~g)j9#A!kJZNE&(*^S^Ua0IqZcD%qf#UY>Pi`m(b($fp)_@P&J^SwW2-N> zHwj3ek897#`83cQ%W7+=E6~`eE#LrFohw7-lhB$r=Fk89wzHpUlS;47LB9&>Djp{W zp`2eCOly6p;hOZUU2Hk6=K;}fwB%+kPWM=Owk*RBjc}5F0$j&)VKSx|7=Xi5jE9G2 ztG4h|U3uKYdCF5a=cvw6C2iWQ=7X%?=cS=6o$zK^Q@?d9YmJWq98}xCohLvt%3AG# z6ZHaR$6Es*`k5A0OsW4y>z&}$l?B3rheZ}}kH>;UDV#K28B<3Cs;gPaP*`0}rmu@mdOCHnEGmn1#3DRqLK;&2j5}`mu+53|}HnPf5hh zeEM{w)`>O9l-~+!Io6IrR|N3=Ys0T*bro)Hu(CXWHhhM!^=0?(Q}^o)7wf|a2HXJjHQe9l;3O}j zlJydj>l<0N8BWbuzA7FZk#zy(pAPdUpF8F2UKtAZ**Z!^?&iz+J*fzniHw{gMVhDL zNn7YipC9iJd$eV9v~7h_*Hiq%y{Sse^TiDhMHT?AHHH@DS3JG+r^pFfP(+J9bqs=^ zvp0rOpSd2sX)|mBC4kI!{L88A5lHD0lAqBYS(^`5lPy2iRbSq+Za@n_DTs}h&VFJ#f0Cmwl6ghu->$MS7 zJ=NS{>l-wW?*#LA)W=Z6Ss8pO<9K<$Tj1Qt5=(l%^rN%U7YH|b&&MdizIJ;CBx7Sf zj0nc8#Ln&rT@0ft8Nisgwe-u`N_PaT$LN8fxZ$ft@Cxv421UdtIMR7>DnQwg+5`5l%+ZQp&G1)}QBI}v zbm68#O>ki%vFuWt`P|JGv-e9KoMrtKUjoEEj&UcY2v*H4kqMh@1FxyUm#HHhY)YLa4D2t-u*+l@ZR!A(?Ru&FDomgZo%LSQCH`Z_ zHj3o%z#O>49hfS^?wBT2EjYM(SyqoUB8$G~%YXcRB2d;@twcLU1)_C-fX{O?j31Rn zReksNW9u1mCn1iH#f0ecFMSQkZ?Vch(cOsvaeyg-BNf8CeD83?vEP_iGD*P@tPj3O z$p<#R|2i7!Q4gG3)_a8?k_Y^})&4^ar}5(9l78<{QflknOWws(5huqpPM$%)j=j_S ztf?VDEvy4rhiL_+5aM1y!I{lzRvC-lJNHpuaLZ41T-oa$-Z=qMJ|d7(qsK$6dCng& zS;nm`Bb6^3{w6daT1Xs&xtaR&8M??{WLG(0FpDT05HBqhav0@K*XgwfpORbw_jWl8;ivYt2O9f%|raDWP}H-QQmr zzI_ch4SrR^;=3jJ2o>aTr%KJSM$%LO{G~8yK0K6jS}d)Jp(|9}v2GR}sVlg78H|L8 zaarA`;7IuPxs^$$);vrdp*^FLWH;*#1Fws6@&Wj09_Z_=8hnzHxpa8aI-d*pTrrar zc64rs^+*70QdRDJ)UBDSy_bAPm-hYS9|E7!Xb$?~Cn|Xyn^`#OL*9OQ7L^qMr!v{I zMP&t_k~03jE(1{Q$|CF>)%_6nY4rYd1s!5@LCl0L9R9PiJ5PN&Zmf=`Ivsdp`K|rM z*f3p&*HS~)BHPv8ZB?p&?Ev)6&j4cdn4mwR2C*TqLRQ!OyD2i+=Bq zNmbc+bqa3PH1IqrAZdoSBA*8H2x^(^)8@*e0&!XW0c{U)cwjjAhd4ULd$46MB$ckC zDsX*#gx(%?1tzEb<5EZqz#n3gt=>Znhb+E@*^8uhhx}a%@-Dt;jv=lfxav`bqw;hg zAPxD+SlCOqmH~|VMRIj$K@y>cCdZsZDcAM=|30cLxThVOn`BS2O#xQrK>X1HDdvk# z(ULe);@KzF zs|r@<;=s0pC|fZN`(p?bafu>EZYNtwz!Q>4|up8fp55Ov><5tO?W2o zw+;DhshVPc)+feU6KZ)K#i6Xt?5q&-^l!RoQuHzE7ijoeG2>esHsEjLI}Sssp)MA6 z2Uf_5^lwQn0Jb1cXa9?@e+mwyjo)?Q*qnG`Ol&(7+sVYXZFFo*Y}>YN+nh{nbIDRUdRe_x=2?3#$Pbfaway*!{K=Y6qh{gm?(an3Uu_xCqb}W3F^v z7@b;j)Y)MuM>cR6r^KeVvlnBw_xQ4ypSr0+D17wugp`rptADFD$DlG(Ck@^AKu8kl z7W!WAGC7d6_dj2HKR$ty^ij32F2%E#VFTnTYE4mk{76-!{Qy8zQONAk{9DcWhURgq z&0&s&=tl$omi`0?2<&4N_rDF66N{*?v!l@t(k6PMM9DcD^Rga%Jk4z?ipXL0eHXqLNUN%#-Pf0P~P4r z0t#uM0A=HYtz-{gxaHM&Y@GzT_6*len7^3ptj@SoJ`~s)0V#m)8qf&Zi%+u&Tfn?9 ziJ8Kd1`CR$SvUNgcxEJYz?9|v%k+oNaCTK~YN{)i@E+sVoj{#yp0~W_jP#Sk zJOYvNt1ESP_ht zgg%amM__c*#CnZ?9ShfEQ?AEBTf9Tv2|u%eCF{=xWI^9qO-zK^ZUFITM%<=jiXB(OM?L6 ztJFz@zvi9AX(fX$orls9Iq2s=s4dR{=tp$-R=@{3w;=ZT1$r&CU5lTbXQ(I~8#V0d z1lt}lh)?iDaNM;E1J=>|zEt`(e30m{JDtQJ6A=jvw!6|d$nKHs>KSgkjH(?LL_I`| z2q2($xogZ(=SKDu_lXn%eINUxm0)}Bd@Mavc`PE@T(r9-U6lpvNNaWyoS!&s3q#P0 zwnf=ok55xkkorU(u3~ffFYN!lBx6#8sV{E>*Ge7hR`fk^=QWgpQS(5aJY^vz;%&fA z|6GRlqUwJm^1tG44oe^vu$NZUG3 zT39J#Y7ffNsw-8Mq;c5Xe6N{8{3A8Hj?FLfhOZn8KkV9!L_boP;kjxBbUz&UGD!+%13=9AS@WP1~fqZ?J%1Ole8-f7i#*=a)z74Vm4D@pm#6+h&>t9^=UX(u_d1K zQZ$1Tl-MPWeZW;yi#^?FlCOV3r-Q0rMD4EEG83&z;i9(cXa6t%dF4mXOCKn9D-I{Q zr)HeG6{m*yRVAsUq{q_Z#2_`95{;PeZ;6!RbReMZ5fdWSe` zF60ppWwkx+zuqNojc7#p@$kKFUl64K03-Q3L!?mXu74hSFQ!^{_>tVK2#&Kss2wA= zemQFOIT!rx&T5cK^9@o4r^f0u35N}EW^cc4T$aCa9f!=>C z@&PR&5z@G6KR^3F?mK#c&ATUmZS*kOZx1+nw{M#TDE%eb(+QFswzJR{Yg;}Tq)j`J&K;}hU_@w&g< zIsI8!`16kePcN9`3yCXRRmYL7^>5nN3$PG*YfJB_6jvF1#(-*=| z=$h*&ftm7tO>aHlf}u=T_}^`eeo&7NG(h!#w=vWCP6bE>7SVQ#Wd{EmQUxrk=WoTk zA)fhOPtHuUwyU(`6o&_WB`b%Ka5s$T$NrhB1CC_}SxPXaC)q%Ud^bp)9vT9Sq~5~A zG~J@uW+5h|&-m!7@;cUEI$U1T!v8&M%a3DKEUg?QNX#`~01dkL|I){tW=i{SkG$Ki zHcW+1))l?PJC6_>g&m=6#cnU~D->2Bb(yruwY->&w6+owFNkc=w1>hNFhsd)hEDjeiPJwm_{Hg{`N<#a8 zZ(aIET~Nq>Kw~FXYdm7}e50?oNGE15cAi;c+QA_y4Dym**>5Jz zqv~ph4~+DG5009jm7mecl%Iz1urxt}VdpUD`>?W^uKe%f<$)V{tI#9loQVY9Hjy~` z^v+#cF2UR6SaBtX;R}DpJCKG4$3qa0r=G6%;AOM{Up2@DrKoOD--5J+AAlw+^_=$o zOQ~sSZ*yu9k|v3*<#Fq>JWIVek&ZJsvVWI2D}b6&BI|I7Kw&dZazy)(SH*CRhIo89 z_P>OhXDs-vW<($$W>o*j$ZbkB4b1lx9Xn{)6cig+nE$o0;XhR-=ePeYKq1U0*I&=*DI^{jafGxs*Br=_<6Uex0o# z|JeS@Te5ic72qKu^emw`JU`eQb4XBE9eH_jU2xFsO7^Wava^lTl?V)zrUyIanO58& zSq3D=$Epvsb#>QMHkx5V<*qhy#_DO**>l9COVq6Tg!>En z>MiPid}2|a#Rm+u`ou|-q#rmhfw~Ivt%da_Jq;W^ogNKxB0oI~s9utw3LitPKRY`< zOx^yPIWAtrtsgCG@%5%kN-1twH*E3{OMYVm@TF5%$rS|#uW6ZIc zG`?27^n5~@CFy;ZISWzUkUO$mBis6oh|8ix8PQb}D^G*p!P1*A@H@nireju~@MTTN zV2)Fl=#WhlaL|e>ZEaPp?CjBVp!Fn2-`g?9(q{5ejpj+d4YJO+DH_KqjzYOiGz0km zi83q9EC<_{hW?2%+lX^UY2g!9TQtewwu0g;>%YP(hr8QA9Y-of_1qgWTG{M}mSMb& zIZ1&sn)hqavgiIHb2|2M+q+&PwJgCu6a=dNu<(5mr_7o4Im?n=a^+fQIF9c!<}mB^ z1~(-}os13IHe8imL4O}KUm0MIfEa38gag5v6+GyRqks?yOk1+fu*ESw%$-Kp7IqHW zZj;aD$$xGbudWgpvWtpsJKdgb->$c@_>AQcm)*BR6{mWByT#fzsHqV_GK<~%$p*J) zYv^qM@OI*aG&56>(~071QJ6sWo2DYd;C*HfbUm$bb^fzCe*TD>DbiCZKtY9Jfp`aO zix~~Q`7D_T!*LB|H2mxLhp_vnBP7uv$_d%>u%;K%O3EPweBycRdU&)>FJyPe|P zSCTbOV(ZX7_yn0F@(<)tP=gN^=>B`*k{P;wT|-{fxmZ5m*Jla95#~gYrj*6>JcP>K z=4h-hG>9HlD1#==%f4b&to(4x1MFtovYa8B&?lNdMy(rBYG19WWYm<4ZLZ_L4yD z7e@RH(vtQ$y*Q%ch+{Pya?U z=BVWr7`42MSMwG9d4|1UP-`m=u5av}HcSOCnl2*h2Jlm5ofsQOcza6?;|}n)j_(22J0loHm(59!Zl;wnm=#-Lw0*EUuehJ)Z7wWic| z>DHiY!oLwYv|2>o?XQC?4eYt={x0}A zBqDm}B;D}~oT*naN-xNst)MTyt_g9Q8plr%0ZTjE(U~(7-zy0+zQU#-+VpGbY!p3I7>;k}?q6Rj zm#NB~0!iTA`cIhYHT^C+GoOl4FAhUlQjMNx1I86Lp+Z`{6n)QKAt~t+Q#UwxM7|Ob zl>Fx8q^096&(t1y&-4du4}Q;`X)*_X$SA-Y&~#k1O``bWpc#LWP0lox5NMmyh~x=f z*i9MPH<=#1jFT(<%QLBGd(4Kz)*iok{G9LF{`A{Eo?83=cpEmyaSAjYxWiCG% z(0~U44~;%=Y!5m*C`SH^w5^e?hj*Dih5uJIUrkOWY*Gm%!GgLzbAvM;BkFJ?sa z;PY9Jh?oq?P-+@UTAkeshTz-}CTF!OK>46Qc({!OvM8;eS&a>ovGC9=erEo~(TZjf!+5f zu=VPG-W&9yX_sz$mUVW1=?Ajm4e)MTqbBSL{Tm`9_REG@=UNH9pxm|gCfKkkZvdfMW1u3y#eqy`euGGzV=m2c9#V4K)9nx@sjMwX za_&d9g<*x-?$)Y!!(?RHQU*B)2RY8#)P4D?W>qpVj4dhK$2d17h-g?6NtZEFjAmTG z&ENiTZZ5u4pX0`($p>FdErh>P(W;@6vDPIof)V7F5hpG6a!He;Q)J~-z+z!EtQp)H zjk|v0TE5pYB9qQRt+8(uBdRm5 z;i~V$!9I90#q~7ADBo*px7`r9+w7SSw)id&!RDw964$|zyBP)!08Yto7A|xwUF#9Y z^)h^EmAmZYW5pFa>#2ea*#rW^v=wp9bfTpuG;T<=<11AV*!e~94P7MU-T=IE2y5i8 zlb8MRz|@K84X*IED^yPLW-1h>nc*87Q3I?qY3Tz?T03k4Po#*@Wzq3tt|S5(sNXxn z$h0doD_Ed`iKolA02LUz-ND=`Yt3qo@~QaJ{%bW+(b4s&Arhzd?N?=Ccj{4`C@yo^ z_(Vk*<^pfM`Ezs-`LGqu|2pyi?ainq$|!pyI~XA2=`!Yb92cAb#tYvXu4)`qn zJ^qK<(BR9C_#4sjbz20a(57G`*>^2__J+>Y${E;#Hvl8!Zs}-Q@oM+^FfVfI<{vh# z$<*iB63>0Itnzo;`B_LfD|fC=Y4Dt!Bp>?sh7xA(X)4zN%`$#3^+xrVeRE9$y5lF} zhyv*(t8%3xPr8Xz+oF{}+*2WUMeE*)onj4gBlJ_Zm|0kV>hXCY@Pmvh-_x90WcXrR z4f_uyI001J&*t7}i;ZZUGi{sg-9RdnX~Eu)`o-rURu16((PoryIg1gCH*e0r`{491 zTt^x24e05IneHSQiy11fgsKmgY>judd1AGkb>wN8bMsl;wXVI@`g zymSSSCK+(lm@;j~U!#Yt2$TAMPm7JojMKFoL4f)Gh`(|<4V-gQC9kEI-#aFt)pqNB;;C z*fm()ves%H);u-r?I?3_&_A-Q-_<$3fc(X+&mmdGO;EV^VJA0Nb|;BRr@TbvE5ds= zNdbK7+}gJ^4#8VXpWQ1K`TRZagD;z&3t66gp6pzo?>lp!U8P;cd3`gTHcR?XmgLua zkaKmJ*ki^vjnRy$7M8t)JQ;@u=--?5Nn}7z?BLZZGAjfW_>6wMdv^O@D}!0M9;ftr zvB78!?dKr9=BWPmow?feCd}SNB7Q^j00$84l)c8sUjV$b9lqY4y-K4sqp@U`HfvT?7p^Qg$Yes8xDhInQq67|SH3fSfp&_8WE1-rQ|HShFnD+%J$GPZ zfo?lly4m->J=~;(URZw*PZw@H-h#{@#18(kw#5z_-KcGOSDqdvXNsE5UW<*CE9N-Q z0CN%Cm(N4l0tYv@k{$fx7_W_E9S*V2RnP5Oyb+`JJ>2!V2DhE1v%-PP>SH?62X1tI zd_%>zM+GDHWo#zP(FnrSDeY61zp_g4!!(&KZ=WYZbO zw&m@Rbh|x1(YVeYC7kTOl8*H!y`_G40o-p+meWX0Xd{nl7b{-KXvJ~tzK(f4bU-t+Df=Qk5$Uz)2AU;)49h#focxP zv+}OHYGO@EBx`Qd&~(s(@cVG><)_E9sg%`7lXboDiAv$AJ3`u{XzV+-eejHU;2+Z7 z!uYU$FR%Cv@mWt@{_m4}Y^WwyWL!Rn{Zu&N5C4DBezf}~5z%1ey#VjUaaO0_5n>yr z&xpIa$OVkrIgUTj{r2;70@xF9lCVr>$qmEA_gInL(0@u9SdT4MgC?1TM8|)&)yorwC0XALC>#vjw(iu_HL#Eb|>Wkp-+aaqx}vi~lF%K}CSK!i0bW z?MSd3>w^|ri}qjo)*@dkP%X@VYr<`%o46h)Tmq*DH^fQ=XObz!6#R0aaKlRHY4nfRd`Blq)^g2Am6eN{ zIW5soD9i`m-^^z7c`PXOML(^%&y>|d9gAec%@=cTlDE}Z%&Ap|pVSM*VIWSy#{J(X zJO3z2DIoikjM5JKE}|^(o(L~Ic&CQb9u+6=BYw}!$R=c*g$1}#Eg26r%qgHnJWT65 z+BxuJ%ieMe(wAfCP3m@G(}y?5bg&1I_4Vsu?QXQiC7nN&5+(oD8q9zNT|BsG;i&1EtPjJ3xp+ey`Q zXq@e4d6?;glLrj6Yhe^0I(}Y_obBhk;iwQW9+uZDP=5pf>KtqhcbS;Y`^bJdRN4m6<3=I4ti&Ho2{n_YH ze`Qy9X4l`0!b*>no?>^B_Bt!1XL-HUXa~DqyO?N#bfZZOl7Fyt)DVYs;%8d4@&?p2&>bxV(ZVno)Dp z$aQ;5WKJPV4H;;+vL}6HTiVd?>aoaBbn?3>elH-X+zr^eORV9OSuKMLsEwQ7$n+zh zI5i+Jo&f@P#7~r8Hms937u){R=ST29yHU8N;9^e9ol7Id(e(3L(|taPfm%lsmt6;; z1YH-sLP1g9+i$nYn`iy8C%xQ($Pmr_0;a+vCTw;oo8S#QN@yq=K9<;KEauUkXkGjG z%zwpXdAd4((_eB;Vh<$2Q`n~MoT8q!z5I|JsPPV@&YLbHNR*rw{@^rJkX*6eti zL@b1mzyfiTCE%$)MQqj^XJj>#>BiXcP(ttdMrjAx*N|OzGCGqUK`RLUSRSwvrhEvj_UZ*kBN1_@Am$yyPouXm zW&&A2VOkPW^L}zW$dm9z2oJILUw0=ly)dB>)By>_bPf>1@A`GLkytEOV$Xye^Au9C zbd{PdS;UVdRV17haX6F5T12%9o8Vaz)UCX0?R(F8Hj790)4_vyQYSpTLCi&H2Zb&K z_b0o4a;U|FcrC^E56D|AElA=ZR5F)f;6Y5rBrE_4 zJlZ&Hz9*hzCu1_*jp1IMSOLn-k^357EyWhk-J}y`#nQkFwKrH+G$;0g{wql?=|Bw ztc@I5HKASP(%xU)s~x-=G3*;Rv^GZVFpY14AO$&t#cs?m()`1(xXp73a~~KJS^Y_T zC7Ad=2qIMcaC7lKd7atFvvu#wCE)P%eeu-OF98oL)>I@B{9PxM>8JYf(5&eNjAx zGoynJ&zI5gitGA=2wC?(U9o@N;f0lvBZU6os2a9D|7i_3%?-Lm7r^EWt){CDU#GvQH zZqh~40fkoRR^^xu!*aCL7Jera$mn}~tmRXM4RDNUS}U-;$ndvM=>6}rJi9CQdag4Z zX9;}a_}w}I8lP>B^xd-CFI$nQs~xxn0KnvJ>mIIHxG zCaS+;e(h_)Y_WREt|Y46uFNwpl&dad3~yG*_`S{m;hr%ZwQVhQK{IFFqQoq}XXww^ z2C8C?C>TsAe8rPjehtkUvoiEV8vgfnBpHzUT=F4~04CPw2(n(nI|ih&A&skpKNfJ+ z6~yc(J0=0D&$6*m3xGR?WY{<~Z1C(@0WQE`@AOS;@mqhK&*L|k7?r~=)+UKS><`viw z&0;!pQEh`ZNu4i2?~OmqcW*CJdqa|OojgZ@pC;G6bXZC9fuaL-IGW7w875uzaPYOdu*k?@)R~xi2Mv=8-=8@;Jk=Xk(~ncG+*s^FT0-Gd$)_xF zz7Aed1ATVY<9`CJ!a(WfTRQ2nhxPCCOZa=}A;?J9;fVh19jiXvukhmKjocNhYV5+; zsa3PSKSt0wAOEG(Jzv34`QExEbHVFWR2~+Lg_WfFl4PBXcU?{^b|ibvNrMLqzZu7~ zK-d=yBKR{#&tQbPFf!#%?iS@u`C)MZb~q+73c#xw1odKONZ*ueJj&p}lMy^99;SQk zrJ@CAhq1S?g@|~IG?etU{a8QE)^4fswCoCe+p7YhQVC#Qd0DSn7b_TCv(wpBql1vs zVDl?&twvFZ>{msogfJgSgUO>AC&2IJ=xOpIv}>nGQ8VLGk6EOKJ*($Q(gHbCJ~abL z2e4#(7Uo}kVhrC^iQnnR2$0(Sg>|yI$nx;ZPU3On>{Zus{KOIkT5hJ8XaaibaR)d2 z1lSoz7T4{%bxVJdszMS4p279ihiM{0|5B(LHp_4P!eM8qb*S%ok9kV)uSA3oo^iX& z&&@>|Np3I4uK#7Ai0Gk8UZ6~ogE$@^0BE^K^wRI#m_4EI?8e_9cZZwv&FnZWCp32y0oy6>FcT30o-s+^Y);(;bnzBfFv!D_1k8m z;N$gtpyY1(VQQ_Xx_YL4>(PV)^36G^|5?x1it7_;##A(y#{fLRRK#b^j$z^yfIk=5 z$DPbh9p>$vNJ~a$gK@#B!xwlY@Y$82eU>T>@S3GUnWjN0MF3I2QLrTp{J~ml-v0cs zY6{8G+JSt~osfr&W?NYaknfHFYG}S`NR`+Mf=_ICU5hsF?L@!bx4?du@0z;L;IYh< z97L70j3Kk;x~OLeQ@2*4mtz7|sQ4ChvF!Oa{nb9ID%W?2-iBwP#*VeW`l8?DoBKkF zr zoq(p3McU@E_-C?%aA;x_iV&rvv|GWoP&oNOAXYS+A~lBKO+tewU_+FEqH-_6`sD(< zXF7T*K1YD(S?5*1P>D;1E{9VXwIlDq+e{O)__IHD#mCgFTI2Vad9brcHvQc-lQ3cX zwEADVdt>vQj4BwwOmdz`LinEAl$@+lmbiJcf=uB>!rMonR>U*5|NRDPbo;X4Lfm`i zGgE0|Vzr%WvMBd@)H-0RIQb<IY5GL5S+T67cCGaAyJ7q?-PFEP%iQrG`;x7#9cKT#X}z|r^3e0Iae1U^+gpsBYd zJpqhEAh<+g=IVm*zdwm~AqcRH<`XtI~aZjPb~$B_DcnceCa#-^z&gO;p+aM> zkg=jq!HkjzKhD%}tkcfQAsDHt?x0GqvfS@%=U$R5nr+4VsZl=hUS<_Jl(2Tehv0qV zdD#y=S0fckkRZZqKf#7LOc;tpSjZYdlR!A~OpXqd#O4#tj6EecI#zz3oOj4T`dkFC zL`-P>ZCg)pV$Gw+pGa%#-$5|1+8?7TuSJoE(f zLn`qKO4deepMS6`CY+}j(jps-8+EiLs*xRp8()t>EVaTxE4Iv0Z|g#9+w##tQS&D;}j^!L}c`qSj@j(E~)uALyWaUCvJ zSVu*&q4qJo%^$Hs8Uy_$a>^P2f}cnN9i-6dV$xxcjVCH! z{t;kPN9HB1`HK}`rT|FqrP&?l9HNB|!EwLAhazTNN_@>h3EuRhnEMzmTj^!GcvVGK zB&I^TNk!lQZ?o3Efp z-uCgTUsKr5@oAC zXwBvK2Vo>0y0>yHUPMlg%2Yl8YANt_f7YmqVurRE+X*>)jedl}giMAvu29@Asf_U^ zAqbri`qfF$FP1`f$PK?cY&G3|GV4aos~6{9Jqoj0bMX8fJ9qTUy#05{;ONz;d zkV3HqbWj&O^;r?HSDGB9<;8QAHHhNXYgR`epiz_Gu9qv+p+&z#D%`4-u@A}Vci^^l z(_A@G#t?CkOes5$Tl+%3y!BOnG>U7=T+rF2k{D*%%D_Y)^J)4~qz{$P#~fm6dS1MQ`IncZPrB|D(zx4!4nnb;^$-CF=eQ^c7~7h~d@bO)5YJu_ z&f)lLMyN@_G#9ZFr4j+Zu53=Ez4xP_rv8Lsh4hO$)R-8Nh+0h++M4|DkzwAnR9l;Y zyJ!5{6z=Hd71l_~NlN#>hXmIk5xq$d66vo>{e3--ff-+A(E5BS`b+bWZl_f}$M~Uo zBMaGLY<~#&@xv03< z;nvM)XsS?31;z3i&I$L5nON|Y(RQ+aJ&M}vl(5T!E2T^JXSa``O1m2*Ds7+_RDggV z4=C5=a!^+!S!`7^;m*9=1((uLlA%|5)A@Aa?-*aR^AD!9XB@P z46YnqQW~sIx4v?u!dVQzyP)YNaTD+7(VHR1L?d8;!}PT7O(WM+>NP}TS60e5{bY@G zF+Ig#c7iCc@wvEDNoPNIrPeq7(%<AVhyVqyh^sLB%>{m#J|hdNs4e=x z;N8V?ti?EH-92l=aIjJmKQY|;8kL^(0kWGkHP6QkZhfXZtG~6e;JL4uWCCECiF7G_ z$pwPi_lw5bTaR^)oaVq~NqPfAnW*$K-JS{lqzaR+ueuSA0%+R>`8TMNcmdzjkIN;* z>;HwYeadB9|C7S*qZvn;8>D=H*$d?yyV~t;PB=|QktAEjVMMXXJb%+Vf5r7r4@50v zT5-`n-q-Rh=5Lfhj_OqdHe*DKlG5WV_skD#dL*W?8^l-&=-UjIbH0Lz!+L%m+@&1C zgteB*7jKt7Y6R}oChIJi*$8j^Sik!S3{>-~@%7B}S<~1|j6H|DzW@J-Vuu6$DO0qt z%v>{JuNsOajW0WY5CBq8fU0uskXI&c02~69t{1(oMRW*P_ZH7=+Lm`;biX(8610)I0jOi@|QJ3#k}^+F3u#W#KXPjIbf^pgz4t z`qF>Rt_(J;lAkTA0jE){Ys?zTJ>99GI7?SIGmMmS+F%&FTAR}!=;%kCQAdCpsw42p zK@!V!UDZ(kwSb2UJ6vk^`=eP|I+6S^m)MkQ(5L@WjBcZG22tyOg4nVHc6prfwSDa& zCPD~7bb=F)KlN$Xd4)c|vn68Kr zCNPJUKkG2asFZkw=tp=0H~jm*q_vfZBhM+3Kv%uPmPhzp;`?y2i6}W!ffs1MH(FRb z-Y)!qX{*rM>HkVwS!P6s@T72fd4ph;(wXFRp5CFu@DUa=)bBx;lI=I^_~5WpjtmiP zMoa}e#DqDmr6@_2u(jZcBT#u=fZ&v(7+#p#Sp!`ZoR6f=F{kY5HZ0GYIq;=ImXfi7 zg?@MPk}h6)T65|cs0mO_OZ$EFy8lwvniyJ|nJ!DN(3c>!?7iy}-rLGvu^~1M|A;7+ z@BiAV-X6-I;xnIE|CN!H+QLX=cpxB6>;Fd?DGibmrwEOcqHFgL87*&UX=3C||38E* zJ`1Py(dL~y8qdUXZEcgFluFn0x9fPE8BSMQ{oB)D)C@lqz`w(X$3etgMSs2VlwjFN z2-QP`4OXjwl)c@b@LT2RPH*Tv$T^H$hybdFy^~T49-~?*vqf{ohE-Px5zb7V~3{6tnIxNA=ca7B2WL&dY0- zvT7LgY*9Bzw&oJwt2Ku$gN5Pc)Ch_bOV z=RmD1zQkrZ{q6J6)-JwINZ-8O?Eb^wuPFK?E??M8NR}jiDr@U#TiSY%wGww<;ZDM# zizfkSCzaw0cK0j#S$)+Ghr{J;Us!4h{|Wg=hBSj^{HRi`+ETT+JdkG@g#efg;Y zi@7nR8=b(sCGpB6YbeN;So38(>8;+-sv?rBTQi1{n)f9Y^vu()lis^8J-=SqOv?UU z(z7=m|BeJF|4H+kPUMzK0=T`6ORP^+kqok|KL}@azeJdhTUfN@JCg5@^qiK z_$!{j>1NM`3%|)Ef2`#DOx?@bEVzO|i~6cP(~NXK=#5=P#5PHGXd?eR+D}@3@_XM> z@IOYQ#N2nBcJOKP?-!uGyuR4{*=OTeTYhPB-ZDU~IhgKd#eJ1f4 zC)e^(CtbZ0cliMAxb*2f|4F&yI0OMAv9qX+RXCQdZNY*0XqK zS#`3F?WAs5{y$D~(P%u)0Y-_>X@@q4@<>DOouW{mH6C z5wsG1l&Q3^`5|F&EO+AoWjvFo;&;)%g3jws=$tc?L4L2J0^cgoz^oiCJH;y61pl6; zVI(poiN;z`dX4)JfMq8;1yHt_^ZgS#2GnH<_4vUUuyy?G5uYHL<3WdurHnhxiehyW zL5SotM(lR-bHKI=q7g@g_)1{(6-E(<@Sv^zetpjPi(qP;4k5*-;-5xhPa%LD1Xnji2Tk-+YaU*E5f1L&T%Iqvy-= z?@|WVcuLifs>aN0&Km@Cx_SXqs;18{aWq-sM@zbw*+WlybFmTEG7hUu_a5{a7>Tp3 z()*GEgqbb=H#N~>6CjyrxcNE8U$hvE5F7~H2^7_$GveJ`Q!8tF61vzpNS+JW&O{11 zU9FwP;5NqghBsm?%r@WVYdfvPt%FUU5meN-!jJW z^U>E9L}+ov`NJEkNzpF5B?5RJYD+skfqD>#91sMCuqLcm;0WOx5&NF+N zkZD!WsIMW!Pz#0;j1Tnu;}_{8D>-y`A7VBP{67E|yUn^0Io((?87@+)?Y;JfGm z-(2ddWC+k-eB0wZf$5&(9U$PTGT^foJO3s#TK#tC>Oyg917E$9u~hyvBp~Q!;TEx^ z?%*D65&{4IRL%Sd0=g>G0=y^VV&zeeGTr|%vGTZjxTUkFM`2}K-5Ec)x~$!}4=cB9 z5(*k$kfFYp7EGr3(^Jd;Q9qRlUon?2S0#raD~?3hE4w`n58iGT^9o-U7crY{whS4n zgDYj=#QWRpkVGb=pNp@(1jP;=F47WUfxhlJqzg1QhWBMRG9E6$olFD61H?=Vpb7fm zC{9q{C%gM%7|Vo+#_PURlXT#%&WrS8_c!6f?*=;jev4r3a|cNJo#21geVnY#@@R{u z%r8o(+c=T!Ogd%toIoH`f{?HX?IRWax;+&)YJmZj?$A&djX zA9wPlUuo){HtU7RRHA5#~Oiz4yy7w=Hsv8;gReg&G8rV zP)$^eA;mbd|IXF=9{44T=gFJ)C{r-A1TLA~WyxnreG|;gVo24~x_^}P7Mfe-9&9-^K4lAIuC+lZ>PMF* zz7}G=kmm@h6b~9LQu5_ajBh?!hxXm25WUwiI4s@9Tb)jgep+A^AgK+XJ#ka;mfJ)- zii&$lO(ns4z$dxuueg(YdY74m;{kwfVCVDsYIU#{=3d{08a-S=xO6zBMC^^^_UCh> z!XT$UcdMT00%RbO#xtxtot~|N7yK-Q;N3S~PL$r7u_$`>ShRzQqFfRL9vQSut!(v& z3aAan)p&M;H0&?MVSZY)I(b+*l?xag>pR&jjApTv9{b7fA2=ahx= zvQGIY?f!4;k1uwNe|#QswOA<|DEp7!ti(~>bk4H0+5tz}gYo{c-#>Fxj&HpRh{!B;wSKy^*vYSQz6x5#aPB)} ziePOwccLPZhweXTARlfMc$bgp6T&Z`h$SG~)lxUxFEJdt@JI7mv!fONFi%$B!PN>7 zNWhy>KB8#1UK~NYLh9nR9@guxO?73ygI3~i9DH3DFw2@@6(dXAAaP{fx z!)~@ZvG(}PY@4s~cLFGoZa$t9+aK1prk*w#S+j+)8_}DNx-i5T=5JJP@vB0{Fs?eM z%7a6F=GTMPB1PJa^VwM4;2xxlm_zI%Zu5cpJ`-7R^L;MtijO{gcw*oDykReO=jfeC zhFPc1t@VZdG^(q`#YkV_GJLNMYA-B>nmxF*@9vYuYV^33%o-rA6pNnSFZEDoez^teO?-)ivy|E^!Yl5s45f5{? zsjixqeTU0sakRs-ZlXmU7w<+^DU2CqDj(@Gd%YLJ3s;zgoJQh$0se%TQc@hDb1c zc$KHw#(V7Am6Mz~vesr%RXk$1v~&!1G=2Eg5*2*#yN_F+Ah<9=7U9v#qH3qFlMm0< z<9D}#$)Eu&nE1468A;gN8i$UU$m{Q@136{Ly0&3SGbClb77Y@( zNbccC*KXYSDngI66}2VHGupcv)BYXELo#=AphQ*iC$S<`;;-L-i=fNuL^IaFm|i(gJGnHs+7mYYy6R- z#(zhB!lGR|SJjN1<^uGG0#QP9hv-5511bH8d4V~eV=(9A5~t8Fhg&Q}b0LcVi?4GG zj`Z8xb(~C$nb@{%+qRRL*ha^;ZF6GVwr$%!`R~1J*ZbBvb*ffZbyt7r>MzfFp6j>n z>s}IggQ2q0bvLkjoM&cJ@Q8u=sz%k{@OQbjUngV3Wp7meF0ixeN1i302#@egITg__XpWEt2_d>~?*t8I^ScB(Nm%JA+B!2t z*g2#&<^?nrparT66$LNz*Ol#9>n=>Qx7U`zj zK><-T!W>F{eHz?Y_uSNT*?KI)yhfTr84pmi!t9&Iw;-QVtv;!45! z+$4WOhup$uYW|F07jF_BOxN(_mvUJMRa@9d)TNw9q$Olu>+S@bMI4~WKe9Gq0f?~;^YIn#OnwlHF0$SJ_ zKiy)l1MoAw4Q)$im}t4iitj(>jicC%b+H?_EHSD$xrxJ5XMqR&~_mc8NpaqSrfTUk+u2@BciQ1u{2Ag8n`U7dyQ`pu}MGeMSN zT+0P`TkqQFg<#cKhSBGpCXe~k)4s!_ltHx!05g_m{~?taU$@8w{UMws2c_bwp-byf z*;M6EYQ9T{Yt@Cw&>zFX#hwHLo@AYa zgGriU!!y9w@&+=%OXRa)&{}@%jm+my@KMI&1KWv&=)tb?pfTN(IB)M9OEpuS4MGMN z0iN<<2|TCAt|VtQ79ii!ccsr58CcgH+KWm;!v8gk3?8eMh`WuejM1`#xEOc@fj^1e=7)`MUWwd-nHT)j`AZ>A-FpDuJmg{Y zr5IMe1C>Y8qZsDKos*v08Hf)rkt3}3`y_0{kJOT$^^czl6n<$Hb;k45YfKOv8<0`x z)iucVwyN6bb+vb!1H&8UqLY82hG533K}b3?TeAMt)FB5dXhlBCEW;{D1HWw`a$ym- zlN7>=%NMP{f#tUEBX0Pu9wS2rk$kYy??6>^7Adi3p%AIDFl16DJC%nXSQ_{5LjppQ z-tlAOCc@(8nFMQnXJS`HM9uMjtptP&i;4=FWBn+#`)SOA6f=M2ppoEOrrV^ATKFd{ zqVCT6ZMXIm7K5?)x)%(C`>V!wmbf6`9_G#`46gh5<=v|LnmQvr>aE%#v}HCvjAq;# zG0#ME>ACc&;ej@5WG7cg<~y)7gAK5vt~!7B*`gQ@N{>m72n9<8xLLL|X!Y_Yc(8p$rrNZwL6x zwi$ap3lyR1+PQNvz7nl(gpbRD+q@;3dVXbA3^IiOq9upQB|>gV$-3&Ogaho+G1QD2 zqK=N1D*}f{AdyK}aPI>rT;6qTpO~R5-TeVeWj1{53ggC19n>p;6R&^!jCzJk z9=3Keqzn38lpOoJ4?yVOQ{Q6;o9RqiZv%U2>@EK|26VC5CS}yvUNc@m1e+W0HGQG( z_!sdxFIIa;!+{0^3nutt1PvgB&w4!dgqsddA5HypL3|ssH%Td2VJq0@!hGP+IWT8z4H6`F~;>83~oRuh(Rb%?}yUz z+0Ktsv~OL?4_Djgg#}=I0@7xa9XpVet0TS9O+Y#hMmY+@#{BXt=C)6_?{H$t8@p7L zP0$4#1ShYuw@^6b+b90P*RVgPP;={*2Rrb*7_wS8rA()npE@HA}*TkXL z7`nLGaPN&^PG|ms>k;Sn^vl$sDlghV)P>8wEiXaAU}=8RNC1?Rl_wbtM7)(GkA^MO zE%b3nXiI$#%W8~0-Ed7yQFSHOtp}NR-B*Y#&{s%@#Sho+yfb;PxYt^NYtnNtO(K*) zqLE6u8&_&$r6J!kB`$_r==Z`cM4U9KsP%Qmp-@I!(F7}aMVwIx7v4MEubv&i^f@ZZ zxCZMTlIPfrT>#XTkKP>Kb$L=2@Z11Iu6!Fl^9UPprk0U;t%7wbrMAEKO{+yyKCrjL zn?k?}&nP4c)tRz@yp1lPB38a1-5XJdvF5E#Ysa}PU4$vBU}lH-?Ded9vQp|hnTr<{ z!|fvsDqi`05Xt?Sw!5=5-8+6-s^YeoyK;-?C0@|ekO2(TpnNe$C-QW>0`Im|@ZoB# z%s0Y>7=gKG2zn-Gco`%N>U2GQ=-|`7ni`%1RzXoVdF)>$*?Go9E6APn3?!sR)|(Us zw7NDVl2>1DG_Va9+D#xXSmK#$8M|^>Q)099d zgx#0Td>Ju7lN)ZDPt(hhMazdDRJ<973Axgi#+r-N$^+9bG&3R4d$)}*k@P+{U$9ff z&RV>9-TqV!%qd&6&Y!&|6Kz(Qt9<`o)HE?9IsnNoc(qz6r}KGZqGy(}{q51ii_+K# zjgHt8x!Zp7E-{UCY)27_W(!Kp(%j0Fi~GSX|22RWVPa+D8RO% z{|lB{p;nUf_aH&bWs9&i7&Rma?FL@jK*R2fr{9nmpjB5$H$}Scq0~i&FWHI#(zrOm zGaTf~Y0)<4Xas0m=Y^7BCjPMY*awSJH?=|q?ayd_ahq2rEw-9Jdeu+!5mNmo0}>ym zCg#l>@tv%m9Dd-kcVD@59M))CBdwVS%H1uPvjUtO-o&3-KfUs_m;*S?0K_}HJE;X1 zZjaBB>4EkT>Z=vS9F%}W<4Hll!v>ZSp@jn{_kfuB&minE_;x>0)4`abS?Ru3JKqe6 z=$4r49r1o?9CY~WBCm8SyIgptGUQ;YE*xv`BUBCk>hb@QQai|?QY_E$8N+~YY0aMx zEGu!NMBeM-SWbd=S>~gJw8Kj=Xi(R%XeN9Q_(Bj%w9caK9>5!-_QWc4?p2=VebDOs zXi(wYHx>P#uykKa`5DeTXw=~o{w89vu6X-Py^rD^CInH#emguKjBOo{0yl&>S^tq) z7d3P<7uVsS+iiE;UlNt%CtfYYRxZ)FI+6CuKWN_Q3=bKi>N%e1+MBG*vw(29Pu&e* zOO4e;ul-m#O3MfNqWC}P=}MYK5+X41EIK}76}HVA@9kR_zl7}^mOhFVWLk4JUa8(% z0gU?%1drCdg2Vshr|GGOG1c?$Z+g?cCHn-?VJ;b>uD7Jqt za8Y;9c=X*M04HL5xJY2PLV-liIrJZXy5{#UWld!g1McN{`TVL!&w1j1>FIozc1igE z1D^u^%}>Mb*v8sGILqk`@}pb?4V;CrE?Hl`Pr*&W@rS&AyLzW`SWjil6}F2L(BKZv zUq4FWf{?O$LKF(L>3zNnuq;6sO4y~&nvUHx0sZ=rk>FF9VO9j)Q1@VepR^*E=Tfli zpUJ^J@#@+P##k>H`jU*L;^2nXS8rMX-|&=Ln>)(2ZTKHrO7Hg%E#1@oMy0(A6VrpS z60WI@)jp9-Yf;6Wli0YXs?F66e-d>ZdaP&X{e>xomPKrzr{t_6#tQBEk_68hsY?)~BC~tMwOo#aR0q!Lhp~zg& z+=+19NO1=FLpElRU}Kbn6pqWzHhdu~u`c`PFXfePSRgB+83(}F|4mA(7j}8m68d7c zMgH^@()G*WT&j;uNZeIi&*#zV^3ZX1l9#&w(e=-`gsu+p|H8EiB#9JvL(@l;ZKA*y z5Ghz3_raM*8)(6OGorI7!pFNiMj?f9*z}w&5T6W< zBjqqmnmb*2#qrJ~#^rkf{4-y?^~*lE!vX?A{`$Y>i~p^f{r>j*y^Z~EIztB=YdS$C zIobb=8s8jNn-{yD0M*m2OgfAx(zss5Bi{Vt=^a1zAzGg<9XT=l!CfsZ7g>qVS-;*~ zqHw+U&~2d(tcy{wG{iV_q0=8X%F2d2>BY`E~h7+owCQNym zUNh63f6Vll8|YS7(IPLx7av6&-tsy?Ew4U9a?i|kg3iv=s^RrIzVci>MynKAWb8*y zxOlQfB17P4PdTL)!ksVf^3!F@94$jc&z*q-=yMI zB)#~f<4JrqKva3;8^f6kJ%e0=s>na~Xyat$eoH0ZGLblK8*1GQRgix&bsj3z>hn)= zju1GN5Ep^1Bf-!uo|#M863#3qQRd<=GgUyjO7(%#C3z0;EECHTxJc8Gj1}}Njn(oj zph#yzAy=D|q1TsE^XKe`>2uDydA3n3rg?XhI(hJ6@t_X|w165=V~S?Phd6RPd#P8S z9nZEfrag+%E(8!-(Af(V^M`CR8MN&od@saU8s>fDxvVJBL~7|VPGWo#`5`;7`cLPI zhfZIYXkeY2Stx0!>a@f8QnO1vC4C(nKsb};BetYS9ZqwmKV-2$u~G1&Ei6Ske;W|j zgA|i*>Jp_z5k>dpjSFdiOxhkJI}Pyl5AUE;HBwV$t@kBCN53KHQZ^XsCstf@qUQ89h z5o7LgBxd{M`)@9B0!ElD#~;=uFGpRzVBUeOot}|O{Ley8+;+i*bkOVm)N4UvQ%)wy z$gG3F zg6o)?oa(>5Io`!TsUlZ=`L-cQ48abPuTxl0Y6)nps3q{&@!zjn8&yips%H99Di=Ng z{*M7qiG2tbKR!^D)oM6l(=O2s-8i89;dA-v^nn6^`*Y{eRF`n@LU(}6vy3_SfZ(2$ zoUpALp+RKi52V4GU8Y6|S?lQ?y?;!DiAun-Ksvsuw-_KnI?!KYYaR)*SVdWbxZ~#a zPaB9c%BV_jVBzYohvbk+2+22Cu6UgTL|{D-!-LopXW7(hv>jlMh3owc#o0br&$a0$ zdNMS8XV4CvJYh{{PejsHSNbIbp&TsDneN4P(49JKUcgr2ndUuxlB^W)qU4x*nW(qA z2^F_hQD;+F5pp&iR3YMQ6m2;;={|4)=mD8t{%Nh0dGyl+@1cIKh=`_Th|;nE_pA%B zZ70QY^WI$e#h3? zKUqa`s^47<+B_-i^K@kwtQ?ijW&5t1=McZ2=M|7;JN>N{IAS;DcUib&;NvNH1cLLQ zdE@%PuH^NXs(F z3?9U@p^p=|pct@VR!w!u>7(WiGg%HZGcf5ZZ~ke)StPuWP-PNzp-AQc1&44~bKAeak0QgB zWbkpQ2N)3I z6RvMF!W`l_kg+gc0(3h%t3Kfs*mRqJh{GH1#g)SbvWt8I2ro?)l-o)(*?N+?ze3x< zPgdn67OW?E+0Mj&={AX|;$ck;Iz51lAUCZMR!(J4$;DE)TZh&c=vc+8G-#qlnxlm5 zvaJ!6x}Vhp3y{8Vz*7*Auzj_dEorIw(Y{!4?Sng5=fHef2e)HZCfS1k8ihEM7rs8r zfxV;knuG)a$wxA>C~elk8EM&c_%YpGYXtd+M`N0Mm=wKdjl)o8EgUw^#5%5BGPkWQ ze^~fl`*)%*VzkR2E%M~JzoW)B&-b^aN^J%-je~9xaInue<-K{X=xoHhRP&qX*H@MgUW;@-jTOO2IRL)+F@jNP8EaMRQ)zWh`&z z;go)ts!G#n4ZO0uTc?Fu@9?EneN{sMOW=SOD^spAPp_iCiL8K<5YX^7%!z(MT;*-3 z)Dr!Q$NJI1F41Y^&zzq{Txs}5%HM)O8*LSzokPFqR zL^g-~85*+5)J+JqDx;s;iAQ_V-x_&usiexFm|IVWsKFc7$%LG)x(eG9?)24uZciSu z@UWXZ!~*J%Z~?y6X&SF#d!j@JR{{st+b1m#p`qcBd)9Y ze*GXtz!vQrGQJY7P4b*x)U7-EFzAIo{7)#PW{FC6HaroPW?TLC31m3D&Go;q^*;qn zM)x)}K`TRlrzFC>@VqJlgR3;^wh+ykBvJkAYZn4%kMWXgl-JbX$6X|)M8SGgZg~NIpw1h|+$45w1o`{^S5gkhB}HWuU0Ge8uX*-v3L|XR_%_ zMgYiIroZX5Gt%X_1z*=E{1qzuvW=T=VnVeYcV;11>SHz+lc32L)kxE7jHg+sC%!0E zwNa_HICgF+F8Im5`?Y1qDn+ZxTL?1g!m8DBzQdJXujUs%{Hi|!cxY<~Y|iq6SNd+= zxj64J?b2-`6}L(vuEzE-|LX#SYT*Qgvh=4257ybj^9Hodx|UQ)E_Hw?63PInes=4|SGP z$5W^R5keKR-!Zy30UaHgnFt1@C`iwd}`9LtW-0!<6zN93500kb#vm4?$v)6|*bizi@i!`Pks z7!uo<5=<0+x~v6YZ*EZKRI_ZT33V}EKTCYgrCA&ZXH9scEn^ih3Y`?9ZIj*y&3_+~ zB}Bww5J7JzN^{1>>(suka*#^sW|`gAor9#1cAZa-Fl%^SNXHY?O);m!s1!ex~uc`x2ae5@K;M59K;4ZcV&e%0GbEpkd)8(ob2H7|`N+6_B zMRJgg)u6h{P*m3Y%214HPYVLq@P?VK$5*%p!9)Y%2|Wx{#Hnun*^gp{+KAon;6z(b z4Coig`lAsN-^Gn0l)4SQZ9tx?EsGk2zc|^0ctK@BAQ!5cfq7d|7Jfny>_#cFkFA~+ z%c$o7%$-1y?NBSHs>gLiJVHe;Lwrf=XGZwsqFWStdiFaF-z`wW%a&9OY3_AfJ-Qv` z4ao3A>CNX+1$`L7oFc&Ey&`$NVs9ba2Vj%2uacs=uX#0*SKh%U*R<(T_Zn8sZAprD z_Wapl`FO)*Vb2t;1^`*Kt3~_0zTTc2%iLJQwheAlGvWCIcXB%Il~UVOibit&eSV@O zr^WIH$s2fNAT8V@x4k@c1GN0N&V+G>xNGWY-9A}1_;bp$TK>r(;dsE+%|2hA4*)oL z=`Pf)%#HJ0$-*Fax9zOJcNZ6p+lt%o$5vWKkl$<0nxyxZc7!%zwm2POGUB$NJ;k=i zsoy^G8?OmR3w7#BEzk~0oRO&n0-waT3&UTyt&i--$`K`RPe!>3JenrcvZ`nnF{~dd zUA-P*I>iA$D)a`$LxngJY~f!|X8|!dr#DJwfsb!AZW3v(9=VWlqxVIOaAv91tl&SkEsigl#9>ds+bdIS@-q8~~p+>^nvZ zDxt?2dKM%u5p)0P7-U>uNz1C=k(=~ckL8p|s_OaME#7oJ;ZMuIW-o44$&8g^5)L{! zW+FFxMFVlX&~G5&aT2fBc5X1}~iP*q5)7 z>)50ZC3!pdB0-slGKY6hxCb0C*_5~iaF_~%BB7%zQF6LXE6ypgpy_9rtz_NF?8e1t zglmNF2g&C0=`{v{JjbS86W|Fc@&k-LbSe4ziL|Ow^b^H}u~>Irg6cgtQ^gdj4xB9d zRH&BnMv5xZsbk-R9N*=cO?V6<$}c&Ko<&)3q%z6!L&KFQfywW1p8-@%@-G^mzx<@U zCm@p0@%sAq{Ljc8p3w;od%Ev)ne_+2ilX@@-V8wJb`PVmP*SR5nmw%yPSzQ$7XC6b z{BeecmqQ_|{`o75R==R;nz^hGCaCx>$~_fJrJ~2Akd#lGIA9sGT$fU97XdkocV?}< zp1Er5bTO!WaWS}f4G)klT4B-h%)HtUa$~j|(U=$1x}DMlF3RyEfu+0B9akF~g%LrI z(ud&oy=c5rCHJnz^<#){-wZb#jc2bENC`L~uM7@69;u;Szj%D~>eoA|o5#4t^+yH* zy2QI<9f-1EC*=r>oCnxT-K7$ON%}V!$QV)e@uoiqft$faHU$7{<^{sxi?zo)z48+< z$k_S_BrQHeN`L`jxsUg(Q;fIDagg)#3ALsM9*wS!K%F|!h+BptKYQkr1C=WpbIQ^oC5 zDu|>t&#T$iao}994(MoCi3!WAI?^#=SuL1#-25qSWMVYJmhVJPkVbOf^MD;=uHQc8`6Ey>jsrU^LT78{>D-+^%bbk#E_p!FUu z%n$AQEqCq?5N(#&yW|Xh-`aYPIp09R;+tw^>E0tg{(YUnk;kxd1)YI3E-MEI=c%7v zNE;{46;VWqbv;!eZ2f}u<$<|et6N~v(7TS*nV7r-EgFr0;5z1HNAjD>Db?%bjqlPT zc1l90ffVq38LsB9OTD&cOeC5zR9kQ`P8OhDWz(y~SQ##LZ*e1fmry?`{*kw8ZR9>c z8R~U~T_(GldFljNzNDEcdltuB-nCG+M6AtoerGjRCnjTs`HHwY`wvxo$*-?r0=x2N z8bnT$+T}nkona+rTf2thOvMD{jYUHdkoxIRpR(Qi*QoMI25TC9`WIbfcffU-nQUg- z;U`Px>s9$-A6eP0UFD8l2o$!B*+|WbR!_hY+v; zhD`p_{~IYfe88VXEH;oKT59LG7|tDAMz`RShSKAtXc z-kS&+jVFNhu!WVmgWs=A1bhC?r(MozaxC{ySnXi@Ce;%~C|NyzmLo*fJN^qX&ddE} z$OF@%+#d-46VKPM$G^kjZb@Qq3 zT8RIR8kJ>AXn6nW=}{GoAFE+em-#Kj8%A+dyJr2}y4zz`m9-HDR13i1xE z2FK^tL}Xg}H&U!p+(AmMZ;eS6G48RVDPXh0741L^&+L3p|A`&F{C3UrNe?CP!og37 zs`Q-7*8?pMq0jCghcH=3a^Q!?5#TAGMMo|KgOYGJFZiQ(uYQDDWGt367p+)YaFT!; zwYpdu9JvPIzM3F5={j3PZwRk+vib^J{l|@L>J#su0b2u0Pv|Ko5D?Dv|8KyC_P+*f z-%~aLdwT=7e^1$TEF5+RXFof;4D%`_Z4;3oJgRjwdXr@`Zg+Wt_UB70D*-gV5KL`? zgmHhDY<9msou@?Dh-3H>ZEZ=ynUk}!PA-c*MDu6b@FuILTEE_01-vi3n+fp%d>yUa zM4An%Z&y1SmClvON7w-(Kxo}OMmaxa^k8ZKq5 zj-xB`(+=2i7i6~PWwScoasiqoR_+=JSKdLgp#8+jR3qRXa-Y z_qfAqdz18;yruIGORqi2$#hR4M)8-ng5FG)v#t{Go9#TFFOSD?Eys=$dpVzy%=CGk z0x=zw9}c~jX{)J5Z}X4k8^H_<;(F^WEZN>q9796|e9YR>uM=BsSAg>BShDOFR3458 z?6!l}LD13&?6<{ILMfFw6PJ0C;Mdqq{L1KLk1O-MX3JGp(fZQV=}2*-VcmxuU8{EC zThzKPq-0H*iEq2;DICSaw_OwvSK0Y37d@U8P?~$dd`C-~bHlZ%DRrX9pm6s}j{G41 zv9D5K-tX`ROpsLo06f&kyWB#QEfpZTN4?NTul@)-#qj0Z^1=t)P`w+0D%NCl`kLnv zU2)dQyneXLzl6G};0x-=XBS<`9?N+YtPn4}>K1T*M#7l6TKvaM21QD*w2VjNS z3L#mO_ri%Z_h@)?9~$jq@$lk*2m07OZyw_h@&3GNj@1rBGN`W}eQ=U45wz_2x4*?^ zKpZmTAI&~`0{SlJ#5XO*x%{~Q4tGj@h-X=@{(WZ}ve*8jtF)9hY@hjtFQsDv+=qIB z$uq9F#5i{RmP4{3?&}KuGd#uj0xX%djq3$&zJf^F*R9_eSCtVd5H}-K%Dp>COy@%f z4(3~t=pN z2bBx8_9_ulE=0J>Tw%eKL7%%uNw^2_`(VYu?_Vv`u&Md^fQ7`QMO>87%H9omIWJe3h8>hqdLDrtzfNTqi5Grwsy%Kw7H zmdTq1h{a--e+x$EZKq017Hr62H!w)2a?aZlBx`k=$G3&W;%+-@BoI{_OEMQAnsz4k^p}Tsm3Oub02O0*BIZ(c!-><=5zxU7GYivlw?<%D$ zd2;Ro;T=8<%*`13bh2BBt+pI?ZI-;mJzQbHI|XJJVJN8p4$KC00S?({{#Hxyj{T+6 z_e73bbGbnDyL&?R7IJtgE(`J>!Kl%U*OU+NOF} z;u*DYND zd1H7{@34U?U*ZX09hC!S;z$jeHH+1!E$F5zkDajl%a!LEleXh+=F)A?=mh2O@rX1S z{8|t|HWjBiXMp{WKgiTRzrOpV?+$!m-JL^(9IiSQD;(N0w>;%If7nnE&4HF;ZxtGmq9Y-KV0kbcPjNb=@1Y7 z++>_nFtF65;07j08z&(^r+CC3Q}1lzFS*P&6U(QL^9@Nf3{O}2EhgTXuC)N;cEJL z<{1*c=~yj`JHgoN0KhY|dMtY+$n8uKO2?khnL=^xSD;~6=5Rt(yIrTZ9QKME)VT9a zBQWGjcNkSJTAvahMeaWx>LC5^*3SYqlF!b^D@DbTXWEY7c$n1n^XB< zEd-C;F`Nn^Rl@4=%4xt+78WDULfWM%@x>>fdI#Aj0~=G*0G9TKynU!$N<}frx8YO9YGkAzXiv(3AOKg2Tqhll6;%5LohCm zyG-TIhw7*o;h{@;IwFElLt(Rn&X1Cnkkm6W1vS0!eiEtJ9y6~&w6yShd`8Jx5oA2! z4}q0&_dtus00k+o&~5N&oooX&t2rW)ySE4m_3Nxw^(3MA1^o3kOmh*~Yms;N*( z1ty4u=H}}I--v$bSf=f8A$A!e2)*^8ydJ|ckdG91H|YUiDJwg1Xd3b!}{3I4u>G+-e79l$X(6ytd7`pVM zsku0sP?Bdazq1TO6DsoE3zR{Xyzlh=kEQrzs*hRcc zvk%&DC0HBw;Os!4o%QR!!{ii*YV^k4NMa-@UZ_cMRnMAHJ}A=aP_Z!N z8A3T}7$D68e4D~55z78!NKK3??T&|_Nw30A7uYI>M}1a9qj35e@=0OPRB>KV-MGkn zz^-MxC~I7FI+~$TQMp?*g23M7p}$craDMOH_9DuOq2WVSM5(!;)KN1THax0AH#Hl{ zbDYnn19muOqcGMFgqq!qOynKB@mkJ~d!TIujMBe)$ldlY56W@9Y9x!zV*5fEni@sF zBj64)`^H(KiJB|4jeZ;mi@o@L@zP>e1B_iuQ)~~=*9TdTDRP{MMZb&9`hkS3H4H{6 zmpB#?YwsPP-v8#Xd>DaOz&2Zof&RB4xjogQZ37w*@0Z@;(GMTbk|wy-aRd0sP41^g-Hnf8-c2pRNh9}v@5 z9w}zRvdH9VS1_!~zHj*F#eGjE@cW!rg|ZM5$C?ePjim4c`1%>9iJO!cF0dJyZ6eOe zek$*;%&^H_#G}z0hWtlkW*%ch*^WyjB^tGXzXKSlUCM7T4;|MnkXvQLcmecs6`O^$ zo8W!gj%lqDW2IDX!Y#5RcSSrDE&w|v^;5$@Rm%v7*zhA=2yHNnX1@b*wHF>c_PE08 z3y4z%$2>Sgtv$qD=Tj#9Afl2gn4q|aJf^XSNBPdHghL#Y#mBZG_Zf_hSEHYYI@?V2 z^Gt3U$`hzrD>OcJo<{Jzn>xrAzcPz`o1`CuU>IiW2okahD{?^0 zVUs+`aN47cW#pB`2I{H>Vt=$%^MXZSD~=tV$QByJRmM+h!L&T>)f`37L&c`n+SWM+ z=YR-v)^Bu7w|Y}prGb) zTejAmw(GGwC|ka@I|agF-}z%g587FB2NC_cWCd+b`^%DgPP@8<4wkUV+a)}MG1}q) znz@gy$&kXD7lg_I`6+cO1ZeJ_#M{9`J|pKF96FC8Ph;O=^6b1Zu(j~7ENxM_jf}ks zO^vOP2@a7Z&P6V%$K|gZaG`e^b{?~znO|3`V^Z;}1w$@w`5Gb3;((%p)!uF=(c~E( z7UJRC%&~TbxwIs7RpeyP*LKmJXW8o_-*#$qb&;cwlIe|Ufa6!}rSn$ftOx8lRA&UY zm)`TuHN-gL66dM??D!D(Xs@5WnjD92-h38?1=VEKY9;kyIEEAFs2__i9 z-)s_9quh6>Vzu5vVOyl6uW|uA;2& zT|t0Jqpk20qgFA1MdkNE#Y)r^1cC@U3d>@zDj?j*RA5q5=~|Q3;R)g{{5tSpsVDAW z+y8dLIJ{aI)zm8T7z;aE0oKDGSNJ+Pel-F70{O2Cyxf!yXQPkr^Bk*F+TTwu(YGa| z7Cuq{q+pp8#R>Nz&roDnFefIKh=vGexrx1{2&>8A5mm*boVwC8z5}SGxysbuYV>D{B}b~BnNAf>3>6=>dA_^t(nBOh_TcAntQ{nVJ-PO_$H zeZ=)9|7Mb|wQ{VyR&G#fh+>KdT@L$$8c^l}OXLV0YeYF%P9(0~gSt!mrU96|_Kk^+$gDy`s^th>za64EySgK8 z*IJwPtazH{`RwLK%iW-@f@wDKEjyjlNF1yws`2A6&lR@(!u8+VxF$$Br>=+ag#{*V zvZMUQ#5AsIpVN7C>j1ZcqbA=nVoIP`I}FoabwmKW8DcpqFPK;#?Ng zP;)qA@4cMD!x0`Vv&TD3B2ix!x+>hLd~$Eeg0X3$q)GYh=Z9llSpY#7(=_*Emg^56 zWVZ$GUn6W3rs^66h_JoXE-If~kEQZ)Q`2?NDR}V2Q7PnNfjtk)HEx?mBbQ+oi`Y`UYD&K)~=In(`srqgXPm7g1P$}ar6RL z3TD%vDK7_mwXN2=^mHyJ8UXAK1MOf+C~fmfR@BS05hjGJHH0J@BdyApWa;)Ql*@H^ zYOVdJQ>PqTf8~P5S;GLL&vmGuY%1qkh+X|6nUMmqL{gGIx!d#c%EWOty%H@Ud22t! zcS;VDT+aDZaHy>qsI8i>vk}=RIB^@m>Y?S-GZECv&VxEtI=v7%g#e8$3(Vfam+;C> z=*ms9I9Z6}qS4$`L{PBK8ws7Z%_3rp5)<)oR+=g4zis$yWYl`u3eTH0Lw{JWp-HkK zMIKGrqb@r&(Sk3x>@Q3?u#&?vNfomY;$_;N@H&u{_eD-o4=V^7Z2RZ z-Qb+Ib~yM70HV7iDk8~2|8hQhH?bjae6=aC#)Hi>riDi5zb>4|dA4GBwkn&?M%*{a zzS0IcEG5c2>dPW;@mN$lrHUQnUJcEmYVJlsds_>9%KVb| z)QZB};=RtKd+9}3_K)9lk#8UPUST%@J{Y7w$_I>R_$Nm`MTu@sw_vwq1F}m6MNG@N zv;ok~old9M_tV%2o@@BRaxc$PqgzFq_g%l9j?!Hl(=Nt6;l>imBi9J=6vo>0TV`g~ zg0!?IMaGf20T#Pwu5IcT;YO7-Dq&>c0}i~->d-$Sx1`2F2Wqe3!_*)L>P&RIPYv;U z*9C4=g>F*c*EM0D|g{ zQVWp!V;sYlzM$i%n^-?4NRrN3k#zYG;TO7c>YpLu(sqY@H-aOU zzr{sh0YAiFlBrmV#9{7WDHR=mD@$Q5Sk4@(&ZoRP52_3|`@lK%Ye<~kD8x~{5(;Ys zx9JS1>)Zg_%-F3ALn76|vQ&}2&@eG{bIoZ_GfSnjT~sgyJ6S(q+i2Q2AGSt`JW3#N z>=5auHAv=t9U@ST5I|WW^Hn==Sh%=fqbc8H0>)^V_bDPryX>pyO@H@_NT>XB=c$52 zKo@eff=VuVS(Hp-l|7PRZvCK~w`Ntcatp_zRS2yGS@F^jpiyGtvudSW*OGh%L98pB zDo=9KbXz&jT>658vvGwWk(g-4|bD+?=RAkkC=VDU? z)M8PP+W8LD5q}bE2VV`#%_lqA*S<=6oE*(o9}?Y$?F4!*^A(RF)f`;9lc$rFjd_jL z+zs)o4Zfo(`)q=6B|b|Gw@fp$Gih{u=Vz@`Ny`MLXw*2$sls;m^ zA30jQ<^KDK9?M@NX~{u(4VQC65I^d8qCnW>S= zhg^=CL{ff}_>jsHG>@s)(`X#1x5KKad+Z|oJ0gn-Sh>N5Y?=;H&~mGG$z^5vC|e^q z2XtIPolZ_BNhH?=K>ia~5hR8>0g{NJURHV^uG2-prP*AV>g^Kr|M2w?tTesg2H-G-z+~nk>c4ePRc6Lssp0(Dq)(g#zm*Ctp zx+F{3RitxLA?fPAh&vlmk|!4Zv99UuquLmMeAYY|skK@3}&gzxb%~;zdFE%Kt&? z0MF>1PuiUe7OZUTyc~;Vn{IvH=oNyt(-1AMp{uWIh-V~_+XZ+VO265zviO{$*4dy) zj1Ct1jty^h2yyAr%mOla_|ZBdfYRTejvd$zHt(W7W)5` zZ24LUk#2~e;%NbAixpe4>Ib4eiBMkV{Q@>HPH;Dza1+qpQ^tcoF95f9oKl+$&gCst zs|X8~(a;&3G^j^v#+b{EhAP+^2T<`V__KlU#MKCXWKDX_lqMx%2A6n`1ee;+k9!e{2Ypl#VDyoB+#m+@b39v;93 zakjL_e(bxDjuJPSCqKa-#25r0vg1vHvdhaJ6;zqjT(H%OdVXP_bw)W}HAXcR&pT@7 zQ2`xRxIRAEu^T4r$TC94Ik#m`W$z#!XnMRQ9%!DYz>dY7gz-T~ab0xx@-@EiM3%A) zNRz0>Y6cfwt@57i^&-?IMyuACMJvGQZ)e*cO>U7_1Xq6K98P#rB*zeN!{Ijd9wF)jdvc)auD@w8>X(it_`)=3s#m0Pg~rXKeW&iFQmB zwRoRpC=mL=DF)D{<70d6-6%BWWE&=>ksw`>mqOmQc#-`|-JuB5QBse(6KQE3P2fE6 zAre3loeYv2#D!};@C(H@8%dywlyFnkS_ZZ5IkZxR?;itW3kW+gX5ntvya5}iH!N|w zhMr|-KhgYSGFJ}^-@A{bu-HRL7yWpL02sSmy&8O3V3>qgo{L1rv1erN+^p4&oJ1In;9-+Oi5%I5WLG;5rsIKCA zOqZf@Xq(Z3pD!Vmtt0szg7c!x4#nSx+_kG+PA!AfDFCrf;qidF|FICY?y}`)@zp&8o`ngt-FmbIvO7wZokwvpS?{k5xF}~4zfWmdWe%V*l3AO-PJYd?g-SMI4Q3(&~VqG1$ z3kN!$&;cBR`W^^*JqMwqI~L;q#A-}t9bt4_0%AkTSBCiAzrrUqBD^P4doX;3z5a-H z4$G3vB-;xAIA(9e3d{GycE8}!7vqZZRMWYO7%-i0P1IUUU4}kcb#GmT1Vk~XVka3M zw`1g^ua;~_-vUN>*0p3NpcCk;F<%@Bkg;PgLC7NIdFTW4jz{3PA#1Z-#y#<%j~FTA zAi{?l>Y!_Yv6v`oEUD-$BPAa<`dEj%9#L)jI>6nwJEFCeepe2~?sJEO?7x$}Z1h8< z0MOW1{l%{#NjEADr&KLn>7U9H#G1$o@}!yRrh~Tb_hxZ`zT;fxzM5xf-JJ8af^yj6 zqd^eJMdjH7 zuwoD#s%L!?TIFWGH51?=fP7b{>1Att5DJ^9TSC#aqY?bPqt514yaa z@)~FKJd4_rj_$Clvn&TnAz@i4#Sds4dtmx9==KcnF@3Ac8OLzPp-v0e%~8G20<<#% z8+rS3qhLS~NYngL+&@LKOMH)E8;C*Ae90A5+;WY9=qc@a1)q&j#us8YP06l_So~h~ zE`p+EUj@>A43M(j!Mxfz)7;ny0n_9R#2k>_%p=c*{E!4xuL>vR(_OJ%4qe!3#A3f6PG=?M&LFDY*5C|Gy(o4SuQQEcYhm~+lV(^)zqpowjHU|0l{vOJ3(T$ zH`hkm%grK>WNR>>5KA|U7?^D7M*S4tN9PC-r=EPY`U5MVJjT(?L2iEg*iJe+0eX

  • #K#E_mYIXdt2#}G#|$u;ktWBJmKOWRr2^y5DV1da0yh8;k=wZ!V0V4z zo#)h{BJH>lnTDNqT|mq}!+#!?)Vz_q*vT>vMhZEn#F~FOIibE~$zxbc@O33Y4PD`k z+AD9W&`Fe753lLnP-LiBMdo3A%|G)*)Szh*MN(nfnqo=*eYgA-C##=naO2PG443KD zUEztB&y|SOT|VR$vmYSc!PR=`0Nj62T&fP?trBBpS0-vI**9Y5Kd(~$0z_~RD~c0VD|f&e5LsfmNXXmw=jDEq zvw*&S^B>=7UF9|l>|=-RN(`1uw877;+P%E#_i!y{f3XMqf?=8J^hwDeYdb7t(?Xr) z3mE8@k_46`RB}?u&cypstE~xSw+(NU(WO2KG@KtGpK)`#GOn?vhG#1y_Uig+Dk}d^ zZc#9-ad7⁡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